在mysql主从复制架构中,从库可能因为网络抖动、数据冲突或磁盘问题导致复制中断。要保障数据同步稳定,就必须对主从复制的错误日志进行监控,并通过定期巡检与报警脚本尽早发现问题。

一、主从复制错误日志关注点
通过 SHOW SLAVE STATUSG 可以查看从库运行状态,其中几个字段尤其重要:
- Slave_IO_Running:IO线程是否正常
- Slave_SQL_Running:SQL线程是否正常
- Last_Error:最近一次错误信息
- Last_IO_Error:最近一次IO错误
二、手动查看复制状态
登录mysql后执行如下命令:
SHOW SLAVE STATUSG
若 Slave_SQL_Running 为 No,说明复制已停止,需要查看 Last_Error 内容。
三、定期巡检脚本编写
使用shell脚本结合mysql客户端定期获取状态,发现异常则记录日志并报警:
#!/bin/bash
# 简易mysql主从复制巡检脚本
MYSQL_USER="root"
MYSQL_PASS="password"
LOG_FILE="/var/log/mysql_slave_check.log"
ALERT_API="http://127.0.0.1/alert"
STATUS=$(mysql -u$MYSQL_USER -p$MYSQL_PASS -e "SHOW SLAVE STATUSG" 2>/dev/null)
SQL_RUNNING=$(echo "$STATUS" | grep "Slave_SQL_Running:" | awk '{print $2}')
IO_RUNNING=$(echo "$STATUS" | grep "Slave_IO_Running:" | awk '{print $2}')
LAST_ERROR=$(echo "$STATUS" | grep "Last_Error:" | cut -d':' -f2-)
if [ "$SQL_RUNNING" != "Yes" ] || [ "$IO_RUNNING" != "Yes" ]; then
echo "$(date) 主从复制异常: $LAST_ERROR" >> $LOG_FILE
# 调用本地报警接口
curl -X POST $ALERT_API -d "msg=mysql slave error: $LAST_ERROR"
fi
四、配置定时任务
使用crontab设置每五分钟执行一次巡检:
*/5 * * * * /bin/bash /usr/local/bin/check_mysql_slave.sh
常见错误与处理
| 错误类型 | 可能原因 | 处理建议 |
|---|---|---|
| Duplicate entry | 从库已有相同主键 | 跳过错误或用pt工具修复 |
| Got fatal error 1236 | 主库binlog被清理 | 重新搭建从库或调整expire_logs_days |
五、邮件报警补充
若需邮件通知,可在脚本异常分支中加入:
echo "mysql slave error: $LAST_ERROR" | mail -s "mysql报警" admin@ipipp.com
注意:生产环境密码不要明文写在脚本中,建议使用配置文件并限制权限。
六、总结
通过定期执行 SHOW SLAVE STATUS 并解析关键字段,配合cron与报警脚本,可以有效监控mysql主从复制错误日志,在异常发生的第一时间通知运维人员,降低数据不一致风险。