配置MariaDB主从同步需确保主库开启binlog并设置唯一server-id,从库设置不同server-id且不开启binlog。关键步骤是利用主库当前的File和Position执行CHANGEMASTERTO。验证时确认Slave_IO_Running和Slave_SQL_Running均为Yes,且Seconds_Behind_Master为0,即
Linux MariaDB主从同步配置教程
时间:2026-07-03
浏览:572
文章目录
先说个核心的:主从同步这事儿,配置本身不难,但坑全藏在细节里。很多人照着文档配完,发现 Sla ve_IO_Running 是 No,就开始怀疑人生。其实问题多半就出在三个地方:server-id 的唯一性、log-bin 被默认关闭、以及 CHANGE MASTER TO 里的那两个关键参数——MASTER_LOG_FILE 和 MASTER_LOG_POS,必须跟主库 SHOW MASTER STATUS 看到的实时输出完全一致,错一位数都不行。

主库配置:必须手动打开binlog,别指望默认
很多新手第一脚就踩坑。在 CentOS 7 上,MariaDB 默认是不开二进制日志的。你光改个 server-id,服务根本不会理你。必须去 /etc/my.cnf 或 /etc/my.cnf.d/server.cnf 文件的 [mysqld] 段落里,手动加上这两行:
server-id = 1 log-bin = mysql-bin
除此之外,还有两条强烈建议加上的:
binlog-format = ROW—— 用行模式复制,能避免很多因SQL语句执行环境不同导致的主从不一致。expire_logs_days = 7—— 自动清理7天前的binlog,防止日志把磁盘撑爆,这可是个经典的生产事故点。
改完之后,记得重启服务:systemctl restart mariadb。然后验证一下:执行 mysql -e "SHOW VARIABLES LIKE 'log_bin';",看到输出是 ON 才算生效。接着,再跑一下 SHOW MASTER STATUS;,确保能看到非空的 File 和 Position 值,这俩值就是后面拷贝粘贴的依据。
从库配置:server-id别跟主库撞车,log-bin别乱开
从库配置就简单了,核心一句话:server-id 设成一个非0且不跟主库重复的数字就行,比如 server-id = 2。**千万别画蛇添足加个 log-bin**,除非你打算以后把它也变成主库(比如做双主架构)。否则,它只会给你带来一堆没用的binlog文件,白白占用磁盘,甚至可能干扰复制链路。
这里有两个常见的“送分题”般的错误:
- 忘记改
server-id,默认值是0。你执行START SLA VE时,它会直接给你甩个ERROR 1200 (HY000): The server is not configured as a replication sla ve的错误。 - 主从
server-id设成一样的。这时候从库的SHOW SLA VE STATUS\G里,Seconds_Behind_Master会显示NULL,IO线程根本连不上,起不来。
CHANGE MASTER TO:关键时刻,别偷懒用旧值
这是整个配置里最关键的步骤,也是最容易出岔子的地方。记住:MASTER_LOG_FILE 和 MASTER_LOG_POS 是主库当前binlog的“快照点”,它是个活的值。主库每重启一次、刷一次日志、甚至执行 FLUSH LOGS 都会变。千万别想着从文档里、或者上次的记录里复制粘贴,那等于刻舟求剑。
标准流程应该是这样:
- 在主库执行
FLUSH TABLES WITH READ LOCK;,先把表锁住,保证后面导出的数据是一致的。 - 立刻执行
SHOW MASTER STATUS;,当场记下File(比如mysql-bin.000003)和Position(比如154)。 - 接着,把数据导出(用
mysqldump就行),传到从库并导入。 - 最后,在从库上执行
CHANGE MASTER TO命令,把刚才记下的值填进去。
命令大致长这样(记得替换里面的IP、密码和那俩关键值):
CHANGE MASTER TO MASTER_HOST='192.168.1.150', MASTER_USER='repl', MASTER_PASSWORD='your_pass', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=154;
然后,再执行 START SLA VE;。别忘了最后的分号。
验证:别光盯着Yes/No,要会看状态
配置完,执行 SHOW SLA VE STATUS\G,看到 Sla ve_IO_Running 和 Sla ve_SQL_Running 都是 Yes,心里先踏实一半。但这只是表象,更关键的证据在后面:
Seconds_Behind_Master: 0—— 理想状态,表示没延迟。偶尔波动一下也算正常。Master_Host和Master_User—— 确认下是不是你刚才设的值,别连错了主库。Last_IO_Errno和Last_SQL_Errno—— **这俩必须都是0**。只要不是0,说明出错了。具体原因直接看Last_IO_Error或Last_SQL_Error字段,它会把问题点说得明明白白。比如:网络不通、密码错、binlog文件被删了、或者SQL冲突(最常见的就是主键重复)。
如果卡住了想先跳过一条错误,可以用 SET GLOBAL SQL_SLA VE_SKIP_COUNTER = 1;。但这只是临时止血,真正要做的还是去查根因。
最后说个更隐蔽的问题。如果你没开半同步复制,主库写完就返回了,从库虽然没报错,但数据可能还卡在传输队列里。这时候 Seconds_Behind_Master 可能显示 0,造成一种“数据已同步”的假象。这种情况最麻烦,因为主库挂了,你就会丢数据。怎么防?最靠谱的办法就是定期用工具比对一下两边的表行数,或者拿校验和算一遍。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。