Binlog Server 介绍 :
MySQL在5.6 以后支持该功能. 他利用mysqlbinlog, 命令以daemon进程的方式模拟IO thread进程连接master ,进而实现远程备份 MySQL的日志的功能
优点:
他可以轻松的帮你实时备份出一份二进制格式的日志.他可以指定备份日志文件的范围(mysql-bin.00004 至 mysql-bin.00099).也可以持续的实时更新,比如追上了master最近日志后,master产生新日志依然可以继续进行备份
缺点(限制):
当发生连接中断时,他不想MySQL的主从 那种会有重连机制,因此你需要配置监控机制.
在5.7.19版本以前,mysqlbinlog 不承诺能获取到所有的event.即使是配置了sync_binlog=1.因此mysqlbinlog可能对丢失一些最新的事物,因此在备份的时候你可以在master进行flush binary logs
mysqlbinlog会存在着一定的延迟
只能备份master主机上现有的binlog日志
特别注意
1.在使用binglog server的raw格式进行复制的时,binlogserver是以4K的大小写入磁盘的
并不是实时写道log中,因此会和master log上存在写入的延后,但是当和主库断开,
或者flush logs,都会实时写到磁盘中
2.一定要使用—raw参数,否则会以文本的形式写到日志中,这样将导致无法使用其进行恢复
则会失去意义
3. 该服务不需要启动mysql服务也可以使用binlog server
权限需求
grant replication slave on *.* to 'binlogserver'@'172.0.0.33';
参数介绍
-R —read-from-remote-server :表示从远程机器上读取 binlog,要确保远程 mysql 存储,需要提供—host, —user, —password 参数; 使用该选项时,mysqlbinlog 会伪装成一个 slave,连接读取,请求指定的 binlog file,主库获取接收到这个请求之后就创建一个 binlog dump 线程推送 binlog 给 mysqlbinlog server。
—raw: 以 binlog 格式存储日志,方便后期使用;
—host: 远程库的主机 IP 或者主机名;
—port: 远端库的端口号;
—user: 远程库上用于复制的账号;
—password: 远端库上复制账号的密码;
—stop-never: 一直连接到远程的 server 上读取 binlog 日志,直接到远程的 server 关闭后才会退出。或是被 pkill 掉;
—stop-never-slave-server-id: 如果需要启动多个 binlog server ,需要给 binlog server 指定 server-id 。如果需要启动多个 binlog server,需要给 binlog server 指定 server-id(默认是 65535),可以利用 —stop-never-slave-server-id 变更;
mysql-bin.0000001 这个日志名表示从那个日志开始读取;
—result-file: 指定存储到本地的目录,注意后缀需要加上/,否则 mysqlbinlog 命令会认为是保存文件的前缀。若指定了—raw 参数,-r 的值指定 binlog 的存放目录和文件名前缀;若没有指定—raw 参数,-r 的值指定文本存放的目录和文件名。
—to-last-log :声明备份到哪个日志停止。如果使用了—stop-never 则会忽略该参数
—defaults-file: 这个用的的本地的my.conf
mysqlbinlog server部署
| IP | PORT | 角色 |
|---|---|---|
| 172.0.0.10 | 3306 | master |
| 172.0.0.15 | binlogserver 服务器 |
Master 操作:
创建用户并赋权
create user 'archer'@'172.0.0.15' identified by 'archer';
grant replication slave on *.* to 'archer'@'172.0.0.15';
flush privileges;
在binlogserver 服务器操作
(172.0.0.15 )
注意点;
1 如果是第一次进行binlogserver 搭建,master可能会有好几天的binlog 且不是第一个binlog(mysql-bin.000001),如果你指定的是服务器上现有的第一个binlog开始进行备份,很有可能会把公司的带宽打满,因此需要先将除了最后一个binlog 的其他binlog先限速(如scp )传到日志备份中心. 然后指定最后一个日志
2 关于 binlogserver 的server_id ,more是65533 ,因此如果不指定server_id,多个server_id将会冲突
mysqlbinlog --raw -R --stop-never --host=172.0.0.10 --port=3306 --user=archer --password=archer --stop-never --stop-never-slave-server-id=65534 mysql-bin.000010 --result-file=/data/mysql_backup/binlog_backup/172.0.0.10/ &
主库查看连接状况
mysql> show processlist;
+--------+----------------+--------------------+------+-------------+---------+---------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+----------------+--------------------+------+-------------+---------+---------------------------------------------------------------+------------------+
| 951518 | logserver_user | 172.0.0.15:22066 | NULL | Binlog Dump | 86644 | Master has sent all binlog to slave; waiting for more updates | NULL |
| 986292 | root | localhost | NULL | Query | 0 | starting | show processlist |
+--------+----------------+--------------------+------+-------------+---------+---------------------------------------------------------------+------------------+
2 rows in set (0.00 sec
使用binlogserver 进行恢复
个人博客中其他文章有介绍:
各种恢复姿势 :利用binlogserver恢复单表实验
**
配置BinlogServer 守护进程
我们可以自己写个脚本进行实时监控mysqlbinlog 进程是否存活,若有异常时间自动重启的功能
#!/bin/bash
BACKUP_BIN=/usr/local/mysql/bin/mysqlbinlog
LOCAL_BACKUP_DIR=/data/mysql_backup/binlog_backup/172.0.0.10/
BACKUP_LOG=/home/binlog_monitor/log/backup.log
REMOTE_HOST=172.0.0.10
REMOTE_PORT=3306
REMOTE_USER=archer
REMOTE_PASS=archer
FIRST_BINLOG=mysql-bin.000002
SLAVE_SERVER_ID=65534
# wait for 10s
SLEEP_SECONDS=10
while :
do
cd ${LOCAL_BACKUP_DIR}
flag=`ps -ef|grep mysqlbinlog|grep $REMOTE_HOST|grep -v grep |wc -l`
if [ $flag -eq 0 ]; then
if [ `ls -A "${LOCAL_BACKUP_DIR}" |wc -l` -eq 0 ];then
LAST_FILE=${FIRST_BINLOG}
else
LAST_FILE=`ls -ltrh ${LOCAL_BACKUP_DIR} |tail -n 1 |awk '{print $NF}'`
fi
echo "`date +"%Y/%m/%d %H:%M:%S"` $REMOTE_HOST mysqlbinlog is stoped,return code: $?" | tee -a ${BACKUP_LOG}
${BACKUP_BIN} --raw -R --stop-never --host=${REMOTE_HOST} --port=${REMOTE_PORT} --user=${REMOTE_USER} --password=${REMOTE_PASS} --stop-never --stop-never-slave-server-id=${SLAVE_SERVER_ID} ${LAST_FILE} --result-file=${LOCAL_BACKUP_DIR} &
sleep ${SLEEP_SECONDS}
restar_flag=`ps -ef|grep mysqlbinlog|grep $REMOTE_HOST|grep -v grep |wc -l`
echo $restar_flag
if [ $restar_flag -eq 1 ]; then
echo "`date +"%Y/%m/%d %H:%M:%S"` $REMOTE_HOST restart ok" | tee -a ${BACKUP_LOG}
fi
sleep ${SLEEP_SECONDS}
else
sleep ${SLEEP_SECONDS}
continue
fi
done
运行脚本
sh moni_binlog_server.sh &
参考文档
http://www.unixfbi.com/291.html#4
https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog-backup.html
https://dev.mysql.com/doc/refman/5.6/en/mysqlbinlog-backup.html
