磁盘扇区损坏导致复制中断必须先验证中继日志完整性再决定重建或修复;它表现为底层i/o异常,需通过dmesg、smartctl等确认硬件故障,损坏的relay log不可跳过,生产环境首选重建从库并执行pt-table-checksum校验与坏块扫描。

磁盘扇区损坏导致的复制中断无法靠跳过或重连解决,必须先验证中继日志完整性,再决定是修复还是重建从库。
确认是否真为磁盘扇区损坏而非普通IO错误
扇区损坏不是“连不上主库”或“SQL执行失败”,它会表现为底层读取异常,但MySQL层面可能只报模糊错误。先排除常见干扰:
- 检查
SHOW SLAVE STATUS\G中Slave_IO_Running和Slave_SQL_Running是否都为No,且Last_IO_Error或Last_SQL_Error含有I/O error、Input/output error、Bad file descriptor等关键词 - 立刻查看 MySQL 错误日志(通常是
/var/log/mysql/error.log或datadir/hostname.err),搜索OS error code 5(EIO)、error 5、sector、bad block - 运行
sudo dmesg -T | grep -i "ata\|nvme\|sd\|I/O",确认内核是否已上报磁盘硬件级 I/O 错误 - 用
sudo smartctl -a /dev/sdX(替换为实际设备)检查 SMART 状态,重点关注Reallocated_Sector_Ct、Current_Pending_Sector、UDMA_CRC_Error_Count
验证中继日志(relay log)是否已损坏
扇区损坏最常污染的是从库本地的中继日志文件(relay-log.index 及其指向的 relay-bin.0000xx)。不能直接 START SLAVE,否则可能把损坏数据写入表:
- 停掉复制:
STOP SLAVE; - 定位当前 relay log 文件:查
Relay_Log_File和Relay_Log_Pos字段值 - 用
mysqlbinlog --base64-output=decode-rows -v /path/to/relay-bin.0000xx | head -n 100尝试解析该文件前段;若报Failed to open file或解析中断,基本确认损坏 - 对比
Relay_Master_Log_File和Master_Log_File:如果二者不一致,说明中继日志已丢失部分事件,无法安全追平
损坏确认后必须二选一:重建 or 强制跳过(高风险)
扇区损坏意味着数据已不可信,任何“跳过”都只是掩盖问题,后续大概率引发主从数据错位甚至业务逻辑崩溃:
-
推荐路径(生产环境首选):重建从库
用mysqldump --single-transaction --master-data=2或xtrabackup从主库拉全量备份 → 清空从库RESET SLAVE ALL;→ 导入 → 根据备份中注释的CHANGE MASTER TO语句重配 →START SLAVE; -
仅限测试/临时救急:强制指定新起点(非GTID模式)
前提是能确定主库上对应位置的日志仍存在:STOP SLAVE;→ 查主库SHOW MASTER STATUS;获取最新File和Position→CHANGE MASTER TO MASTER_LOG_FILE='xxx', MASTER_LOG_POS=yyy;→START SLAVE;。注意:这会丢弃所有未应用的中继日志,包括可能完好的部分 -
GTID模式下无安全绕过方案
SET GTID_NEXT跳过只能针对单个已知 GTID,而扇区损坏导致 relay log 断裂,GTID 序列无法连续推导,强行设置会破坏 GTID 集合一致性,START SLAVE会立即报错fatal error 1236
修复后必须做三件事,缺一不可
重建或重配完成后,别急着切流量。扇区损坏往往伴随隐性数据腐化:
- 等
Seconds_Behind_Master归零后,立刻在主库运行pt-table-checksum,在从库用pt-table-sync --print预览差异 —— 即使状态显示正常,扇区损坏可能导致某张表某几行静默损坏 - 检查从库
datadir所在磁盘剩余健康扇区:用sudo badblocks -v /dev/sdX > badsectors.txt 2>&1扫描(需卸载分区),结果非空则必须更换磁盘 - 确认
innodb_checksum_algorithm设为strict_crc32(MySQL 8.0+ 默认),并开启innodb_checksums=ON,让 InnoDB 主动拦截坏块读取
扇区损坏不是配置问题,是硬件失效信号。修复动作本身不难,难的是判断“表面恢复”背后是否还埋着数据错位的雷——尤其当 pt-table-checksum 报出零差异时,更要怀疑 checksum 计算过程是否也受坏块影响。务必把磁盘健康验证放在最后一步,而不是第一步。











