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

 

posted @ 2018-08-04 23:17  屠魔的少年  阅读(885)  评论(0)    收藏  举报