在MySQL 5.6以后,可以利用mysqlbinlog这个命令去把远程机器的日志备份到本地目录,从而达到增量或是日志安全方面的备份。做好MySQL日志的备份,是数据安全的一个重要保证。
一.基本环境信息
版本:10.0.20-MariaDB-log
数据文件和redo log位置:/data/mysql/mysql3376/data
bing log位置:/data/mysql/mysql3376/logs
binlog server:mvxl0783 10.16.24.108
mysql主机:mvxl0782 10.16.24.107
配置文件:/data/mysql/mysql3376/my3376.cnf
二.如何实现将远程binlog文件传到binglog server上
在远程mysql主机上查看binlog文件:
[mysql@mvxl0782 mysql3376]$ cd /data/mysql/mysql3376/logs
[mysql@mvxl0782 logs]$ ls -ltr
total 614424
-rw-rw---- 1 mysql mysql 209715200 Apr 24 17:05 ib_logfile2
-rw-rw---- 1 mysql mysql 5600 May 17 16:51 mysql-bin.000069
-rw-rw---- 1 mysql mysql 350 May 20 11:25 mysql-bin.000070
-rw-rw---- 1 mysql mysql 209715200 May 21 14:25 ib_logfile1
-rw-rw---- 1 mysql mysql 209715200 May 21 14:25 ib_logfile0
-rw-rw---- 1 mysql mysql 167 May 21 14:26 mysql-bin.000071
-rw-rw---- 1 mysql mysql 120 May 21 14:26 mysql-bin.000072
-rw-rw---- 1 mysql mysql 176 May 21 14:26 mysql-bin.index
在本机binlog server上查看binlog文件:
[mysql@mvxl0783 local]$ cd /data/mysql/mysql3376/logs
[mysql@mvxl0783 logs]$ ls -ltr
total 614408
-rw-rw-r-- 1 mysql mysql 209715200 May 17 16:39 ib_logfile2
-rw-rw-r-- 1 mysql mysql 209715200 May 17 16:39 ib_logfile1
-rw-rw---- 1 mysql mysql 44 May 17 16:52 mysql-bin.index
-rw-rw---- 1 mysql mysql 4059 May 17 17:05 mysql-bin.000001
-rw-rw-r-- 1 mysql mysql 209715200 May 17 17:05 ib_logfile0
在binlog server上执行如下命令:
mysqlbinlog -R --raw --host=10.16.24.107 --user='repl' --password='replsafe' -P 3376 --stop-never mysql-bin.000069
另开一个窗口查看binlog server上获取的binlog文件情况:
[root@mvxl0783 logs]# ls -ltr
total 614432
-rw-rw-r-- 1 mysql mysql 209715200 May 17 16:39 ib_logfile2
-rw-rw-r-- 1 mysql mysql 209715200 May 17 16:39 ib_logfile1
-rw-rw---- 1 mysql mysql 44 May 17 16:52 mysql-bin.index
-rw-rw---- 1 mysql mysql 4059 May 17 17:05 mysql-bin.000001
-rw-rw-r-- 1 mysql mysql 209715200 May 17 17:05 ib_logfile0
-rw-rw---- 1 mysql mysql 357 May 21 14:33 aw
-rw-rw---- 1 mysql mysql 4 May 21 14:35 mysql-bin.000072
-rw-rw---- 1 mysql mysql 167 May 21 14:35 mysql-bin.000071
-rw-rw---- 1 mysql mysql 350 May 21 14:35 mysql-bin.000070
-rw-rw---- 1 mysql mysql 5600 May 21 14:35 mysql-bin.000069
上面文件同步过来了。
三.问题延伸
上面方式有个问题,对于常规的主从复制来说,如果主从直接的连接断开了,则从会自动再次连接,而对于mysqlbinlog,如果断开了,并不会自动连接。
我们写脚本来实现:
cd /data/mysql/mysql3376
vi binlog_cp.sh
#!/bin/sh
BACKUP_BIN=/usr/local/mysql/bin/mysqlbinlog
LOCAL_BACKUP_DIR=/data/mysql/mysql3376/logs/backup
BACKUP_LOG=/data/mysql/mysql3376/logs/backup/backuplog
REMOTE_HOST=10.16.24.107
REMOTE_PORT=3376
REMOTE_USER=repl
REMOTE_PASS=replsafe
FIRST_BINLOG=mysql-bin.000069
#time to wait before reconnecting after failure
SLEEP_SECONDS=10
##create local_backup_dir if necessary
##mkdir -p ${LOCAL_BACKUP_DIR}
cd ${LOCAL_BACKUP_DIR}
## 运行while循环,连接断开后等待指定时间,重新连接
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} | grep -v backuplog |tail -n 1 |awk '{print $9}'`
fi
${BACKUP_BIN} --raw --read-from-remote-server --stop-never --host=${REMOTE_HOST} --port=${REMOTE_PORT} --user=${REMOTE_USER} --password=${REMOTE_PASS} ${LAST_FILE}
echo "`date +"%Y/%m/%d %H:%M:%S"` mysqlbinlog停止,返回代码:$?" | tee -a ${BACKUP_LOG}
echo "${SLEEP_SECONDS}秒后再次连接并继续备份" | tee -a ${BACKUP_LOG}
sleep ${SLEEP_SECONDS}
done
运行脚本后,binlog同步过来了。
[mysql@mvxl0783 backup]$ pwd
/data/mysql/mysql3376/logs/backup
[mysql@mvxl0783 backup]$ ls -ltr
total 20
-rw-rw---- 1 mysql mysql 4 May 21 14:58 mysql-bin.000072
-rw-rw---- 1 mysql mysql 167 May 21 14:58 mysql-bin.000071
-rw-rw---- 1 mysql mysql 350 May 21 14:58 mysql-bin.000070
-rw-rw---- 1 mysql mysql 5600 May 21 14:58 mysql-bin.000069
四.测试验证
我们先删除上面的mysql-bin.000072,再将mysql server关闭。
10.16.24.108主机上:
[mysql@mvxl0783 backup]$ rm mysql-bin.000072
[mysql@mvxl0783 backup]$ ls
mysql-bin.000069 mysql-bin.000070 mysql-bin.000071
10.16.24.107主机上:
[mysql@mvxl0782 logs]$ mysqladmin -uroot -psafe_2016 -S /tmp/mysql3376.sock shutdown
Warning: Using a password on the command line interface can be insecure.
[1]+ Done mysqld --defaults-file=/data/mysql/mysql3376/my3376.cnf (wd: ~)
(wd now: /data/mysql/mysql3376/logs)
10.16.24.108主机上执行脚本,并显示连接不上mysql:
[mysql@mvxl0783 mysql3376]$ ./binlog_cp.sh
Warning: Using a password on the command line interface can be insecure.
ERROR: Failed on connect: Can't connect to MySQL server on '10.16.24.107' (111)
2016/05/21 15:04:01 mysqlbinlog停止,返回代码:0
10秒后再次连接并继续备份
Warning: Using a password on the command line interface can be insecure.
ERROR: Failed on connect: Can't connect to MySQL server on '10.16.24.107' (111)
2016/05/21 15:04:11 mysqlbinlog停止,返回代码:0
10秒后再次连接并继续备份
Warning: Using a password on the command line interface can be insecure.
ERROR: Failed on connect: Can't connect to MySQL server on '10.16.24.107' (111)
2016/05/21 15:04:21 mysqlbinlog停止,返回代码:0
10秒后再次连接并继续备份
Warning: Using a password on the command line interface can be insecure.
ERROR: Failed on connect: Can't connect to MySQL server on '10.16.24.107' (111)
2016/05/21 15:04:31 mysqlbinlog停止,返回代码:0
10.16.24.107主机上启动mysql:
[mysql@mvxl0782 logs]$ mysqld --defaults-file=/data/mysql/mysql3376/my3376.cnf &
[1] 27383
[mysql@mvxl0782 logs]$ 2016-05-21 15:04:36 0 [Note] mysqld (mysqld 5.6.29-log) starting as process 27383 ...
10.16.24.108主机上看到有连接到Mysql:
10秒后再次连接并继续备份
Warning: Using a password on the command line interface can be insecure.
查看到删除的mysql-bin.000072同步回来了,并且mysql重启切换log新产生的mysql-bin.000073也过来了。
[mysql@mvxl0783 backup]$ ls -ltr
total 28
-rw-rw---- 1 mysql mysql 350 May 21 14:58 mysql-bin.000070
-rw-rw---- 1 mysql mysql 5600 May 21 14:58 mysql-bin.000069
-rw-rw-r-- 1 mysql mysql 372 May 21 15:04 backuplog
-rw-rw---- 1 mysql mysql 4 May 21 15:04 mysql-bin.000073
-rw-rw---- 1 mysql mysql 143 May 21 15:04 mysql-bin.000072
-rw-rw---- 1 mysql mysql 167 May 21 15:04 mysql-bin.000071
五.命令用法
-R –read-from-remote-server 表示从远程机器上读取binlog,要确保远程mysql存储,需要提供-host, -user, -password参数
-raw 以binlog格式存储日志,方便后期使用
-stop-never 一直连接到远程的server上读取日志,直接到远程的server关闭后才会退出。或是被pkill掉
mysql-bin.0000001 这个日志名表示从那个日志开始读取
如果需要启动多个binlog server,需要给binlog server指定server-id(默认是65535),可以利用 -stop-never-slave-server-id变更
启动一个server-id为1的binlog server:
/usr/local/mysql/bin/mysqlbinlog -R --raw --host=192.168.11.100 --user='repl' --password='repl4slave' --stop-never --stop-never-slave-server-id=1 mysql-bin.000003
启动一个server-id为2的binlog server:
/usr/local/mysql/bin/mysqlbinlog -R --raw --host=192.168.11.100 --user='repl' --password='repl4slave' --stop-never --stop-never-slave-server-id=2 mysql-bin.000003
使用mysqlbinlog --help查看全部参数。