Springboot 實現數據庫備份還原


  之前對電腦重裝了一下,結果IDEA的項目目錄沒有備份,導致有幾個平時會拿來參考的項目都丟失了,尤其有一個自己寫的Springboot項目當初沒有備份,這次是徹底無緣再見了,有的東西可以對外(開源)的還是放在博客園這些地方記錄一下比較不錯,偶爾再遇到這樣的問題Ctrl+C&Ctrl+V即可解決了。

  這回記錄一下Springboot實現對數據庫進行一個備份和通過備份數據對數據庫進行恢復。當然不限於Springboot,對數據庫備份還原中的代碼,Java 相關的都可以使用。

 

備份數據庫

  備份通過命令行對數據庫導出到指定目錄即可。我這里是一個Get請求,頁面需要展示備份文件名稱、大小和備份時間,代碼中使用的log是Slf4j,最終界面效果如圖:

 

  代碼對我的原代碼有所改動,關於備份文件的存放目錄,我配置在了application.properties配置文件中,通過一個配置類ProjectUrlConfig去獲取,代碼中的 projectUrlConfig.getBackPath() 即為文件目錄,與fileName拼接成完整的路徑。

   /* 備份數據庫 */
    @GetMapping("backupSQL")
    public ModelAndView backupSQL(Map<String, Object> map){
        String fileName = "backup_" + new Date().getTime() + ".sql";
        String cmd =  "mysqldump -uroot -p123456 dbName > " + projectUrlConfig.getBackPath() + fileName; //-u后的root為mysql數據庫用戶名,-p后接的123456為該用戶密碼,注意不要有空格;dbName填寫需要備份數據的數據庫名稱,大於號后接生成文件路徑
        try {
            Runtime.getRuntime().exec(cmd);
        }catch (Exception e){
            log.error("【備份數據庫】失敗:{}", e.getMessage());
            map.put("msg", e.getMessage());
            return new ModelAndView("common/error", map);
        }
        log.info("【備份數據庫】成功,SQL文件:{}", fileName);
        map.put("msg","備份數據庫成功");return new ModelAndView("common/success", map);
    }

 

恢復數據庫

  備份雖然在cmd命令行中使用 “mysql -uroot -p123456 dbName < SQL文件路徑 ” 可以對數據庫還原,嘗試使用時沒有發現報錯但數據庫並未還原,最后通過 OutputStreamWriter 來實現。

    @GetMapping("rollback")
    public ModelAndView rollback(@RequestParam("filename") String fileName, Map<String, Object> map){
        String path = projectUrlConfig.getBackPath() + fileName;
try { Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("mysql -uroot -p123456 --default-character-set=utf8 dbName");
OutputStream outputStream = process.getOutputStream(); FileInputStream fis = new FileInputStream(path); InputStreamReader isr = new InputStreamReader(fis, "utf-8"); BufferedReader br = new BufferedReader(isr); String str = null; StringBuffer sb = new StringBuffer(); while ((str = br.readLine()) != null) { sb.append(str + "\r\n"); } str = sb.toString(); OutputStreamWriter writer = new OutputStreamWriter(outputStream,"utf-8"); writer.write(str); writer.flush(); if(writer!=null){ writer.close(); } if(br!=null){ br.close(); } if(isr!=null){ isr.close(); } if(fis!=null){ fis.close(); } if(outputStream!=null){ outputStream.close(); } }catch (Exception e){ log.error("【還原數據庫】失敗:{}", e.getMessage()); map.put("msg", e.getMessage()); return new ModelAndView("common/error", map); } log.info("【還原數據庫】成功,還原文件:{}", fileName); map.put("msg","還原數據庫成功");return new ModelAndView("common/success", map); }

 

  以上即可對數據庫進行備份與恢復,但是也只是適用於較小的數據庫。

  參考文章:https://blog.csdn.net/duli3554197/article/details/89468758

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM