Mysql热备份自动修复脚本(优化)

由于之前只用了两台服务器做单独的主从备份,所以没有太多问题,最近新加了一台主服务器,mysql主主从热备份,出现了两个问题。

结构

    主 <=> 主 -> 从

问题

  1. 修复脚步每次都会重启数据库不够友好

  2. 获取新起点会删除已同步的日志,如果另一台未同步完成,会导致另一台数据不全,这样就是两台服务器有了冲突

优化

对比原脚步《mysql热备份自动修复脚步》,进行查看

1.主从断开优化

echo "主从服务器连接失败,重启mysql服务。" >> /root/error.log	
service mysqld restart >> /root/error.log

改为

echo "主从服务器连接失败,重启slave服务。" >> /root/error.log
mysql -u$SU -p$SP -e "
STOP SLAVE;
START SLAVE;
quit"

2.获取新起点优化

mysql -h $MIP -u$MU -p$MP -e "
purge binary logs to '$Relay_Master_Log_File';
show binlog events;
quit" > binary.log

改为

mysql -h $MIP -u$MU -p$MP -e "
show binlog events in '$Relay_Master_Log_File' from $Exec_Master_Log_Pos limit 0,10;
quit" > binary.log

注:这样写避免删除日志导致冲突,且只导出出错部分的10条记录,避免因日志过大而影响效率

3.重新关联优化

if [ "$Pos1" = "$Pos2" ]
	then
		echo "重新建立主从关系" >> /root/error.log
		mysql -u$SU -p$SP -e "
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='$MIP',
	MASTER_USER='$MSU',
	MASTER_PASSWORD='$MSP',
	MASTER_LOG_FILE='$Relay_Master_Log_File',
	MASTER_LOG_POS=$Pos2;
quit"
	else
		Pos3=$(cat binary.log |grep -w Query|awk '{ print $2 }'|grep -A 1 $Pos1|tail -1) 
		echo Pos3=$Pos3 >> /root/error.log
		echo "重新建立主从关系" >> /root/error.log
		mysql -u$SU -p$SP -e "
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='$MIP',
	MASTER_USER='$MSU',
	MASTER_PASSWORD='$MSP',
	MASTER_LOG_FILE='$Relay_Master_Log_File',
	MASTER_LOG_POS=$Pos3;
quit"
	fi
	echo "重启mysql服务器" >> /root/error.log
	service mysqld restart >> /root/error.log
fi

改为

if [ "$Pos1" = "$Pos2" ]
    then
        echo "重新建立主从关系" >> /root/error.log
        mysql -u$SU -p$SP -e "
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='$MIP',
    MASTER_USER='$MSU',
    MASTER_PASSWORD='$MSP',
    MASTER_LOG_FILE='$Relay_Master_Log_File',
    MASTER_LOG_POS=$Pos2;
START SLAVE;
quit"
    else
        Pos3=$(cat $binary |grep -w Query|awk '{ print $2 }'|grep -A 1 $Pos1|tail -1) 
        echo Pos3=$Pos3 >> /root/error.log
        echo "重新建立主从关系" >> /root/error.log
        mysql -u$SU -p$SP -e "
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='$MIP',
    MASTER_USER='$MSU',
    MASTER_PASSWORD='$MSP',
    MASTER_LOG_FILE='$Relay_Master_Log_File',
    MASTER_LOG_POS=$Pos3;
START SLAVE;
quit"
    fi
    echo "重载mysql服务器" >> /root/error.log
    service mysqld reload
fi


本文链接:https://jeff.xin/post/39.html

--EOF--

Comments

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。