Window環境下Java備份和恢復Mysql資料
阿新 • • 發佈:2020-12-29
Window環境下Java備份和恢復Mysql資料
一、dos視窗中操作
1、備份資料
mysqldump -u使用者名稱 -p密碼 資料庫名 > 匯出檔案路徑 例如:mysql -uroot -p 123456 mydb > D:\mydb.db
2、恢復資料
(1)建立資料庫
mysqladmin -u使用者名稱 -p密碼 create 資料庫名(注:若刪除了資料庫需要執行這一步建立資料庫)
例如:mysqladmin -uroot -p123456 create mydb
(2)恢復資料
mysql -u使用者名稱 -p密碼 資料庫名 < 檔案路徑
例如:mysql -uroot -p123456 mydb < D:\mydb.db
二、Java呼叫dos命令備份和恢復Mysql資料
建立一個執行緒類來不停地來讀出Process呼叫指令碼的輸出資料,防止緩衝區被緩衝資料塞滿而執行緒阻塞
1 public class CleanInputCatche extends Thread { 2 private InputStream inputStream; 3 4 public CleanInputCatche(InputStream inputStream) { 5 this.inputStream = inputStream; 6 } 7 8 public void run() { 9 try { 10 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "gbk")); 11 String line = null; 12 while ((line = reader.readLine()) != null) { 13 System.out.println(line);14 } 15 } catch (IOException e) { 16 e.printStackTrace(); 17 } 18 } 19 }
1、備份資料
1 ProcessBuilder processBuilder = new ProcessBuilder(); 2 processBuilder.redirectErrorStream(true); 3 4 //備份資料庫 5 List<String> backupDBCommands = new ArrayList<>(); 6 backupDBCommands.add("cmd"); 7 backupDBCommands.add("/c"); 8 backupDBCommands.add("mysqldump"); 9 backupDBCommands.add("-uroot"); 10 backupDBCommands.add("-padmin"); 11 backupDBCommands.add("mydb"); 12 backupDBCommands.add(">"); 13 backupDBCommands.add("D:\\mydb.db"); 14 Process process = processBuilder.command(backupDBCommands).start(); 15 new CleanInputCatche(process.getInputStream()).start(); 16 process.waitFor();
2、恢復資料
1 ProcessBuilder processBuilder = new ProcessBuilder(); 2 processBuilder.redirectErrorStream(true); 3 4 //建立資料庫 5 List<String> createDBCommands = new ArrayList<>(); 6 createDBCommands.add("cmd"); 7 createDBCommands.add("/c"); 8 createDBCommands.add("mysqladmin"); 9 createDBCommands.add("-uroot"); 10 createDBCommands.add("-padmin"); 11 createDBCommands.add("create"); 12 createDBCommands.add("mydb"); 13 Process createDBProcess = processBuilder.command(createDBCommands).start(); 14 new CleanInputCatche(createDBProcess.getInputStream()).start(); 15 createDBProcess.waitFor(); 16 17 //恢復資料 18 List<String> recoverCommands = new ArrayList<>(); 19 recoverCommands.add("cmd"); 20 recoverCommands.add("/c"); 21 recoverCommands.add("mysql"); 22 recoverCommands.add("-uroot"); 23 recoverCommands.add("-padmin"); 24 recoverCommands.add("mydb"); 25 recoverCommands.add("<"); 26 recoverCommands.add("d:\\mydb.db"); 27 processBuilder.command(recoverCommands); 28 Process recoverProcess = processBuilder.start(); 29 new CleanInputCatche(recoverProcess.getInputStream()).start(); 30 recoverProcess.waitFor();
"cmd /c"命令意思是是,執行命令後關閉視窗,c代表close,相對應的命令是"cmd /k",意思是執行完命令後保持視窗開啟狀態,k代表keep
3、遇到的問題:
(1)在資料庫的備份過程中,如果去掉"cmd /c",則Java無法識別 > ,會將其當作table。
解決方法:可以使用 -r 去代替 > 也可完成資料庫的備份。如:mysqldump -uroot -p123456 mydb -r D:\\mydb.db
(2)在資料庫的恢復過程中,如果去掉"cmd /c",Java一樣無法識別 < ,目前我還沒找原因和解決方法。