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环境下的区别

 

posted @ 2020-12-29 11:24  波克蛋蛋  阅读(297)  评论(0编辑  收藏  举报