Write by lyc at 2020-8-20
binlog备份服务——binlog server
binlog_server

1.binlog Server

原理

mysqlbinlog 会伪装成一个slave连接读取,请求指定的binlog file,主库获取接收到这个请求之后就创建一个binlog dump线程推送binlog给mysqlbinlog server。

进程启动后可以根据show processlist;查看到

注意点

  • mysql master进程退出后,binlog server进程也会退出
  • mysql5.6 在mysqlbinlog命令执行结束时追加rollback语句 但是5.7没有这个问题需要注意下

优点

最好准备一台机器进行线上binlog的统一收集,这样有几个好处:

  • 易于管理部署,包括日志本身和进程管理
  • 利用开源工具进行binlog解析时可以减少dump时间
  • 统一进行收集时要做好之前binlog与日期对应的记录,这样在恢复之前,能找到对应的binlog
  • 做好binlog_server的进程监控

2.binlog Server 参数解析

1
$ mysqlbinlog --read-from-remote-server --raw --host=${MYSQL_HOST} --port=${MYSQL_PORT} --user=${MYSQL_SLAVE_USER} --password=${MYSQL_SLAVE_PASSWORD} --stop-never-slave-server-id=${MYSQL_SERVER_ID} --stop-never ${LAST_BINLOG} &
  • -R, --read-from-remote-server 从远端拉binlog,不加会在本地找
  • --raw 本地以二进制方式保存binlog,若不指定则会以文本形式保存
    • 指定了--raw 数据不会时时落盘,而是先 保存到内存里,然后每4k刷盘一次,一旦连接断开,内存中数据马上都刷到磁盘上
    • 不指定--raw,则需要用 --result-file 参数指定数据写入某个文本,不可指定为目录,此时数据会时时刷盘
  • --stop-never 持续连续从主节点拉取binlog,持续备份到当前最后一个,并继续下去。
  • --stop-never-slave-server-id 默认值65535,用于在多个mysqlbinlog进程或者从服务器的情况下,避免SERVER_ID冲突。
  • ${LAST_BINLOG} 从master上的哪一个binlog文件开始同步,在主库上执行 show binary LOGS;查看binlog日志列表,测试的时候可以在主库执行 FLUSH LOGS; 切割binlog日志,查看是否被同步成功。

3.binlog Server 脚本

binlogServer_192.168.xxx.xxx_3306.sh

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
27
28
29
30
31
32
33
34
35
$ cat binlogServer_192.168.xxx.xxx_3306.sh 
#!/bin/sh
## MySQL binlog Server, Write by lyc at 2020-8-20
MYSQL_HOST="192.168.xxx.xxx"
MYSQL_PORT="3306"
MYSQL_SLAVE_USER="xxxxxxxxxx"
MYSQL_SLAVE_PASSWORD="xxxxxxxxxxxx"
MYSQL_SERVER_ID="3306224"
FIRST_BINLOG="log-bin-3306.012061"
MYSQL_CMD="/usr/local/mysql/bin/mysqlbinlog"
BINLOG_SAVE_PATH="/data/ftp/mysql_binlog/${MYSQL_HOST}/${MYSQL_PORT}"
RUN_LOG="${BINLOG_SAVE_PATH}/runlog.log"
SLEEP_SECOND=10

function main(){
i=1
while ((i<3))
do
[ -d ${BINLOG_SAVE_PATH} ] || mkdir -p ${BINLOG_SAVE_PATH}
cd ${BINLOG_SAVE_PATH}
if [ `ls -A "${BINLOG_SAVE_PATH}" |wc -l` -eq 0 ];then
LAST_BINLOG=${FIRST_BINLOG}
else
LAST_BINLOG=`ls -l ${BINLOG_SAVE_PATH} | grep log-bin |tail -n 1 |awk '{print $9}'`
fi
${MYSQL_CMD} --read-from-remote-server --raw --host=${MYSQL_HOST} --port=${MYSQL_PORT} --user=${MYSQL_SLAVE_USER} --password=${MYSQL_SLAVE_PASSWORD} --stop-never-slave-server-id=${MYSQL_SERVER_ID} --stop-never ${LAST_BINLOG}

echo "`date +"%Y-%m-%d %H:%M:%S"` [ERROR]: mysqlbinlog停止,返回代码:$?" | tee -a ${RUN_LOG}
echo "`date +"%Y-%m-%d %H:%M:%S"` [INFO]: ${SLEEP_SECOND}秒后再次连接并继续备份" | tee -a ${RUN_LOG}
sleep ${SLEEP_SECOND}
((i++))
done
}

main

开机自启动

1
2
$ chmod +x /etc/rc.d/rc.local
$ echo 'cd /root/tdserver/binlogServer && /usr/bin/sh binlogServer_192.168.xxx.xxx_3306.sh' >> /etc/rc.local