【实用脚本】使用mysqlbinlog部署binlog server实时同步binlog

TangLu 未命名 2020-05-28 5310 0

一、MySQL binlog server部署

1、binlog server作用

通过mysqlbinlog工具可以部署binlog server,实现实时拉取指定数据库实例上的binlog日志到本地进行统一存储,通过脚本化可以自动判断正确的binlog,无需手动指定同步文件,如果发生异常后还有通过邮件进行通知(邮件服务需自己部署)。可应用于数据增量备份、MHA binlog server


2、mysqlbinlog常用选项介绍

--read-from-remote-server:用于备份远程服务器的binlog。如果不指定该选项,则会查找本地的binlog。
--raw:binlog日志会以二进制格式存储在磁盘中,如果不指定该选项,则会以文本形式保存。
--user:用哪个MySQL用户进行binlog的复制,该用户只需要授予REPLICATION SLAVE权限。
--stop-never:mysqlbinlog可以只从远程服务器获取指定的几个binlog,也可将不断生成的binlog保存到本地。指定此选项则代表远程服务器不关闭或者连接未断开就持续进行binlog的复制

--to-last-log:mysqlbinlog工具不仅能够获取指定的binlog,还能持续获取后面更新的binlog。该选项在指定--stop-never后会自动打开
mysql-bin.000001:代表从哪个binlog开始复制


3、脚本内容

#!/bin/sh
MYSQL_BIN=/usr/local/mysql/bin/mysql
BACKUP_BIN=/usr/local/mysql/bin/mysqlbinlog
LOCAL_BACKUP_DIR=/data/mysql_binlog_backup/public/binlog
BACKUP_LOG=/data/mysql_binlog_backup/public/backuplog

REMOTE_HOST=10.3.0.221
REMOTE_PORT=3306
REMOTE_USER='binlog_backup'
REMOTE_PASS='binlog_backup'
SERVER_ID='3023401'
FIRST_BINLOG=`${MYSQL_BIN}  -uroot -p123456 -h${REMOTE_HOST} -P${REMOTE_PORT} -e "show master status;" 2> /dev/null | grep "mysql-bin" | awk '{print $1}'`

#create local_backup_dir if necessary
mkdir -p ${LOCAL_BACKUP_DIR}
cd ${LOCAL_BACKUP_DIR}

if [ `ls -A "${LOCAL_BACKUP_DIR}" | wc -l` -eq 0 ];then
  LASTFILE=${FIRST_BINLOG}
else
  LASTFILE=`ls -al ${LOCAL_BACKUP_DIR} | tail -n 1 | awk '{print $9}'`
fi
echo 'Starting binlog backup'
${BACKUP_BIN} -h${REMOTE_HOST} -P${REMOTE_PORT} -u${REMOTE_USER} -p${REMOTE_PASS} --raw --stop-never --read-from-remote-server --stop-never-slave-server-id=${SERVER_ID} ${LASTFILE}  ${LOCAL_BACKUP_DIR}
echo "实例binlog实时同步出错 $(date +%F\ %T)" | mail -s "实例binlog实时同步出错 $(date +%F\ %T)" ops@huize.com,lome@huize.com


二、binlog server巡检脚本

#!/bin/bash
echo > /usr/local/shell/check_binlog_backup.log

#统计应同步实例数量
INSTANCE_COUNT=`ls /data/mysql_backup/ | grep -v archived |grep -v bi1 | wc -l`
#统计应同步实例名
ls /data/mysql_backup/ | grep -v archived |grep -v bi1 > /usr/local/shell/instance_list.txt

#统计当前同步实例数量
BINLOG_COUNT=`ps aux | grep "_binlog_backup" | egrep -v "/usr/local/mysql/bin/mysqlbinlog|--color|grep|check_binlog_backup"  |awk '{print $9,$12}'|wc -l`
#统计应同步实例名
ps aux | grep "_binlog_backup" | egrep -v "/usr/local/mysql/bin/mysqlbinlog|--color|grep|check_binlog_backup" |awk '{print $12}'|awk -F'/' '{print $5}' | awk -F'_' '{print $1}' > /usr/local/shell/binlog_instance_list.txt
#

#判断未同步实例并通知
if [ $BINLOG_COUNT -eq $INSTANCE_COUNT ];then
  echo "`date +%F\ %T` : Binlog Server运行数量与实例数量一致,Binlog备份正常" | mail -s "Binlog备份运行正常" ops@huize.com
else
  echo -e "`date +%F\ %T` : Binlog Server运行数:$BINLOG_COUNT , 应同步实例数:$INSTANCE_COUNT" >> /usr/local/shell/check_binlog_backup.log
  echo "" >> /usr/local/shell/check_binlog_backup.log
  echo -e "当前正常同步实例信息:" >> /usr/local/shell/check_binlog_backup.log
  ps aux | grep "_binlog_backup" | egrep -v "/usr/local/mysql/bin/mysqlbinlog|--color|grep|check_binlog_backup" |awk '{print $1,$9,$12}'>> /usr/local/shell/check_binlog_backup.log
  echo "" >> /usr/local/shell/check_binlog_backup.log
  echo -e "备份异常实例信息:" >> /usr/local/shell/check_binlog_backup.log
  for i in `grep -vwf /usr/local/shell/binlog_instance_list.txt /usr/local/shell/instance_list.txt`
  do
    echo "${i}实例Binlog备份异常,请运行/usr/local/shell/${i}_binlog_backup.sh &" >> /usr/local/shell/check_binlog_backup.log
  done
  cat /usr/local/shell/check_binlog_backup.log | mail -s "Binlog Server运行数量少于实例数,请检查" ops@huize.com
fi

评论