主库需开启binlog并设唯一server-id:配置server-id=1、log-bin=/var/lib/mysql/mysql-bin、binlog-format=ROW、expire_logs_days=7;从库通过CHANGE REPLICATION SOURCE TO独立连接主库,依赖

想让从库有数据可同步,主库的二进制日志(binlog)是必须开启的。这里有个关键选择:binlog_format 通常推荐设置为 ROW 模式。为什么?因为语句级复制(Statement-Based)在遇到某些函数、临时表或不确定性的操作时,很容易导致主从数据不一致,而 ROW 模式基于行的变化,可靠性要高得多。另一个绝对不能忽视的配置是 server-id,它必须是一个全局唯一的非零整数。那么,多个从库能不能共用同一个 server-id 呢?答案是绝对不行。主库和每一个从库都必须拥有自己唯一的身份标识,否则,无论是传统的基于位点的复制,还是 GTID 复制,都会直接拒绝连接。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
关键的配置项需要写入主库的 my.cnf 文件:
server-id = 1 log-bin = /var/lib/mysql/mysql-bin binlog-format = ROW expire_logs_days = 7
log-bin 的路径务必使用绝对路径(例如 /var/lib/mysql/mysql-bin)。使用相对路径可能在 MySQL 服务重启后导致问题。binlog_format 可以动态调整(SET GLOBAL binlog_format = 'ROW'),但这个设置只对新建立的会话有效。为了确保环境一致,生产上还是建议重启服务。expire_logs_days 这个参数至关重要,它用于设置 binlog 文件的过期天数,自动清理历史日志。如果漏配,binlog 文件会无限增长,最终撑满磁盘空间。配置从库时,每个从库都需要独立执行 CHANGE REPLICATION SOURCE TO 命令(这是 MySQL 8.0.23 及之后版本的语法,旧版本使用 CHANGE MASTER TO),将复制源指向同一个主库的 IP 地址和端口。它们可以使用同一个复制账号,也可以分别创建,只要权限足够即可。这里的关键点不在于“能不能连接”,而在于“连接后如何互不干扰”。答案在于架构设计:每个从库都会独立维护自己的 relay_log(中继日志)文件和 master.info(复制元数据信息,在 MySQL 8.0 中部分信息移至性能模式表),彼此完全隔离,不会相互影响。
REPLICATION SLA VE 权限的用户。例如:CREATE USER 'repl'@'%' IDENTIFIED BY 'your_password'; GRANT REPLICATION SLA VE ON *.* TO 'repl'@'%';SOURCE_LOG_FILE 和 SOURCE_LOG_POS 这两个参数必须与主库当前的 binlog 状态(通过 SHOW MASTER STATUS 查看)严格一致。一个省事的技巧是,使用 mysqldump --single-transaction --master-data=2 进行数据备份时,导出的 SQL 文件头部会自动包含正确的文件名和位置信息。START REPLICA;(8.0.23+)或 START SLA VE;(旧版)即可启动复制进程。多个从库的启动和运行都是完全独立的。很多运维同学习惯性地盯着 Seconds_Behind_Master 这个指标,但它其实是个“表象指标”,甚至可能产生误导。当它显示为 NULL 或 0 时,并不代表从库已经100%追上了主库。这个值仅仅度量了从库 SQL 线程正在执行的 binlog 事件与主库当前事件之间的时间差,而忽略了网络传输耗时、relay log 写入磁盘的 I/O 延迟,以及从库自身负载过高导致 SQL 线程被阻塞等情况。
SHOW MASTER STATUS 输出的 File 和 Position,与从库 SHOW REPLICA STATUS 输出的 Relay_Master_Log_File 和 Exec_Master_Log_Pos 是否一致。Retrieved_Gtid_Set(从库已接收的 GTID 集合)和 Executed_Gtid_Set(从库已执行的 GTID 集合)是否相等即可。一对多架构看似配置简单,但在生产环境中,往往在以下几个地方悄无声息地出现问题:
ERROR 2013 (HY000): Lost connection to MySQL server during query 这类连接丢失的错误。auto_increment_increment 和 auto_increment_offset 吗?答案是:千万不要在一对多场景下开启。这两个参数是为多主环形复制架构设计的,用于避免自增 ID 冲突。在标准的主从复制中,从库必须保持 auto_increment_increment = 1,否则在应用写入时(例如在从库上执行写操作测试),可能导致自增主键冲突或出现不连续的跳号。gtid_mode 设置必须完全兼容,不同版本之间对 GTID 事件的处理可能有差异,例如 5.7 版本的从库可能无法正确解析 8.0 主库生成的某些特定 GTID 事件。最后必须强调一点:一对多复制解决了数据分发和读扩展的问题,但它并没有解决主库的单点故障问题。主库一旦宕机,整个复制链路就中断了。实现高可用,仍然需要依靠外部的监控和切换工具(如 MHA、Orchestrator 等),或者在应用层设计灵活的路由逻辑。很多人配置完主从就以为高枕无忧了,其实,这只是构建高可用数据库体系的第一步。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述