之前對電腦重裝了一下,結果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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/85879.html
標籤:Java
