Mysql:Java代码实现数据库定时备份与还原详解

14 篇文章 0 订阅
10 篇文章 0 订阅

一、目的

  1. 使用java代码实现定时执行Mysql备份与还原。

二、思路

  1. 先写好一个定时器,每隔多少时间执行一次备份
  2. 备份方法为,通过java向命令行写入命令执行
  3. 首先在cmd中模拟备份,测试成功后
  4. 使用java代码实现数据备份功能

三、具体操作

(1) 命令行实现备份
  1. 第一次搜索的备份命令是
    mysqldump -h localhost -u root -proot --databases shop --tables sc_cart sys_admin > d:\time_2018-11-14_09-54-55.sql

  2. 输入cmd,在命令行中输入以上代码,提示:mysqldump 不是内部或外部命令
    在这里插入图片描述

  3. 于是将路径切换至mysql的bin目录下
    在这里插入图片描述

  4. 再次尝试,报错10061再次尝试,报错10061
    在这里插入图片描述

  5. 检查账号密码没有问题,多次尝试,找到原因为,默认端口号为3306,我的Mysql端口号为3307,在my.ini文件中将端口号改为3306后再次尝试

    	具体步骤
    	打开D:\Program Files\mysql5.7\mysql5.7\my.ini
    	将内容改为如下
         [mysqld]
         port = 3306
         sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
         skip-grant-tables
    
  6. 测试可正常进入数据库

  7. 测试备份命令,提示一个警告:Using a password on the command line interface
    在这里插入图片描述
    消除警告办法见文章:Mysql:备份提示Using a password on the command line interface

  8. 修改my.ini文件后,输入新命令mysqldump --defaults-extra-file=..\my.ini shop > d:\time_2018-11-14_10-08-38.sql
    在这里插入图片描述

  9. d盘下成功生成一个备份文件
    在这里插入图片描述

  10. 命令行测试成功,下一步使用Java代码实现以上功能


(2)Java代码实现备份
  1. java代码实现定时器

        /**
         * 生成备份文件
         * @throws Exception
         */
        @Scheduled(cron="0 0 1 * * ?") //每天凌晨1点执行一次
        public void backup() throws  Exception{
            System.out.println("############生成备份文件");
            doBackup();
        }
    
  2. java代码实现写入命令行

        /**
         * 执行生成备份
         */
        public static void doBackup(){
            System.out.println("现在时间是"+new Date());
            Runtime runtime = Runtime.getRuntime();  //获取Runtime实例
            String user = "root";
            String password = "root";
            String database1 = "shop"; // 需要备份的数据库名
            String table1 = "sc_cart";
            String table2 = "sys_admin";
            Date currentDate = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
            String sdfDate = sdf.format(currentDate);
            String filepath = "d:\\time_" + sdfDate + ".sql"; // 备份的路径地址
            //执行命令
            String stmt = "mysqldump  --defaults-extra-file=..\my.ini  --databases "+database1+" --tables "+table1+" "+table2 +" > "+filepath;
            System.out.println(stmt);
            try {
                String[] command = { "cmd", "/c", stmt};
                Process process = runtime.exec(command);
                InputStream input = process.getInputStream();
                System.out.println(IOUtils.toString(input, "UTF-8"));
                //若有错误信息则输出
                InputStream errorStream = process.getErrorStream();
                System.out.println(IOUtils.toString(errorStream, "UTF-8"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
  3. 执行之后,备份文件生成,但大小为0,没有写入数据
    控制台提示如下:
    在这里插入图片描述

  4. 错误命令乱码,将utf-8改为gbk,报错提示:mysqldump 不是内部或外部命令
    在这里插入图片描述

  5. 有了命令行测试的经验,原因为mysqldump路径不对,于是将mysqldump.exe考到命令行默认的位置
    在这里插入图片描述

  6. 测试依旧提示:mysqldump 不是内部或外部命令

  7. 继续测试将代码改为 String stmt = "d:\\Program Files\\mysql5.7\\mysql5.7\\bin mysqldump --defaults-extra-file=..\\my.ini "+database1+" > "+filepath;
    //将代码顺便简化,账号密码后直接跟数据库,不跟表名,直接备份整个数据库
    //若不是备份整个数据库,可使用以下代码
    //String stmt = "d:\mysqldump --defaults-extra-file=d:\my.ini " --databases “+database1+” --tables “+table1+” “+table2 +” > "+filepath;

  8. 不是内部或外部命令也可通过修改环境变量实现,具体步骤见:Mysql:设置环境变量

  9. 测试提示:
    在这里插入图片描述

  10. 这里的原因是命令行不识别空格,可将program file改为progra~1;
    也可将mysqldump.exe考到d盘根目录下,我这里使用第二种方法;
    代码改为
    String stmt = "d:\\mysqldump --defaults-extra-file=d:\\my.ini "+database1+" > "+filepath;
    测试无报错,备份文件生成,数据写入成功。

  11. 最后将成功的代码贴在下面

       /**
        * 执行生成备份
        */
       public static void doBackup(){
           System.out.println("现在时间是"+new Date());
           Runtime runtime = Runtime.getRuntime();  //获取Runtime实例
           String database1 = "shop"; // 需要备份的数据库名
           Date currentDate = new Date();
           SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
           String sdfDate = sdf.format(currentDate);
           String filepath = "d:\\time_" + sdfDate + ".sql"; // 备份的路径地址
           //执行命令
           String stmt = "d:\\mysqldump  --defaults-extra-file=d:\\my.ini "+database1+" > "+filepath;
           System.out.println(stmt);
           try {
               String[] command = { "cmd", "/c", stmt};
               Process process = runtime.exec(command);
               InputStream input = process.getInputStream();
               System.out.println(IOUtils.toString(input, "UTF-8"));
               //若有错误信息则输出
               InputStream errorStream = process.getErrorStream();
               System.out.println(IOUtils.toString(errorStream, "gbk"));
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
    
  12. 还原代码
    注意:命令行中执行的是mysql不是mysqldump

    	    /**
    	     * 还原数据库
    	     */
    	    public static void restore() {
    	        String database = "shop"; // 需要备份的数据库名
    	        System.out.println("现在时间是" + new Date());
    	        Runtime runtime = Runtime.getRuntime();
    	        try {
    	            String filePath =  "D:\\time_31.sql"; // sql文件路径
    	            String stmt = "d:\\mysql  --defaults-extra-file=d:\\my.ini "+database+"< " + filePath;
    	            System.out.println(stmt);
    	            String[] command = {"cmd", "/c", stmt};
    	            Process process = runtime.exec(command);
    	            //若有错误信息则输出
    	            InputStream errorStream = process.getErrorStream();
    	            System.out.println(IOUtils.toString(errorStream, "gbk"));
    	            //等待操作
    	            int processComplete = process.waitFor();
    	            if (processComplete == 0) {
    	                System.out.println("还原成功.");
    	            } else {
    	                throw new RuntimeException("还原数据库失败.");
    	            }
    	        } catch (Exception e) {
    	            e.printStackTrace();
    	        }
    	    }
    	```
    
    
    
  13. 若不将mysqldump移至D盘根目录,也可以将mysql的bin目录配置在环境变量中

    前面步骤完成后安装好MySQL,为MySQL配置环境变量。MySQL默认安装在C:\Program Files下。

    1)新建MYSQL_HOME变量,并配置:C:\Program Files\MySQL\MySQL Server 5.6

    MYSQL_HOME:C:\Program Files\MySQL\MySQL Server 5.6

    2)编辑path系统变量,将%MYSQL_HOME%\bin添加到path变量后。配置path环境变量,也可不新建MYSQL_HOME变量,而是直接将MySQL安装目录下的bin配置到path变量下,即:C:\Program
    Files\MySQL\MySQL Server 5.6\bin

    Path:%MYSQL_HOME%\bin

    或Path:C:\Program Files\MySQL\MySQL Server 5.6\bin

参考文章:

https://www.aliyun.com/jiaocheng/1121105.html
https://blog.csdn.net/babylove_BaLe/article/details/78953584

  • 12
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
可以使用以下步骤来实现Java语言备份MySQL数据库: 1. 导入MySQL JDBC驱动程序 Java程序需要使用MySQL JDBC驱动程序来连接和操作MySQL数据库。可以从MySQL官方网站下载并导入驱动程序。 2. 创建连接 使用JDBC驱动程序创建与MySQL数据库的连接。可以使用以下代码来创建连接: ``` String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/mydatabase"; String user = "root"; String password = "mypassword"; Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, password); ``` 其中,`driver`是JDBC驱动程序的类名,`url`是连接字符串,`user`和`password`是数据库的用户名和密码。 3. 执行备份命令 使用Java程序执行备份命令。可以使用以下代码来执行备份命令: ``` String backupPath = "/path/to/backup.sql"; String command = "mysqldump --opt --user=" + user + " --password=" + password + " --host=localhost mydatabase > " + backupPath; Process process = Runtime.getRuntime().exec(command); int exitStatus = process.waitFor(); if(exitStatus == 0) { System.out.println("Backup successful"); } else { System.out.println("Backup failed"); } ``` 其中,`backupPath`是备份文件的路径,`command`是备份命令。使用`Runtime.getRuntime().exec()`方法执行命令,并使用`process.waitFor()`方法等待命令执行完成。 4. 关闭连接 备份完成后,使用Java程序关闭与MySQL数据库的连接。可以使用以下代码来关闭连接: ``` conn.close(); ``` 这些步骤可以实现Java语言备份MySQL数据库。需要注意的是,备份命令需要正确设置MySQL用户名、密码、主机和数据库名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值