章
目
录
之前潘老师写了一篇关于MySQL数据库定时备份脚本代码实现的文章,这篇文章其实主要是mysql数据库实现定时全备,但往往实际开发中,我们既需要全备,也需要增量备份。而增量备份,一般我们会通过binlog日志的方式来实现。下面潘老师来介绍下如何结合脚本通过binlog来实现定时增量备份。
前期准备
1)什么是binlog日志?
binlog日志由配置文件的 log-bin
选项负责启用,MySQL服务器将在数据根目录(默认data目录)创建两个新文 件xxx-bin.000001
和xxx-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: command not found
,我们可以将mysqladmin命令路径补全为全路径就可以了,这个命令也在mysql的bin目录下,自己找一下就可以了。然后我们这里还将脚本的输出都写入到binlog_backup.log
这个日志文件里去了。
最后给大家看下运行的日志输出:
总结
以上就是mysql通过binlog定时增量备份脚本实现的全部内容,整体而言还是非常简单的。