以前备份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