MySQL binlog server
从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