備份數據庫
備份通過命令行對數據庫導出到指定目錄即可。我這里是一個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 + "rn");
} 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);
}
以上即可對數據庫進行備份與恢復,但是也只是適用于較小的數據庫。