用java实现MySql的全备与增量备份

数据库全备与增量备份

1数据库备份简介

  • 增量备份

      增量备份 是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件。这就意味着,第一次增量备份的对象是进行全备后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量备份后所产生的增加和修改的文件,如此类推。这种备份方式最显著的优点就是:没有重复的备份数据,因此备份的数据量不大,备份所需的时间很短。但增量备份的数据恢复是比较麻烦的。您必须具有上一次全备份和所有增量备份磁带(一旦丢失或损坏其中的一个增量,就会造成恢复的失败),并且它们必须沿着从全备份到依次增量备份的时间顺序逐个反推恢复,因此这就极大地延长了恢复时间。 假如我们有一个数据库,有20G的数据,每天会增加10M的数据,数据库每天都要全量备份一次,这样的话服务器的压力比较大,因此我们只需要备份增加的这部分数据,这样减少服务器的负担。
    
  • binlog简介

    MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。一般来说开启binlog日志大概会有1%的性能损耗。

    :增量备份是基于binlog日志实现的。

2 环境准备

windows系统下:

  1. 开启binlog日志

修改 MySQL 的配置文件my.ini如下:

[mysqld]
log-bin=E:\logsql\my-bin
binlog_format=Mixed

binlog-do-db=#需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可
binlog-ignore-db=#不需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可

MySql的配置文件在其安装路径下:

在这里插入图片描述

打开后在其中添加即可:

在这里插入图片描述

:配置指定路径时,文件名称不要以sql开头,会造成路径查找失败或者mysql服务重启失败

  1. 重启MySql服务

    重新启动后,binlog配置生效

在这里插入图片描述

3、查看logbin日志是否开启

执行sql命令,log_bin显示为ON则为开启。

 show variables like 'log_bin%'

在这里插入图片描述

3 JAVA实现MySql备份

思路:用jdk提供的Runtime的exec()方法方法操作本地系统的cmd命令。

全备实现:

#cmd执行sql全备命令
mysqldump -u`账号` -p`密码` `数据库名称` > `保存的路径`
#例子
mysqldump -uroot -p123456 see_monitor > E:/logsql/seemonitor.sql

备份数据库中的某一个表:

#cmd执行的单表全备命令
mysqldump -u`账号` -p`密码` `数据库名称` `表名称` > `保存的路径`
#例子
mysqldump -uroot -p123456 see_monitor equipment > E:/logsql/seemonitor_equipment.sql
//java代码实现
 public void Win_dbBackup() throws Exception {
        //全备命令
        String cmd = "cmd /c mysqldump -uroot -p123456 see_monitor > E:/logsql/seemonitor.sql";
        java.lang.Process process = Runtime.getRuntime().exec(cmd);//执行语句
        process.waitFor();//等待上述命令执行完毕后打印下面log
        System.out.println(process.exitValue());
        System.out.println("数据库备份结束,备份结果:{}" + (process.exitValue() == 0 ? "success" : "fail"));
        if (process.exitValue() == 0) {
            //刷新一次日志
            String cmd1 = "cmd /c mysqladmin -uroot -p123456 flush-logs";
            java.lang.Process process2 = Runtime.getRuntime().exec(cmd);//执行语句
            process2.waitFor();//等待上述命令执行完毕后打印下面log
            System.out.println("数据库日志刷新结果:{}" + (process2.exitValue() == 0 ? "success" : "fail"));
        }

    }

增量备份只需要刷新binlog日志即可:

  public void zenbei_dbBackup() throws Exception {
        //增量备份
        String cmd = "cmd /c mysqladmin -uroot -p123456 flush-logs";
        java.lang.Process process = Runtime.getRuntime().exec(cmd);//执行语句
        process.waitFor();//等待上述命令执行完毕后打印下面log
        System.out.println(process.exitValue());
        System.out.println("数据库备份结束,备份结果:{}" + (process.exitValue() == 0 ? "success" : "fail"));
    }

因为binlog日志会随着备份的增加而增多,所有可以定时进行binlog日志的清除。

#自动删除binlog
#通过binlog参数(expire_logs_days )来实现mysql自动删除binlog

mysql> show binary logs;
mysql> show variables like 'expire_logs_days';      //该参数表示binlog日志自动删除/过期的天数,默认值为0,表示不自动删除
mysql> set global expire_logs_days=3;        //表示日志保留3天,3天后就自动过期。

#手工删除binlog
mysql> reset master;        //删除master的binlog,即手动删除所有的binlog日志
mysql> reset slave;          //删除slave的中继日志
mysql> purge master logs before '2012-03-30 17:20:00';         //删除指定日期以前的日志索引中binlog日志文件
mysql> purge master logs to 'binlog.000002';       //删除指定日志文件的日志索引中binlog日志文件

mysql> set sql_log_bin=1/0;       //如果用户有super权限,可以启用或禁用当前会话的binlog记录
mysql> show master logs;          //查看master的binlog日志列表
mysql> show binary logs;           //查看master的binlog日志文件大小
mysql> show master status;     //用于提供master二进制日志文件的状态信息
mysql> show slave hosts;        //显示当前注册的slave的列表。不以--report-host=slave_name选项为开头的slave不会显示在本列表中

mysql> flush logs;     //产生一个新的binlog日志文件

为了安全性,可以将全备数据和binlog日志进行转储其他服务器进行灾难备份。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这里是一个自动化全备增量备份MySQL8的脚本,基于您之前的要求进行修改: ``` #!/bin/bash # 设置备份相关的变量 MYSQL_USER="your_username" MYSQL_PASSWORD="your_password" BACKUP_DIR="/path/to/backup/directory" DATE=$(date +%F_%H-%M-%S) FULL_BACKUP_INTERVAL=7 # 满备份间隔(天) LAST_FULL_BACKUP=$(find $BACKUP_DIR -maxdepth 1 -name "full_backup*" | sort -nr | head -n 1) # 上一次的全量备份 INCREMENTAL_BACKUP_DIR="$BACKUP_DIR/incremental_backup_$DATE" LATEST_INCREMENTAL_BACKUP=$(find $BACKUP_DIR -maxdepth 1 -name "incremental_backup_*" | sort -nr | head -n 1) # 最新的增量备份 # 创建增量备份目录 mkdir -p $INCREMENTAL_BACKUP_DIR # 运行增量备份命令 if [ -z "$LAST_FULL_BACKUP" ]; then # 如果没有全量备份,则进行全量备份 xtrabackup --backup --user=$MYSQL_USER --password=$MYSQL_PASSWORD --target-dir=$INCREMENTAL_BACKUP_DIR else # 如果已有全量备份,则进行增量备份 xtrabackup --backup --user=$MYSQL_USER --password=$MYSQL_PASSWORD --target-dir=$INCREMENTAL_BACKUP_DIR --incremental-basedir=$LATEST_INCREMENTAL_BACKUP fi # 判断是否需要进行全量备份 if [ -z "$LAST_FULL_BACKUP" ] || [ $(expr $(date +%s) - $(date -d $(basename $LAST_FULL_BACKUP | cut -d '_' -f 3) +%s)) -ge $(expr $FULL_BACKUP_INTERVAL \* 86400) ]; then # 如果没有全量备份或者距离上次全量备份已经超过满备份间隔,则进行全量备份 FULL_BACKUP_DIR="$BACKUP_DIR/full_backup_$DATE" mkdir -p $FULL_BACKUP_DIR xtrabackup --backup --user=$MYSQL_USER --password=$MYSQL_PASSWORD --target-dir=$FULL_BACKUP_DIR fi # 删除过期的备份 find $BACKUP_DIR -maxdepth 1 -name "full_backup*" -mtime +$FULL_BACKUP_INTERVAL -exec rm -rf {} \; find $BACKUP_DIR -maxdepth 1 -name "incremental_backup_*" -mtime +$FULL_BACKUP_INTERVAL -exec rm -rf {} \; ``` 该脚本与之前的脚本基本相同,但增加了一个判断来确定是运行全备份还是增量备份: ``` if [ -z "$LAST_FULL_BACKUP" ]; then # 如果没有全量备份,则进行全量备份 xtrabackup --backup --user=$MYSQL_USER --password=$MYSQL_PASSWORD --target-dir=$INCREMENTAL_BACKUP_DIR else # 如果已有全量备份,则进行增量备份 xtrabackup --backup --user=$MYSQL_USER --password=$MYSQL_PASSWORD --target-dir=$INCREMENTAL_BACKUP_DIR --incremental-basedir=$LATEST_INCREMENTAL_BACKUP fi ``` 请将`your_username`和`your_password`替换为您的MySQL用户名和密码,将`/path/to/backup/directory`替换为您希望存储备份的目录。运行脚本时,将其保存为`.sh`文件并添加执行权限,然后在命令行中运行即可。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值