mysql通过binlog定时增量备份脚本实现

Java技术 潘老师 2年前 (2022-03-01) 1392 ℃ (0) 扫码查看

之前潘老师写了一篇关于MySQL数据库定时备份脚本代码实现的文章,这篇文章其实主要是mysql数据库实现定时全备,但往往实际开发中,我们既需要全备,也需要增量备份。而增量备份,一般我们会通过binlog日志的方式来实现。下面潘老师来介绍下如何结合脚本通过binlog来实现定时增量备份。

前期准备

1)什么是binlog日志?

binlog日志由配置文件的 log-bin 选项负责启用,MySQL服务器将在数据根目录(默认data目录)创建两个新文 件xxx-bin.000001xxx-bin.index,若配置选项没有给出文件名,Mysql将使用主机名称命名这两个文件,其中.index文件包含一份全体日志文件的清单。

Mysql会把用户对所有数据库的内容和结构的修改情况记入xxx-bin.n文件,而不会记录 SELECT和没有实际更新的UPDATE语句。当MySQL数据库停止或重启时,服务器会把日志文件记入下一个日志文件,Mysql会在重启时生成一个新的binlog日志文件,文件序号递增,此外,如果日志文件超过max_binlog_size系统变量配置的上限时,也会生成新的日志文件。

2)检查是否开启binlog

在开始增量备份之前,我们需要检查mysql是否开开启了binlog日志,可以登录mysql,通过如下指令查看:

mysql> show variables like '%log_bin%';
+---------------------------------+----------------------------------------+
| Variable_name                   | Value                                  |
+---------------------------------+----------------------------------------+
| log_bin                         | ON                                     |
| log_bin_basename                | /home/mysql/mysql/data/mysql-bin       |
| log_bin_index                   | /home/mysql/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF                                    |
| log_bin_use_v1_row_events       | OFF                                    |
| sql_log_bin                     | ON                                     |
+---------------------------------+----------------------------------------+

如果log_bin的value值为ON则表示开启了,如果是OFF,则需要到my.cnf配置文件中的mysqld节点下新增log-bin=mysql-bin的配置,当然这里mysql-bin是自己定义的值,表示logbin的文件名,你可以根据自己需求指定到某个目录下。然后再重启mysql即可。

定时增量备份binlog

下面我们进入重点,就是使用脚本来定时增量备份binlog日志数据。具体代码如下(涉及到的文件夹目录请自行先建好):

#!/bin/bash
# 设置mysql的登录用户名和密码(根据实际情况填写)
mysql_user="***"
mysql_password="***"
mysql_port="3306"
#增量备份时复制mysql-bin.00000*的目标目录,提前手动创建这个目录
backup_dir=/home/mysql/backup/binlog
#mysql的index文件路径(依据自己的)
binlog_dir=/home/mysql/data
binlog_index=$binlog_dir/mysql-bin.index
# 判断mysql实例是否正常运行
welcome_msg="start backup binlog, please wait..."
mysql_ps=`ps -ef |grep mysql |wc -l`
mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`
if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then
        echo "$(date +'%Y-%m-%d %H:%M:%S'): ERROR:MySQL is not running! backup stop!"
        exit
else
        echo "$(date +'%Y-%m-%d %H:%M:%S'): $welcome_msg"
fi
#这个是用于产生新的mysql-bin.00000*文件(mysqladmin路径可以写全最好)
mysqladmin -u$mysql_user -p$mysql_password flush-logs
# wc -l 统计行数
# awk 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
Counter=`wc -l $binlog_index |awk '{print $1}'`
NextNum=0
CopyNum=0
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
for file in `cat $binlog_index`
do
    #basename用于截取mysql-bin.00000*文件名,去掉类似./mysql-bin.000005前面的./
    base=`basename $file`
    NextNum=`expr $NextNum + 1`
    # 跳过最新正在使用的日志
    if [ $NextNum -eq $Counter ]
    then
        echo `date +"%Y-%m-%d %H:%M:%S":` $base skip!
    else
        dest=$backup_dir/$base
        if(test -e $dest)
        #test -e用于检测目标文件是否存在,存在就写exist!到$logFile去
        then
            echo `date +"%Y-%m-%d %H:%M:%S":` $base exist!
        else
            cp $binlog_dir/$base $backup_dir
            CopyNum=`expr $CopyNum + 1`
            echo `date +"%Y-%m-%d %H:%M:%S":` $base copyed!
         fi
     fi
done
echo `date +"%Y-%m-%d %H:%M:%S":` $CopyNum new binlogs backup success!

实现定时备份

最后我们需要定时任务,这里使用crontab的方式,需要配置如下:

#执行如下命令
crontab -e

然后新增如下定时配置:

#mysql binlog定时备份,这里每天从0点开始每隔4小时执行一次
0 0-23/4 * * * /home/mysql/script/mysqlbinlog_backup.sh >> /home/mysql/backup/log/binlog_backup.log
提示:脚本在定时执行时可能会和上面的全量备份出现同一个情况,就是mysqladmin指令找不到,即查看cron执行日志时发现提示mysqladmin: command not found,我们可以将mysqladmin命令路径补全为全路径就可以了,这个命令也在mysql的bin目录下,自己找一下就可以了。

然后我们这里还将脚本的输出都写入到binlog_backup.log这个日志文件里去了。
最后给大家看下运行的日志输出:
binlog定时增量备份日志

总结

以上就是mysql通过binlog定时增量备份脚本实现的全部内容,整体而言还是非常简单的。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/4598.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】