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一样无法识别 < ,目前我还没找原因和解决方法。