MySQL_级联主从复制_log-slave-update

本文介绍了一种MySQL集群环境中出现的数据同步问题及其原因。具体表现为M01和M02之间的双向复制正常,但当数据从M02写入时,无法同步到R01。文章分析了log_slave_updates参数的作用,并给出了调整该参数实现正确同步的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文 : http://blog.itpub.net/12679300/viewspace-1319263/


说明:最近部署了mysql的集群环境,详细如下M01和M02为主主复制,M01和R01为主从复制;在测试的过程中发现了以下问题:

1、M01和M02的主主复制是没有问题的(从M01写入数据能同步到M02,从M02写入数据能够同步到M01);

2、主从同步的时候,当从M01写入的时候,数据可以写入到R01;

3、当从M02写入的时候,数据就不能写入到R01;

 

问题的原因:log_slave_updates参数的状态为NO

mysql的官网说明如下:

Normally, a slave does not log to its own binary log any updates that are received from a master server. This option tells the slave to log the updates performed by its SQL thread to its own binary log. For this option to have any effect, the slave must also be started with the --log-bin option to enable binary logging. Prior to MySQL 5.5, the server would not start when using the --log-slave-updates option without also starting the server with the --log-bin option, and would fail with an error; in MySQL 5.5, only a warning is generated. (Bug #44663) --log-slave-updates is used when you want to chain replication servers. For example, you might want to set up replication servers using this arrangement:

A -> B -> C

   

Here, A serves as the master for the slave B, and B serves as the master for the slave C. For this to work, B must be both a master and a slave. You must start both A and B with --log-bin to enable binary logging, and B with the --log-slave-updates option so that updates received from A are logged by B to its binary log. 

a) M01同步从M02同步数据过来的时候,log_slave_updates参数用来控制M01是否把所有的操作写入到binary log,默认的情况下mysql是关闭的;

b) R01数据的更新需要通过读取到M01的binary log才能进行更新,这个时候M01是没有写binary log的,所以当数据从M02写入的时候,R01也就没有更新了。。

 

问题的解决方法:

 

log_slave_updates:默认值为OFF;

Dynamic Variable:NO

 

处理方法:修改/etc/my.cnf,增加一行log_slave_updates=1,重启数据库后就可以了;

 

总结:设置完该参数后,数据库的架构就可以设置成M01和M02为主主同步,R01通过M01进行主从同步;

应用的写操作中M02上面进行,读操作中R01上面进行(如果读操作很多的话,可以在M01上面架设多台只读数据库),当M02发生故障后,系统的写操作自动迁移到M01上面。这种架构基本可以保证大部分公司的应用需求;

<think>嗯,用户问的是关于MySQL主库的配置,具体参数包括binlog-do-db、binlog-ignore-db、log-bin等等。首先,我需要确认每个参数的作用,以及它们如何影响主库和复制的行为。 用户提供的配置中有几个关键点需要注意。首先是binlog-do-db和binlog-ignore-db,这两个参数控制哪些数据库的变更会被记录到二进制日志中。binlog-do-db=bcrf意味着只有bcrf数据库的变更会被记录,而其他被忽略的数据库如mysql、performance_schema等则不会。不过,根据我的知识,binlog-do-db和binlog-ignore-db在某些情况下可能会有冲突,需要确认MySQL如何处理这些冲突,通常如果有binlog-do-db存在,binlog-ignore-db可能被忽略,所以这里可能只记录bcrf数据库的变更。 接下来是log-bin=mysql-bin和server-id=2,这是启用二进制日志并设置服务器ID,这是主从复制的基本配置。server-id必须是唯一的,确保主库和从库的ID不同,这里设置为2是正确的。 然后是复制相关的参数,如replicate-do-db和replicate-ignore-db。但这里有一个疑问,因为replicate-*参数通常是在从库上设置的,用于控制从库应用哪些数据库的变更。主库上设置这些参数可能没有效果,或者可能是用户误将主从配置混在一起了。需要指出这一点,避免用户配置错误。 expire_logs_days=30之前已经介绍过,这里需要再次提及,并提醒在MySQL 8.0及以上版本已被废弃,改用binlog_expire_logs_seconds。 log-slave-updates=1这个参数通常用于级联复制,即从库作为其他从库的主库时,需要记录自己的二进制日志。但主库设置这个参数是否有必要呢?主库本身已经是写入源,可能不需要这个参数,除非主库同时也是另一个主库的从库,形成双主结构。需要询问用户是否在这样的环境中,否则可能不需要配置。 GTID相关的参数,gtid-mode=on和enforce-gtid-consistency=on,这些是启用全局事务标识符,有助于简化复制管理和故障恢复。需要确认用户是否了解GTID的使用,以及是否所有服务器都启用了GTID,避免兼容性问题。 另外,用户可能是在配置主从复制时,混淆了主库和从库的参数。比如replicate-do-db等参数应该是在从库配置,主库上设置这些可能无效。需要指出这点,并建议用户检查配置是否正确。 最后,用户可能有多个数据库,但只希望复制bcrf,而忽略系统数据库。需要确认这样的配置是否满足需求,以及是否存在潜在的问题,比如跨数据库的事务或语句可能被忽略,导致数据不一致。 总结来说,我需要一步步解释每个参数的作用,指出可能的配置错误,提醒版本兼容性问题,并给出优化建议,确保用户正确配置主从复制,避免常见陷阱。</think>以下是针对您提供的主库配置参数的详细分析,分模块说明其功能、注意事项及潜在优化点: --- ### 一、二进制日志控制模块 #### 1. **`binlog-do-db=bcrf`** - **作用**:仅记录指定数据库(`bcrf`)的变更到二进制日志。 - **风险**:若事务跨多个数据库(如同时操作 `bcrf` 和 `other_db`),**仅 `bcrf` 的变更会被记录**,可能导致主从不一致。 - **建议**:慎用此参数,推荐通过应用层隔离多库操作,或改用 `binlog-format=ROW` + 过滤规则。 #### 2. **`binlog-ignore-db` 系列参数** - **作用**:忽略系统库(`mysql`、`sys` 等)的变更记录。 - **合理性**:系统库通常无需复制,但需注意: - `mysql` 库中用户权限变更**不会同步到从库**,需手动处理。 - 若从库需要完全一致的权限,需禁用此参数。 --- ### 二、复制基础配置模块 #### 1. **`log-bin=mysql-bin`** - **作用**:启用二进制日志,文件名前缀为 `mysql-bin`。 - **优化建议**:可指定路径避免与数据文件争抢 I/O: ```ini log-bin=/var/lib/mysql-logs/mysql-bin ``` #### 2. **`server-id=2`** - **要求**:主从环境中每个实例的 `server-id` 必须唯一,此配置正确。 --- ### 三、复制过滤模块(主库配置异常) #### 1. **`replicate-do-db` 与 `replicate-ignore-db`** - **问题定位**:`replicate-*` 参数属于**从库配置**,在主库设置**无效且冗余**。 - **正确用法**: - 主库通过 `binlog-do-db` 控制日志记录范围。 - 从库通过 `replicate-do-db` 过滤需同步的库。 --- ### 四、日志管理模块 #### 1. **`expire_logs_days=30`** - **作用**:自动清理 30 天前的二进制日志(需配合 `PURGE BINARY LOGS` 或日志轮换触发)。 - **兼容性**:MySQL 8.0+ 已弃用,建议替换为: ```ini binlog_expire_logs_seconds = 2592000 # 30天 ``` #### 2. **`log-slave-updates=1`** - **适用场景**:主库同时作为其他从库的上级节点(级联复制)。 - **必要性**:若主库无级联需求,可关闭此参数以减少日志量。 --- ### 五、GTID 模块 #### 1. **`gtid-mode=on` 与 `enforce-gtid-consistency=on`** - **优势**: - 自动跟踪事务,避免传统复制中 `binlog` 位置不一致问题。 - 支持故障切换后快速重建复制链路。 - **要求**: - 所有主从节点均需启用 GTID。 - 禁止非事务性操作(如 MyISAM 表写入),否则触发错误。 --- ### 六、潜在问题与优化建议 #### 1. **过滤规则冲突** - **现象**:`binlog-do-db` 和 `binlog-ignore-db` 同时存在时,MySQL **优先匹配 `binlog-do-db`**,其他忽略规则失效。 - **建议**:统一使用 `binlog-do-db` 或 `binlog-ignore-db`,避免混用。 #### 2. **跨库操作风险** - **案例**:执行 `USE mysql; INSERT INTO bcrf.table1 ...` 时,因 `binlog-do-db=bcrf`,**该语句不会被记录**,导致从库丢失数据。 - **解决方案**:使用 `ROW` 格式日志,或在应用层规范数据库上下文切换。 #### 3. **监控与维护** - **关键命令**: - 检查未清理的旧日志: ```sql SHOW BINARY LOGS; ``` - 验证 GTID 状态: ```sql SHOW GLOBAL VARIABLES LIKE 'gtid_executed'; ``` --- ### 七、配置总结 | 模块 | 核心参数 | 推荐操作 | |---------------------|----------------------------------|----------------------------------| | 二进制日志过滤 | `binlog-do-db`、`binlog-ignore-db` | 评估跨库操作风险,必要时改用 `ROW` 格式 | | 复制链路 | `server-id`、`log-bin` | 确保路径隔离与 ID 唯一性 | | 日志保留策略 | `expire_logs_days` | 升级到 8.0+ 时迁移到秒级参数 | | GTID 配置 | `gtid-mode`、`enforce-gtid-consistency` | 全节点启用,禁用非事务引擎 | 如需进一步调整配置,建议提供业务场景(如数据量、复制拓扑)以便定制优化方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值