以前备份 binlog 时,都是先在本地进行备份压缩,而后发送到近程服务器中。然而这其中还是有肯定危险的,因为日志的备份都是周期性的,如果在某个周期中,服务器宕机了,硬盘损坏了,就可能导致这段时间的 binlog 就失落了。
而且,以前用脚本对近程服务器进行备份的形式,有个毛病:无奈对 MySQL 服务器以后正在写的二进制日志文件进行备份。所以,只能等到 MySQL 服务器全副写完能力进行备份。而写完一个 binlog 的工夫并不固定,这就导致备份周期的不确定。
从 MySQL5.6 开始,mysqlbinlog 反对将近程服务器上的 binlog 实时复制到本地服务器上。
mysqlbinlog 的实时二进制复制性能并非简略的将近程服务器的日志复制过去,它是通过 MySQL 5.6 颁布的 Replication API 实时获取二进制事件。站长博客实质上,就相当于 MySQL 的从服务器。与一般服务器相似,主服务器产生事件后,个别都会在 0.5~1 秒内进行备份。
备份命令
复制代码 代码如下:
mysqlbinlog –read-from-remote-server –raw –host=192.168.244.145 –port=3306 –user=repl –password=repl –stop-never mysql-bin.000001
解释如下:
–read-from-remote-server:用于备份近程服务器的 binlog。如果不指定该选项,则会查找本地的 binlog。
–raw:binlog 日志会以二进制格局存储在磁盘中,如果不指定该选项,则会以文本模式保留。
–user:复制的 MySQL 用户,只须要授予 REPLICATION SLAVE 权限。
–stop-never:mysqlbinlog 能够只从近程服务器获取指定的几个 binlog,也可将一直生成的 binlog 保留到本地。指定此选项,代表只有近程服务器不敞开或者连贯未断开,mysqlbinlog 就会一直的复制近程服务器上的 binlog。
mysql-bin.000001:代表从哪个 binlog 开始复制。
除了以上选项外,还有以下几个选项须要留神:
–stop-never-slave-server-id:在备份近程服务器的 binlog 时,mysqlbinlog 实质上就相当于一个从服务器,该选项就是用来指定从服务器的 server-id 的。默认为 -1。
–to-last-log:代表 mysqlbinlog 不仅可能获取指定的 binlog,还能获取其后生成的 binlog,获取完了,才终止。如果指定了 –stop-never 选项则会隐式关上 –to-last-log 选项。
–result-file:用于设置近程服务器的 binlog,保留到本地的前缀。譬如对于 mysql-bin.000001,如果指定 –result-file=/test/backup-,则保留到本地后的文件名为 /test/backup-mysql-bin.000001。留神:如果将 –result-file 设置为目录,则肯定要带上目录分隔符“/”。譬如 –result-file=/test/,而不是 –result-file=/test,不然保留到本地的文件名为 /testmysql-bin.000001。
有余:
这个形式有个问题,对于惯例的主从复制来说,如果主从间接的连贯断开了,则从会主动再次连贯,而对于 mysqlbinlog,如果断开了,并不会主动连贯。
解决方案:
可通过脚本来补救上述有余。
!/bin/sh
BACKUP_BIN=/usr/bin/mysqlbinlog
LOCAL_BACKUP_DIR=/backup/binlog/
BACKUP_LOG=/backup/binlog/backuplog
REMOTE_HOST=192.168.244.145
REMOTE_PORT=3306
REMOTE_USER=repl
REMOTE_PASS=repl
FIRST_BINLOG=mysql-bin.000001
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