MySQL BINLOG Server

alt

雷锋做了好事不留名,但是每一件事情都记到日记里面。

前言

MySQL Binlog Server: 它使用 mysqlbinlog 命令以 daemon 进程的方式模拟一个 slaveIO 线程与主库连接,可以很方便地即时同步主库的 binlog,以便弥补定时备份策略中最近一次备份到下一次备份完成之前这段时间内的数据容易丢失的问题。

做好 MySQL 日志的备份,是数据安全的一个重要保证。以前通过写程序来实现,从 MySQL 5.6 出现以后,可以使用 mysqlbinlog 命令实现,不用写程序了。

权限

创建复制账号

1
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl';

1
2
3
mysql 5.7
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'
1
FLUSH PRIVILEGES;

创建BINLOG SERVER

1
# mysqlbinlog -R --raw --host='192.168.199.230' --port=3306 --user='repl' --password='unixfbi' --stop-never --stop-never-slave-server-id=2313306 mysql-bin.000001 --result-file=/data/mysql/mysql3306/logs/ &

命令参数介绍:

  • -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 的值指定文本存放的目录和文件名。

注意:
使用–raw 连接 master 时,以 4k 为单位写入磁盘。并不能实时写入磁盘。那么不够 4k 时,binlog server 什么时候才会把日志写入磁盘呢?

有两种情况:

第一:binlog server 和主库断开时,
第二:master 执行 flush logs 都会实时把日志写入磁盘。

mysqlbinlog raw 有一个 4k 的 Buffer ,够 4k 就发车。

设置 mysqlbinlog 为守护进程

如果 master 重启的话,binlog server 上的 mysqlbinlog 进程就会退出,所以我们写个脚本把 mysqlbinlog 设置为守护进程方式运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash 
BACKUP_BIN=/usr/local/mysql/bin/mysqlbinlog
LOCAL_BACKUP_DIR=/data/mysql/mysql3306/logs/
BACKUP_LOG=/tmp/backup.log
REMOTE_HOST=192.168.199.230
REMOTE_PORT=3306
REMOTE_USER=repl
REMOTE_PASS=unixfbi
FIRST_BINLOG=mysql-bin.000001
SLAVE_SERVER_ID=2313306
# wait for 10s
SLEEP_SECONDS=10
cd ${LOCAL_BACKUP_DIR}

while :
do
if [ `ls -A "${LOCAL_BACKUP_DIR}" |wc -l` -eq 0 ];then
LAST_FILE=${FIRST_BINLOG}
else
LAST_FILE=`ls -l ${LOCAL_BACKUP_DIR} |tail -n 1 |awk '{print $NF}'`
fi
${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}
echo "`date +"%Y/%m/%d %H:%M:%S"` mysqlbinlog is stoped,return code: $?" | tee -a ${BACKUP_LOG}
echo "${SLEEP_SECONDS}s will continue !" | tee -a ${BACKUP_LOG}
sleep ${SLEEP_SECONDS}
done

执行脚本

1
# nohup binlog_cp.sh &

参考

UnixFBI 运维特工

-------------本文结束感谢您的阅读-------------

本文标题:MySQL BINLOG Server

文章作者:Wang Jiemin

发布时间:2019年04月03日 - 16:04

最后更新:2019年04月03日 - 16:04

原始链接:https://jiemin.wang/2019/04/03/mysql-binlog-server/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%