MySQL 中很少提及日志的备份,但日志备份也是非常重要,可以恢复到指定时间点。日志备份可以使用自带的工具 mysqlbinlog 进行备份,mysqlbinlog 也是解析 binlog 的工具。
相关参考: Using mysqlbinlog to Back Up Binary Log Files
示例:
# 备份指定 binlog 文件(备份的文件名有前缀 "prefix_"). 如备份文件 mysql-bin.000011
mysqlbinlog --host=localhost --port=3306 --user=root --password=mysql \
--raw --read-from-remote-server mysql-bin.000011 --result-file=/home/git/binlog/prefix_
# 备份指定 binlog 文件(无前缀只指定目标路径). 如备份文件 mysql-bin.000009 和 mysql-bin.000011
mysqlbinlog --host=localhost --port=3306 --user=root --password=mysql \
--raw --read-from-remote-server mysql-bin.000009 mysql-bin.000011 --result-file=/home/git/binlog/
# 备份到最新的 binlog 日志后停止. 从文件 mysql-bin.000010 开始备份到最后
mysqlbinlog --host=localhost --port=3306 --user=root --password=mysql \
--raw --read-from-remote-server --to-last-log mysql-bin.000010 --result-file=/home/git/binlog/
# 持续备份 binlog 日志. 从文件 mysql-bin.000010 开始备份到最后
mysqlbinlog --host=localhost --port=3306 --user=root --password=mysql \
--raw --read-from-remote-server --stop-never mysql-bin.000010 --result-file=/home/git/binlog/
备份脚本:
#!/bin/bash
# Author: huangzecheng
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER="root"
MYSQL_PASS="mysql"
SLEEP_RECONN=30
BACKUP_DIR=/home/git/binlog/
BACKUP_BIN=/usr/local/mysql/bin/mysqlbinlog
MYSQL_OPTIONS="--host=${MYSQL_HOST} --port=${MYSQL_PORT} --user=${MYSQL_USER} --password=${MYSQL_PASS}"
while :
do
echo "`date +'%F %T'` Getting the latest binlog filename."
LOGBIN_BASENAME=$(mysql $MYSQL_OPTIONS -se "SHOW VARIABLES WHERE VARIABLE_NAME = 'log_bin_basename';" 2>/dev/null | awk '{print $2}')
if [ ! -z "$LOGBIN_BASENAME" ]
then
LOGBIN_NAME=$(basename $LOGBIN_BASENAME)
else
echo "`date +'%F %T'` Binary log is not enabled! exit!"
exit 0
fi
if [ `ls -1 $BACKUP_DIR | grep $LOGBIN_NAME | wc -l` -eq 0 ]
then
LOGBIN_LAST="$LOGBIN_NAME.000001"
else
LOGBIN_LAST=`ls -1 $BACKUP_DIR | grep $LOGBIN_NAME | tail -n 1`
fi
echo "`date +'%F %T'` Starting live binlog backup from the latest file : $LOGBIN_LAST."
$BACKUP_BIN $MYSQL_OPTIONS $LOGBIN_LAST --raw --read-from-remote-server --stop-never --result-file=$BACKUP_DIR 2>/dev/null
echo "`date +'%F %T'` mysqlbinlog exited with $? trying to reconnect in $SLEEP_RECONN seconds."
sleep $SLEEP_RECONN
done