MySQL备份数据都是MySQL备份+binlog,这样才能保证数据的完整性。下面就是利用mysqlbinlog搭建mysql binlog server,可以把binlog传到远程存储上。
试验环境
MySQL binlog 源服务器:10.72.16.112
MySQL binlog server目的服务器:10.72.16.50
因为需要把10.72.16.112的binlog传到10.72.16.50上,在10.72.16.50执行
mysqlbinlog –read-from-remote-server –raw –host=10.72.16.112 –port=3306 –user=repl –password=密码 –stop-never mysql-bin.000006
参数说明如下:
–read-from-remote-server:用于备份远程服务器的binlog。如果不指定该选项,则会查找本地的binlog。
–raw:binlog日志会以二进制格式存储在磁盘中,如果不指定该选项,则会以文本形式保存。
–user:复制的MySQL用户,只需要授予REPLICATION SLAVE权限。
–stop-never:mysqlbinlog可以只从远程服务器获取指定的几个binlog,也可将不断生成的binlog保存到本地。指定此选项,代表只要远程服务器不关闭或者连接未断开,mysqlbinlog就会不断的复制远程服务器上的binlog。
mysql-bin.000006:代表从哪个binlog开始复制,一般会从mysql-bin.000001开始
–stop-never-slave-server-id:在备份远程服务器的binlog时,mysqlbinlog本质上就相当于一个从服务器,该选项就是用来指定从服务器的server-id的。默认为-1。
–to-last-log:代表mysqlbinlog不仅能够获取指定的binlog,还能获取其后生成的binlog,获取完了,才终止。如果指定了–stop-never选项则会隐式打开–to-last-log选项。
提示:备份的目录是命令所运行的目录
有个问题就是mysqlbinlog断掉后,只能重新运行并指定从哪个binlog开始同步。写个shell监控mysqlbinlog进程,如下:
#!/bin/bash
# 将日期记入日志
date
# 由于磁盘空间有限,删除3天前的binlog
find /root/70_binlogs/ -name “mysql-bin*” -mtime +3 -exec rm -rf {} \;
# 找到最新的binlog名字
binlogfile=`ls -lthr /root/70_binlogs|tail -n1|awk ‘{print $NF}’`
# 判断mysqlbinlog进程是否存在,如果不存在就重启mysqlbinlog
ps -ef|grep -w mysqlbinlog|grep -v grep
if [[ $? = 0 ]];then
echo “mysqlbinglog process is ok.”
else
echo “mysqlbinglog process is not work.”
cd /root/70_binlogs
if [[ $? = 0 ]];then
/usr/local/mysql/bin/mysqlbinlog –read-from-remote-server –raw –host=IP –port=3307 –user=user –password=password –stop-never $binlogfile &
else
echo “mysqlbinglog command excute fail.”
exit
fi
fi
加入crontab,每分钟执行一次
[root@test1 ~]
# crontab -l
# mysqlbinlog server monitor
*/1 * * * * sh /root/mysqlbinlog_check.sh >> /tmp/mysqlbinlog_server.log