乐趣区

关于mysql优化:MySQL-binlog-远程备份方法详解

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

退出移动版