从master.info文件反推:一次线上主从故障排查教会我的Change Master要点
从master.info文件反推一次线上主从故障排查教会我的Change Master要点凌晨3点15分监控系统突然发出刺耳的警报声——生产环境的MySQL从库同步中断了。作为值班运维工程师我立刻登录服务器检查SHOW SLAVE STATUS的输出发现Last_IO_Error显示Could not find first log file name in binary log index file。这种错误通常意味着主从日志坐标不匹配但更棘手的是主库的binlog已经被自动清理无法直接通过常规方式修复。这时我意识到必须深入底层从master.info和relay-log.info这两个元数据文件中寻找线索。1. 紧急诊断解读master.info文件结构当主从复制中断时/var/lib/mysql/master.info文件保存着最原始的连接配置和复制状态。与SHOW SLAVE STATUS不同这个文件直接反映了磁盘上的持久化数据不会因服务重启而丢失。以下是当时我遇到的典型文件内容25 mysql-bin.000014 1818 192.168.1.11 repl 123456 3306 60 0 0 30.000 0 95cfc8eb-2d58-11ea-840b-000c296166d5 86400 0这个看似简单的文本文件实际上包含15行关键信息每行对应特定的配置参数文件格式版本号如25表示master.info的格式版本不同MySQL版本可能不同主库binlog文件名mysql-bin.000014从库IO线程最后读取的主库日志文件主库binlog位置1818从库IO线程最后读取的主库日志位置主库IP地址192.168.1.11复制账号用户名repl复制账号密码123456以明文存储需注意权限安全主库端口号3306连接重试间隔60秒SSL连接标识0表示禁用SSL验证标识0表示不验证心跳间隔30.000秒绑定网卡标识0表示未指定主库UUID95cfc8eb-2d58-11ea-840b-000c296166d5重试次数限制86400主库服务器ID0表示未设置注意从MySQL 5.6开始master.info文件格式增加了更多字段建议对照官方文档确认具体版本的文件结构。2. 关键参数逆向工程从文件到CHANGE MASTER命令通过分析master.info和relay-log.info我们可以重建完整的CHANGE MASTER命令。以下是核心参数的映射关系文件位置对应参数示例值是否必选第2行MASTER_LOG_FILEmysql-bin.000014非GTID模式必选第3行MASTER_LOG_POS1818非GTID模式必选第4行MASTER_HOST192.168.1.11必选第5行MASTER_USERrepl必选第6行MASTER_PASSWORD123456必选第7行MASTER_PORT3306可选默认3306第8行MASTER_CONNECT_RETRY60可选默认60第14行MASTER_RETRY_COUNT86400可选在本次故障中我发现master.info中记录的binlog文件(mysql-bin.000014)已被主库轮转删除。此时需要结合relay-log.info确定从库的执行进度$ cat /var/lib/mysql/relay-log.info 7 ./mysql-relay-log.000002 1539 mysql-bin.000014 1818 0 0 1这个文件显示从库SQL线程已执行到relay-log.000002的1539位置对应主库的mysql-bin.000014的1818位置。基于这些信息重建CHANGE MASTER命令的关键步骤如下在主库上确认当前活跃的binlog文件SHOW MASTER STATUS;如果旧binlog已不存在需要从最新文件开始同步CHANGE MASTER TO MASTER_HOST192.168.1.11, MASTER_USERrepl, MASTER_PASSWORD123456, MASTER_LOG_FILEmysql-bin.000015, -- 使用主库当前文件 MASTER_LOG_POS4; -- 从文件开头开始对于数据一致性要求高的场景建议先使用pt-table-checksum校验数据差异3. 高级故障场景处理策略3.1 主库IP变更但未更新master.info当主库服务器迁移导致IP变更时master.info中的旧IP会导致复制中断。此时需要停止从库复制STOP SLAVE;仅更新主机参数CHANGE MASTER TO MASTER_HOST新IP;重启复制START SLAVE;重要修改MASTER_HOST会导致从库认为连接的是新主库即使IP实际相同。此时必须重新指定MASTER_LOG_FILE/MASTER_LOG_POS或启用GTID。3.2 密码轮换导致认证失败当复制账号密码修改后只需更新MASTER_PASSWORD而无需重置整个复制链路STOP SLAVE; CHANGE MASTER TO MASTER_PASSWORD新密码; START SLAVE;3.3 主库启用SSL连接如果主库突然启用SSL连接需要添加以下参数CHANGE MASTER TO MASTER_SSL1, MASTER_SSL_CA/path/to/ca.pem, MASTER_SSL_CERT/path/to/client-cert.pem, MASTER_SSL_KEY/path/to/client-key.pem;4. 最佳实践与自动化运维建议4.1 安全加固措施由于master.info包含明文密码必须严格限制文件权限chown mysql:mysql /var/lib/mysql/master.info chmod 600 /var/lib/mysql/master.info4.2 关键参数检查清单定期验证以下参数是否与运行环境匹配主库网络可达性MASTER_HOST:MASTER_PORT复制账号权限MASTER_USER/MASTER_PASSWORD日志坐标一致性MASTER_LOG_FILE/MASTER_LOG_POS重试策略MASTER_CONNECT_RETRY/MASTER_RETRY_COUNT4.3 自动化监控脚本示例以下Bash脚本可实时检测复制状态并解析master.info#!/bin/bash # 检查复制状态 SLAVE_STATUS$(mysql -e SHOW SLAVE STATUS\G) # 解析master.info MASTER_INFO$(cat /var/lib/mysql/master.info | sed -n 2,4p) LOG_FILE$(echo $MASTER_INFO | sed -n 1p) LOG_POS$(echo $MASTER_INFO | sed -n 2p) MASTER_HOST$(echo $MASTER_INFO | sed -n 3p) # 输出关键指标 echo 当前主库: $MASTER_HOST echo 最后成功读取的日志: $LOG_FILE $LOG_POS echo 复制错误: $(echo $SLAVE_STATUS | grep Last_Error | cut -d: -f2-)那次凌晨的故障最终通过分析master.info中的历史日志坐标结合主库备份的binlog索引文件成功重建了复制链路。这个过程让我深刻体会到真正的运维专家不仅要会执行标准的CHANGE MASTER命令更要理解其背后的数据持久化机制。现在我会定期备份master.info和relay-log.info文件特别是在执行任何复制配置变更之前——这些看似简单的文本文件关键时刻就是救命的稻草。