磁盘写满导致复制停止时,必须先stop slave sql_thread手动清理旧relay log(保留relay_log_file及之后文件),再迁移relay_log至独立挂载点并重启mysqld;不可直接reset slave或删除ibdata1/ib_logfile*等关键文件。

磁盘写满导致的复制停止,不能只删文件或跳过错误——SQL线程已退出,relay log 可能已损坏,必须先止血再重建路径。
STOP SLAVE SQL_THREAD 后手动清理 relay log
relay_log 不受 expire_logs_days 控制,堆积后会卡死 SQL 线程,报错常见为 ERROR 1594 (HY000): Relay log read failure 或系统级 No space left on device。此时不能直接 RESET SLAVE,否则丢失位置信息无法安全续同步。
- 先执行
STOP SLAVE SQL_THREAD;,阻止新事件写入 relay log - 查当前正在消费的文件:
SHOW SLAVE STATUS\G中看Relay_Log_File(如mysql-relay-bin.000123)和Relay_Log_Pos - 进
datadir目录,用ls -lt mysql-relay-bin.*排序,删掉所有编号比Relay_Log_File小的旧文件(例如当前是.000123,可删.000001到.000122),但绝不能删.000123及其 index 文件 - 再执行
START SLAVE SQL_THREAD;,观察是否恢复;若仍报错,说明 relay log 已损坏,需走迁移流程
把 relay_log 迁到独立挂载点才是根治方式
默认 relay_log 和 datadir 共用分区,主库持续写 + 从库消费慢 = 磁盘瞬间打满。改配置重启不是简单替换路径,顺序错一步 MySQL 就启动失败。
- 确认 SQL 线程已追平:
STOP SLAVE;后检查Seconds_Behind_Master = 0,并记下Exec_Master_Log_Pos和Relay_Master_Log_File - 新建目录(如
/data/relaylog),chown mysql:mysql且权限设为750 - 在
my.cnf的[mysqld]段添加两行:relay_log = /data/relaylog/mysql-relay-bin和relay_log_index = /data/relaylog/mysql-relay-bin.index - 重启
mysqld,成功后立刻START SLAVE;,再用SHOW SLAVE STATUS\G确认两个线程都为Yes
别碰 ibdata1、ib_logfile*、master.info 这些文件
磁盘满时最容易手抖去删这些,结果更糟。
-
ibdata1在innodb_file_per_table=OFF下永不收缩,删了等于删库 -
ib_logfile0/ib_logfile1是 redo log,MySQL 启动时校验大小,删了会报InnoDB: Error: log file ./ib_logf...并拒绝启动 -
master.info和relay-log.info被RESET SLAVE清空后,必须手动重配CHANGE MASTER TO,否则 IO 线程起不来
真正容易被忽略的是:迁移 relay_log 路径后,第一次启动时 MySQL 会自动创建新 index 文件,但若旧 mysql-relay-bin.index 还在原 datadir 里,它可能被误读,导致启动卡住或加载错误文件——务必确认旧 index 文件已被移出或重命名。











