1. 程式人生 > 實用技巧 >Window環境下Java備份和恢復Mysql資料

Window環境下Java備份和恢復Mysql資料

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一樣無法識別 < ,目前我還沒找原因和解決方法。

三、參考資料

  Process詳解

  MySQL之mysqldump的使用

  Mysql日誌詳解

  mysql備份命令Windows環境下與Linux環境下的區別