zoukankan      html  css  js  c++  java
  • Java代码实现备份和恢复Mysql数据库

    以下写的是Windows环境下,不过Linux环境下区别也不大,路径改下就好

    import java.io.*;
    import java.net.URL;
     
    public class DatabaseTool {
     
        public static void main(String[] args) {
     
            try {
                if (exportDatabase("127.0.0.1","3306","root","root",
                        "C:\reyo\backupDatabase","test-20190516.sql","test")
                ){
                    System.out.println("数据库成功备份");
                }else {
                    System.out.println("数据库备份失败");
                }
     
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
     
            if (importDatabase("127.0.0.1", "3306", "root", "root",
                    "C:\reyo\backupDatabase", "test-20190516.sql", "test")) {
                System.out.println("数据库导入成功");
            } else {
                System.out.println("数据库导入失败");
            }
        }
     
        /**
         * Mysql数据库导出
         * @param hostIP 数据库地址
         * @param hostPort 端口
         * @param userName 用户名
         * @param password 密码
         * @param savePath 导出路径
         * @param fileName 导出文件名
         * @param databaseName 要导出数据库名
         * @return
         * @throws InterruptedException
         */
        public static boolean exportDatabase(String hostIP, String hostPort, String userName, String password, String savePath,
                                                 String fileName, String databaseName) throws InterruptedException {
            //目录不存在则新建
            File saveFile = new File(savePath);
            if (!saveFile.exists()) {
                saveFile.mkdirs();
            }
     
            //在地址后补充系统默认分隔符
            if (!savePath.endsWith(File.separator)) {
                savePath = savePath + File.separator;
            }
     
            PrintWriter printWriter = null;
     
            BufferedReader bufferedReader = null;
     
            try {
                Runtime runtime = Runtime.getRuntime();
     
                //因为我的地址有空格,为解决找不到路径所以用了这个方式
                URL url = new URL("file:C:\reyo\develop software\mysql-5.6.41-winx64\bin");
                String path = url.getPath();
     
                //"mysqldump -h127.0.0.1 -uroot -P3306 -proot test"
                String cmd = "\mysqldump -h" + hostIP + " -u" + userName + " -P" + hostPort + " -p" + password + " " + databaseName;
     
                cmd = path + cmd;
                Process process = runtime.exec(cmd);
     
                InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), "utf8");
                bufferedReader = new BufferedReader(inputStreamReader);
     
                printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(savePath + fileName), "utf8"));
                String line;
     
                while ((line = bufferedReader.readLine()) != null) {
                    printWriter.println(line);
                }
                printWriter.flush();
                if (process.waitFor() == 0) {
                    return true;
                }
     
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (bufferedReader != null) {
                        bufferedReader.close();
                    }
                    if (printWriter != null) {
                        printWriter.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return false;
        }
     
        /**
         * 导入Mysql数据库
         * @param hostIP 数据库地址
         * @param hostPort 端口
         * @param userName 用户名
         * @param password 密码
         * @param importFilePath 数据库文件路径
         * @param sqlFileName 要导入的文件名
         * @param databaseName 要导入的数据库名
         * @return
         * @throws InterruptedException
         */
        public static boolean importDatabase(String hostIP, String hostPort, String userName, String password, String importFilePath,
                                                 String sqlFileName, String databaseName) {
            File imporFile = new File(importFilePath);
            if (!imporFile.exists()) {
                imporFile.mkdirs();
            }
     
            if (!importFilePath.endsWith(File.separator)) {
                importFilePath = importFilePath + File.separator;
            }
     
            //mysql -h127.0.0.1 -uroot -P3306 -p test<C:
    eyoackupDatabase
            try {
                Process process = Runtime.getRuntime().exec("cmd /C" + "mysql -h"+hostIP+" -P"+hostPort+" -u"+userName+" -p"+password+" "+databaseName+"<"+importFilePath+sqlFileName);
                if (process.waitFor()==0){
                    return true;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e){
                e.printStackTrace();
            }
            return false;
        }
    }

    不过这种方法有个缺陷就是部署程序的机器要安装MySQL,如我本地C:\reyo\develop software\mysql-5.6.41-winx64\bin目录就是MySQL路径。
    手动备份恢复数据库也写一下

    备份数据库时在mysql安装目录的bin目录下执行以下命令即可
    mysqldump -h127.0.0.1 -P3306 -uroot -proot test>C: eyoackupDatabase est-20190516.sql
    这句的含义是备份地址127.0.0.1端口3306用户root密码root数据库test的数据到C: eyoackupDatabase目录下重命名为test-20190516.sql

    恢复数据库时不需要规定目录,执行以下命令即可
    mysql -h127.0.0.1 -P3306 -uroot -proot test<C: eyoackupDatabase est-20190516.sql
    这句的含义是把C:/reyo/backupDatabase est-20190516.sql文件内容恢复到地址127.0.0.1端口3306用户root密码root的数据库test中

    需要注意-proot可能报警告,只写-p就可以正常运行。

    此外修改my.cnf(或my.ini)文件配置

    [mysqldump]password=root

    [mysql]password=root

    也可以去除警告

  • 相关阅读:
    梦想还需有,因它必实现——发现最新版iOS漏洞,OverSky团队专访
    细数iOS上的那些安全防护
    互联网业务安全之通用安全风险模型
    TaintDroid剖析之IPC级污点传播
    Android安全开发之通用签名风险
    Angular问题02 创建模块失败、 angular-cli名称问题、升级angular-cli
    Etyma01 ced ceed cess
    Angular19 自定义表单控件
    Angular18 RXJS
    Angular17 Angular自定义指令
  • 原文地址:https://www.cnblogs.com/interdrp/p/14094447.html
Copyright © 2011-2022 走看看