从5.6版本开始,可以利用 mysqlbinlog命令把远程机器的日志备份到本地目录,这样就更加方便快捷的实现一个binlog server。
常用的参数
-R | –read-from-remote-server
表示开启binlog备份,在对应的主节点上请求binlog到本地。
–raw
被复制过来的binlog以二进制的格式存放,如果不加该参数则为text格式。
-r | –result-file
指定目录或文件名:
若指定了–raw参数,-r的值指定binlog的存放目录和文件名前缀;若没有指定–raw参数,-r的值指定文本存放的目录和文件名。
-t
这个选项代表从指定的binlog开始拉取,直到当前主节点上binlog的最后一个。
–stop-never
持续连续从主节点拉取binlog,持续备份到当前最后一个,并继续下去。该参数包含-t
–stop-never-slave-server-id
默认值65535,用于在多个mysqlbinlog进程或者从服务器的情况下,避免ID冲突。
mysql-bin.***
代表从哪个日志开始备份。
操作如下:
创建一个binlog的备份目录:
mkdir -p /data/mysql_binlog_server/10.10.10.100/
如下命令即可:
nohup mysqlbinlog --raw -R --stop-never --stop-never-slave-server-id=1003306 --host=10.10.10.100 --port=3306 --user=root --password=chengce243 mysql-bin.000001 --result-file=/data/mysql_binlog_server/10.10.10.100/ &
脚本如下:
#/bin/bash
#
MYSQLBINLOG=/bin/mysqlbinlog
LOCAL_BACKUP_DIR=/backup/binlogbackup/192.168.1.100/
REMOTE_HOST=192.168.1.100
SERVER_ID=7100862
REMOTE_USER=root
REMOTE_PORT=3307
REMOTE_PWD=123456
LOCAL_BACKUP_BINLOG=$(ls ${LOCAL_BACKUP_DIR}|grep "mysql-bin"|tail -n 2|head -n 1)
REMOTE_BINLOG=$(mysql --host=${REMOTE_HOST} --user=${REMOTE_USER} --password=${REMOTE_PWD} --port=${REMOTE_PORT} -e 'show binary logs'|grep -v "Log_name"|grep -v "Logging"|grep -v "Using a password on the command line interface can be insecure"|awk '{print $1}'|head -n 1)
if [[ -n "${LOCAL_BACKUP_BINLOG}" ]] ; then
FIRST_BINLOG=${LOCAL_BACKUP_BINLOG}
else
FIRST_BINLOG=${REMOTE_BINLOG}
fi
nohup ${MYSQLBINLOG} --raw -R --stop-never --stop-never-slave-server-id=${SERVER_ID} --host=${REMOTE_HOST} --port=${REMOTE_PORT} --user=${REMOTE_USER} --password=${REMOTE_PWD} ${FIRST_BINLOG} --result-file=${LOCAL_BACKUP_DIR} &
监控脚本如下:
#/bin/bash
#
HOST_LIST=(
"192.168.1.100"
"192.168.1.101"
"192.168.1.102"
"192.168.1.103"
)
REMOTE_USER=root
REMOTE_PORT=3307
REMOTE_PWD=123456
BACKUP_DIR="/backup/binlogbackup"
for var in ${HOST_LIST[@]};do
# 处理不是 3307 的端口号
if [[ ${var} = "192.168.1.102" || ${var} = "192.168.1.103" ]] ; then
REMOTE_PORT=3306
else
:
fi
PROCESS_LIST=$(ps -ef|grep mysqlbinlog|grep -v "grep"|grep "${var}" )
LOCAL_BACKUP_DIR="${BACKUP_DIR}/${var}/"
LOCAL_BACKUP_BINLOG=$(ls ${LOCAL_BACKUP_DIR}|grep "mysql-bin"|tail -n 1)
REMOTE_BINLOG=$(mysql --host=${var} --user=${REMOTE_USER} --password=${REMOTE_PWD} --port=${REMOTE_PORT} -e 'show binary logs' 2>/dev/null |grep -v "Log_name"|grep -v "Logging"|grep -v "Using a password on the command line interface can be insecure"|awk '{print $1}'|tail -n 1)
# 判断本地备份的 binglog是否落后于MySQL实例的
# 判断标准为,本地备份目录下的最后一个是否和MySQL实例 show binary logs 输出的最后一个相等
if [[ ${LOCAL_BACKUP_BINLOG} = ${REMOTE_BINLOG} ]];then
:
else
echo "ERROR!!! ${var} LOCAL binlog 缺失"
fi
# 判断备份列表 HOST_LIST 变量中的主机是否在 ps -ef|grep mysqlbin对应输出的进程中
if [[ -n "${PROCESS_LIST}" ]] ; then
:
else
echo "ERROR!!! ${var} processlist is down"
fi
done