当前位置: 首页 > news >正文

@MySQL 主从自动修复 - 复制错误

文章目录

  • MySQL主从复制错误-自动修复
    • 脚本功能
    • 安全建议
    • 脚本编写
    • 使用说明
    • 日志输出

MySQL主从复制错误-自动修复

根据您的需求,我优化了脚本,使其能够:

  1. 检查主从状态
  2. 从错误信息中提取GTID
  3. 自动跳过错误事务
  4. 循环处理直到所有错误解决

脚本功能

  1. 状态检查: 验证MySQL连接 检查Slave_IO_Running和Slave_SQL_Running状态 解析Last_SQL_Error中的错误信息
  2. 错误处理: 使用正则表达式从错误信息中提取GTID 自动执行STOP SLAVE, SET GTID_NEXT, BEGIN, COMMIT操作 处理完成后自动START SLAVE
  3. 循环机制: 每次处理后等待5秒重新检查状态 最多处理50个错误(可配置) 当所有错误解决且线程状态正常时自动退出

安全建议

  1. 创建专用MySQL用户:

    CREATE USER 'repl_monitor'@'localhost' IDENTIFIED BY 'strong_password';
    GRANT REPLICATION CLIENT, REPLICATION SLAVE ADMIN ON *.* TO 'repl_monitor'@'localhost';
    
  2. 在生产环境使用前充分测试

  3. 定期备份数据库

  4. 监控脚本执行日志

脚本编写

#!/bin/bash# MySQL连接配置
MYSQL_USER="root"
MYSQL_PASSWORD="your_password"
MYSQL_HOST="localhost"
MYSQL_PORT="3306"# 最大错误处理次数(防止无限循环)
MAX_ERRORS=50
ERROR_COUNT=0
SLEEP_TIME=5  # 每次检查间隔秒数# 检查MySQL连接
check_mysql_connection() {mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -h"$MYSQL_HOST" -P"$MYSQL_PORT" -e "SELECT 1" >/dev/null 2>&1if [ $? -ne 0 ]; thenecho "ERROR: Failed to connect to MySQL server. Please check your credentials."exit 1fi
}# 获取主从状态信息
get_slave_status() {mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -h"$MYSQL_HOST" -P"$MYSQL_PORT" -e "SHOW SLAVE STATUS\G" 2>/dev/null
}# 检查主从状态是否正常
check_replication_status() {local status_output=$(get_slave_status)# 检查IO和SQL线程状态local io_running=$(echo "$status_output" | grep "Slave_IO_Running:" | awk '{print $2}')local sql_running=$(echo "$status_output" | grep "Slave_SQL_Running:" | awk '{print $2}')# 检查是否有错误local last_error=$(echo "$status_output" | grep "Last_SQL_Error:" | sed 's/Last_SQL_Error: //')if [ "$io_running" = "Yes" ] && [ "$sql_running" = "Yes" ] && [ -z "$last_error" ]; thenreturn 0  # 状态正常elseecho "$status_output"  # 返回状态输出用于解析return 1  # 状态异常fi
}# 从错误信息中提取GTID
extract_gtid_from_error() {local error_message="$1"# 使用正则表达式匹配GTID格式:UUID:序列号echo "$error_message" | grep -oE "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}:[0-9]+"
}# 跳过指定的GTID错误
skip_gtid_error() {local gtid="$1"echo "处理错误GTID: $gtid"mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -h"$MYSQL_HOST" -P"$MYSQL_PORT" <<EOFSTOP SLAVE;SET GTID_NEXT='$gtid';BEGIN; COMMIT;SET GTID_NEXT='AUTOMATIC';START SLAVE;
EOFif [ $? -ne 0 ]; thenecho "错误: 无法跳过GTID $gtid"return 1fireturn 0
}# 主处理循环
main() {check_mysql_connectionecho "开始监控MySQL主从复制状态..."while [ $ERROR_COUNT -lt $MAX_ERRORS ]; dostatus_output=$(check_replication_status)status_code=$?if [ $status_code -eq 0 ]; thenecho "主从复制状态正常"echo "脚本执行完成"exit 0fi# 提取错误信息last_error=$(echo "$status_output" | grep "Last_SQL_Error:" | sed 's/Last_SQL_Error: //')if [ -n "$last_error" ]; thenecho "检测到复制错误: $last_error"# 从错误信息中提取GTIDgtid=$(extract_gtid_from_error "$last_error")if [ -n "$gtid" ]; thenecho "提取到错误GTID: $gtid"skip_gtid_error "$gtid"if [ $? -eq 0 ]; then((ERROR_COUNT++))echo "已处理错误 #$ERROR_COUNT, 等待${SLEEP_TIME}秒后重新检查..."sleep $SLEEP_TIMEcontinueelseecho "错误: 无法修复GTID $gtid"exit 1fielseecho "警告: 在错误信息中未找到GTID"echo "请手动检查错误: $last_error"exit 1fielse# 检查线程状态io_running=$(echo "$status_output" | grep "Slave_IO_Running:" | awk '{print $2}')sql_running=$(echo "$status_output" | grep "Slave_SQL_Running:" | awk '{print $2}')if [ "$io_running" != "Yes" ] || [ "$sql_running" != "Yes" ]; thenecho "复制线程未运行: IO_Running=$io_running, SQL_Running=$sql_running"echo "请手动检查复制状态"exit 1fifisleep $SLEEP_TIMEdoneecho "错误: 已达到最大错误处理次数($MAX_ERRORS), 需要人工干预"exit 1
}# 执行主函数
main

使用说明

  1. 配置MySQL连接参数:

    MYSQL_USER="root"
    MYSQL_PASSWORD="your_password"
    MYSQL_HOST="localhost"
    MYSQL_PORT="3306"
    
  2. 设置脚本权限:

    chmod +x mysql_replication_fixer.sh
    
  3. 执行脚本:

    ./mysql_replication_fixer.sh
    

日志输出

开始监控MySQL主从复制状态...
检测到复制错误: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction '3669c25f-587d-11f0-b026-005056865fd6:90707229' at source log zbx-db1.000099, end_log_pos 673717022. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any.
提取到错误GTID: 3669c25f-587d-11f0-b026-005056865fd6:90707229
处理错误GTID: 3669c25f-587d-11f0-b026-005056865fd6:90707229
已处理错误 #1, 等待5秒后重新检查...
主从复制状态正常
脚本执行完成

这个脚本能够自动处理您描述的复制错误场景,并在修复所有错误后正常退出。- 生产环境慎用

http://www.dtcms.com/a/427989.html

相关文章:

  • 一级造价工程师报名网站枝江市住房和城乡建设局网站
  • 网站上传程序流程it外包公司是什么意思
  • Day1 Linux 入门:9 个核心命令(whoami/id/pwd 等)
  • 【RabbitMQ】docker-compose编排部署RabbitMQ容器——CentOS
  • 免费推广网站2024建设一个图片下载网站
  • TypeScript的类型兼容是什么?
  • 网站怎么提交收录建立网站需要多少钱?
  • PySpark全面解析:大数据处理的Python利器
  • 淮北哪些企业做网站商务网站建设论文总结
  • Kerberos协议深度解析:工作原理与安全实践
  • Linux中断概述
  • 文安做网站的wordpress配置qq邮箱
  • kvmclock
  • 使用 Python 打造一个轻量级系统信息查看器
  • 旅游网站首页制作番禺核酸检测点有新调整
  • 最常用的js加解密之RSA-SHA256 加密算法简介与 jsjiami 的结合使用指南
  • 建站之星至尊版域名中的wordpress删除
  • 苹果软件混淆方式对比与场景化选择,源码混淆、成品包混淆与混合方案
  • 生产环境下oracle19c rac恢复节点2
  • 【VMware】VMware-workstation中,Ubuntu系统安装说明
  • 基于LMK04828的跨板级联时钟同步
  • 黄骅港客运站电话号码企业网站制作策划书
  • 图神经网络分享系列-transe(Translating Embeddings for Modeling Multi-relational Data) (二)
  • 安全的合肥网站建设中国建设银行移动门户
  • LVGL-UI工具
  • 长春网站建设推广网站建设佰金手指科杰二
  • 精益制造——解读麦肯锡集团精益生产与价值流图管理【附全文阅读】
  • 建站吗官方网站农产品网络营销模式
  • 苏宁易购网站设计怎么制作潍坊住房公积金个人查询入口
  • SeaTunnel 同步 KingBase 数据到 Easysearch