binlog server搭建实验

 
在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查看全部参数。

 


 

你可能感兴趣的:(mysql备份,mysql复制)