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

  • 相关阅读:
    day50——前端简介、标签分类、常用标签
    day46——约束条件、表与表建 关系、修改表的完整语法
    day45——存储引擎、数据类型、约束条件
    day44——存储数据的发展、数据库分类、mysql
    Ⅰ:计算机核心基础
    Ⅶ:基本数据类型及内置方法
    Ⅶ:作业
    Ⅵ:深浅copy
    Ⅵ:流程控制
    Ⅳ:运算符
  • 原文地址:https://www.cnblogs.com/fangwr/p/14205531.html
Copyright © 2020-2023  润新知