zoukankan      html  css  js  c++  java
  • 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环境下的区别

  • 相关阅读:
    5.数组的使用,最值和反转
    4.下标越界及小结
    3.数组的三种初始化及简单内存分析
    html5版 音乐播放器
    百度网盘搜索
    HTML5扩展之微数据与丰富网页摘要
    Java 学习文章汇总
    业余草
    Catalan数
    Luogu P3004 [USACO10DEC]宝箱Treasure Chest
  • 原文地址:https://www.cnblogs.com/fangwr/p/14205531.html
Copyright © 2011-2022 走看看