主库show master status为空或报错,说明binlog未开启或配置失效;需检查log_bin变量是否on、my.cnf中log-bin配置是否正确且重启服务,同时确认server_id唯一非零、binlog_format为row。

主库 SHOW MASTER STATUS 为空或报错
这是最直接的信号:主库没开 binlog,从库根本无日志可拉。执行 SHOW MASTER STATUS; 返回空结果,或提示 ERROR 1236 (HY000): Could not find first log file name in binary log index file,基本可以锁定问题根源。
- 先确认
log_bin变量是否为ON:SHOW VARIABLES LIKE 'log_bin';—— 若是OFF,说明配置未生效或根本没配 - 检查配置文件(如
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf)中[mysqld]段落是否含log-bin = mysql-bin(注意:配置项名是log-bin,但变量名是log_bin,大小写和连字符别搞混) - 路径别写绝对路径(比如
log-bin = /var/lib/mysql/mysql-bin),容易因权限或 SELinux 被拒;用相对名更稳妥,MySQL 会自动落到datadir下 - 改完必须重启服务:
systemctl restart mysql(Ubuntu/Debian)或systemctl restart mysqld(CentOS/RHEL),仅 reload 配置不生效
server_id 重复或未设置
即使 binlog 开了,server_id 不合法也会让复制卡在连接阶段。常见现象是 SHOW SLAVE STATUS\G 中 Slave_IO_Running: Connecting,且 Last_IO_Error 提示 server_id of slave is equal to server_id of master。
-
server_id必须是非零正整数,且主从之间全局唯一(范围 1–4294967295) - 主库设
server_id = 1,从库至少得是2,不能复用、不能为0或空值 - 检查方式:
SHOW VARIABLES LIKE 'server_id';—— 注意这个变量名是server_id,不是server-id - 临时改可用
SET GLOBAL server_id = 2;,但必须配合重启才持久化;否则下次 MySQL 启动又恢复原值
CHANGE MASTER TO 找不到 binlog 文件
从库执行 CHANGE MASTER TO 时提示 Could not find first log file name in binary log index file,通常是因为主库 binlog 索引文件损坏、路径错位,或主库压根没生成过 binlog 文件。
- 先确认主库确实产生了 binlog 文件:
ls -l $(dirname $(mysql -Nse "SELECT @@datadir"))/mysql-bin.*—— 如果没输出,说明还没写过任何事务,或者配置根本没生效 - binlog 文件名前缀由
log-bin配置决定,但实际文件名还带编号(如mysql-bin.000001),索引文件是mysql-bin.index,它必须存在且内容正确 - 若主库刚开启 binlog 就重启过,可能
mysql-bin.index为空或缺失,手动 touch 并写入首个文件名(如echo "mysql-bin.000001" > mysql-bin.index)风险极高,不如重启 MySQL 让它自动生成 - 从库
CHANGE MASTER TO的MASTER_LOG_FILE必须严格匹配主库SHOW MASTER STATUS输出的File字段,一个字母都不能错
binlog_format 设置不当导致从库同步失败
主库开了 binlog,但从库启动后很快 SQL 线程挂掉,Last_SQL_Error 提示函数不可重放(如 NOW()、UUID())、主键冲突等,大概率是格式选错了。
-
STATEMENT格式记录 SQL 语句本身,对非确定性函数极不友好,主从数据极易不一致,生产环境禁用 -
ROW格式记录行变更细节,安全但日志体积大;MySQL 5.7+ 默认就是它,建议保持 - 检查命令:
SHOW VARIABLES LIKE 'binlog_format';—— 值应为ROW,不是STATEMENT或MIXED - 修改需重启:
binlog_format = ROW加到[mysqld]段,重启后生效;在线 SET 不被允许
log_bin 显示为 ON,但 mysql-bin.index 是空的,或者第一个 .000001 文件大小为 0 —— 这说明 MySQL 进程没真正触发写入,往往卡在权限、SELinux、或 datadir 路径配置冲突上。











