Linux MariaDB主从同步配置教程

作者:技术拾光

时间:2026-07-03

浏览:572

配置MariaDB主从同步需确保主库开启binlog并设置唯一server-id,从库设置不同server-id且不开启binlog。关键步骤是利用主库当前的File和Position执行CHANGEMASTERTO。验证时确认Slave_IO_Running和Slave_SQL_Running均为Yes,且Seconds_Behind_Master为0,即

文章目录

先说个核心的:主从同步这事儿,配置本身不难,但坑全藏在细节里。很多人照着文档配完,发现 Sla ve_IO_Running 是 No,就开始怀疑人生。其实问题多半就出在三个地方:server-id 的唯一性、log-bin 被默认关闭、以及 CHANGE MASTER TO 里的那两个关键参数——MASTER_LOG_FILE 和 MASTER_LOG_POS,必须跟主库 SHOW MASTER STATUS 看到的实时输出完全一致,错一位数都不行。

Linux MariaDB主从同步配置教程

主库配置:必须手动打开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,造成一种“数据已同步”的假象。这种情况最麻烦,因为主库挂了,你就会丢数据。怎么防?最靠谱的办法就是定期用工具比对一下两边的表行数,或者拿校验和算一遍。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章