MySQL主库必须开启binlog才能做主从复制
不开启
binlog,主库根本不会记录任何数据变更日志,从库连日志都拉不到,主从同步直接失效。这不是可选项,是硬性前提。
确认当前是否已启用binlog
连接MySQL后执行:
SHOW VARIABLES LIKE 'log_bin';如果返回值是
OFF,说明没开;返回
ON且
log_bin_basename有路径,才算真正启用。
log_bin变量只反映“是否允许写入”,但实际是否生效还取决于配置文件里有没有正确设置 仅靠
SET GLOBAL log_bin = ON;是无效的——该变量是只读的,必须改配置文件后重启 有些云数据库(如阿里云RDS)默认开启且不允许关闭,但自建MySQL几乎都需要手动配
my.cnf中必须设置的binlog相关参数
编辑
/etc/my.cnf或
/etc/mysql/mysql.conf.d/mysqld.cnf,在
[mysqld]段落下添加以下几项:
log_bin = /var/lib/mysql/mysql-bin—— 指定binlog基础文件名(注意路径要有写权限)
server_id = 1—— 主库唯一ID,主从集群中不能重复(从库要设为其他整数)
binlog_format = ROW—— 强烈建议用
ROW格式,避免语句级复制的不确定性问题
expire_logs_days = 7—— 自动清理7天前的binlog,防止磁盘打满(可选但推荐)
改完必须重启MySQL:
systemctl restart mysqld(或
service mysql restart),否则不生效。
验证binlog是否正常写入
重启后立即检查:
执行SHOW MASTER STATUS;,应看到非空的
File(如
mysql-bin.000001)和非零
Position去
log_bin指定路径下确认文件已生成:
ls -l /var/lib/mysql/mysql-bin.*执行一条INSERT或UPDATE,再查
SHOW MASTER STATUS;,
Position值应明显增大
常见坑:SELinux或AppArmor阻止MySQL往指定路径写文件;
log_bin路径目录不存在或权限不对;配置写在
[client]段而非
[mysqld]段。
