使用relay模式重放binlog,实现自动化

背景:每天有外部来的binlog文件,需要在本地的MySQL环境做重放,在上次重放完成后Slave_SQL_Running_State显示Slave has read all relay log; waiting for more updates 。随后将新的binlog文件重命名为relay文件并按序号后延,也编辑了index文件添加新的relay文件编号,但不会继续重放,每次需要重新reset slave ->  change master to,故编写此脚本来自动重放。

#!bin/bash

cd /data/gscbs
echo "--------------------------------------------"
echo $(date "+%Y-%m-%d %H:%M:%S")""

# 已完成或正在进行的binlog文件编号
export pos=`cat /data/gscbs/binlog_filecode.txt`
export binlogfile=`echo $pos | awk '{printf("%06d\n",$0)}'`

# 获取Slave_SQL_Running_State的状态值
export slave_sql_running_state=($(mysql -h 192.168.100.100 -P 3306 -u root -p'123456' -e "show slave status\G"|grep "Slave_SQL_Running_State" |awk '{print $2$3$4$5$6$7$8$9$10$11}'))
echo $slave_sql_running_state

# 获取Slave_SQL_Running的状态值
export slave_sql_running=($(mysql -h 192.168.100.100 -P 3306 -u root -p'123456' -e "show slave status\G"|grep "Slave_SQL_Running" |awk '{print $2}'))
echo $slave_sql_running

# 获取Relay_Log_Pos的值
export relay_log_pos=($(mysql -h 192.168.100.100 -P 3306 -u root -p'123456' -e "show slave status\G"|grep "Relay_Log_Pos" |awk '{print $2}'))
echo $relay_log_pos

# 获取要执行的binlog文件大小
export relay_log_size=`ls -l /data/gscbs/binlog/mysql-bin."$binlogfile" | awk '{ print $5 }'`
echo $relay_log_size


if [[ $slave_sql_running_state = "Slavehasreadallrelaylog;waitingformoreupdates" ]] && [[ $relay_log_pos -eq 4 ]];then
  echo "重放结束,等待新的binlog文件"
  relay_log_pos=$relay_log_size
elif  [[ $relay_log_pos -eq 123 ]];then
  echo "Slave未启动"
  relay_log_pos=$relay_log_size
fi  


# 从库状态正常,且上次已重放完毕
if [[ $slave_sql_running = "Yes" ]] && [[ $relay_log_pos -eq $relay_log_size ]];then
  echo "slave is OK"
  pos=$(($pos+1))
  binlogpos=`echo $pos | awk '{printf("%06d\n",$0)}'`
  okFile=/data/gscbs/binlog/mysql-bin."$binlogpos".ok
  echo $okFile
  
  if [ ! -f "$okFile" ]; then
    echo "mysql-bin.$binlogpos文件还没传输过来"
  else
    
    # 更新binlog_filecode.txt文件内容
    echo $pos > /data/gscbs/binlog_filecode.txt
    binlogfile=`echo $pos | awk '{printf("%06d\n",$0)}'`
    echo "本次重放的binlog文件是mysql-bin.$binlogfile"
    
    mysql -h 192.168.100.100 -P 3306 -u root -p'123456' -e "stop slave; reset slave;"
    echo "reset slave成功"
	
    cd /data/gscbs/binlog
    cp mysql-bin."$binlogfile" /mysql-data
	echo "拷贝mysql-bin.$binlogfile成功"
    
    cd /mysql-data
    rm -rf relay-bin.*
    mv mysql-bin."$binlogfile" relay-bin."$binlogfile"
    chown -R mysql:mysql /mysql-data
    echo "./relay-bin."$binlogfile"" > relaylog_bin_index.index
    echo "编辑index文件成功"
	
    mysql -h 192.168.100.100 -P 3306 -u root -p'123456' -e "change master to master_host='192.168.209.200', relay_log_file='relay-bin."$binlogfile"', relay_log_pos=1;"
    echo "change master to成功"
	mysql -h 192.168.100.100 -P 3306 -u root -p'123456' -e "start slave sql_thread;"
    echo "sql_thread启动成功"    
	
  fi

elif [[ $slave_sql_running = "Yes" ]] && [[ $relay_log_pos -ne $relay_log_size ]];then
  echo "正在重放binlog"

else
  echo "slave is wrong"
  echo "slave故障待处理" | mail -s "slave故障待处理" sinoimage@126.com
fi

加入crontab后,每10分钟执行一次。
PS:
1、为了确保外部binlog文件传输完成,每次传输完生成一个.ok文件,比如mysql-bin.005466传输完生成一个mysql-bin.005466.ok文件。
2、binlog_filecode.txt 存放的值是5466,以便+1运算,之后补零。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值