模拟Mysql主从复制不一致及解决方法

本文模拟了在增强半同步复制模式下,主从数据库因异常导致数据不一致的情况。通过详细步骤展示了如何处理主库宕机后数据层的不一致问题,包括调整GTID、数据校正及恢复主从复制关系。

模拟异常,数据不一致情况(主从复制关系为增强半同步)

 

1,主库操作,查看t1表记录

2,从库操作,查看信息,并停止主从复制关系,目的是不让主库日志传送到从库

3,主库操作,插入记录,无法提交,hang状态,因为无法得到从库的ack认证返回结果

4,这个时候我们把主库进程kill,模拟宕机情况

主库报错如下

5,从库,提升为主库,停止从库接受日志(前面已经停止复制关系,这里不需要操作)

 

6,这个时候我们再次启动主库,查看原主库记录,多了一条记录,原因上面已经提过了,数据库在重启后会跳过ack验证,引擎层进行提交。

7,查看从库依然只有一条记录,这个是必然的,因为日志根本没有传送过来。

这样就会出现数据层的数据不一致,但应用层是可以保持一致的,因为当原主库异常后,应用报错,该记录插入失败,当主从切换后,只要在新主上重新执行一次即可,因为新主库没有记录,所以执行没有任何问题。

但如果这个时候原主库建立和新主库的复制关系就会出现原主库出现两个重复的记录,如果是主键那么就会出现复制报错的情况。

所以要想让原主库加入到新主库的复制关系中

  1. 删除原主库多出来的记录
  2. 新主库跳过原主库不需要同步的事物gtid
  3. 新主库追平原主库gtid

 

 

1,查看原主库信息,事物号已经到4,也就是多出的记录事物号

2,查看新主库库信息(当原主库故障时的作为从库的信息),可以看到执行事物号到3,比原主库少了一个事物号,也就是少的那条记录。

Show slave status;

3,首先我们要做的就是,删除原主库多余的记录,删除前先要把半同步关闭(避免长时间无法提交的情况),再次查看执行事物号已经到了5

4,其次我们在新主库跳过不需要同步的事物gtid, 并补齐gtid

5,查看新主库信息,执行事物号已经到4

Show slave status;

6,再次跳过不需要同步的事物gtid, 并补齐gtid

7,再次查看,执行事物号已经到了5,这样就跳过了事物4(多的记录),事物5(删除记录),新主库和原主库数据一致,gitd追平

Show slave status;

8,查询新主库记录

9,查看原主库记录

 

10,原主库建立与新主库复制关系

11,开启新主库半同步

12,新主库插入记录

13,原主库查看信息

14,恢复原来的主从关系,

主库开启

set global rpl_semi_sync_master_enabled=on;

Stop slave;

从库关闭

set global rpl_semi_sync_master_enabled=off;

Start slave;

 

15,主库插入记录

16,从库查看记录

 

均正常,数据一致。

<think>首先,用户的问题是:我想解决MySQL主从复制中从库未正常复制的问题,请问mysql主从复制从库同步原因及解决方案。我需要基于提供的引用来回答。引用的内容有:-[^1]:关于MySQL主从复制中的UUID警告信息解决方案,描述了问题可能的原因。-[^2]:MySQL主从复制集群同步问题的解决方案,包括重置从库和重建从库的步骤。-[^3]:MySQL主从同步延迟问题的全面解决方案,包括临时解决方案、主从切换决策树和预防性维护策略。系统级指令要求:-使用$...$格式的行内数学表达式(但在这个问题中可能涉及数学表达式,所以可能需要)。-独立公式使用$$...$$格式(可能适用)。-LaTeX语法正确(可能适用)。-使用中文回答。-生成相关问题。-在引用的段落末尾自然地添加引用标识,例如[^1]。我的回答需要结构清晰,帮助用户逐步解决问题,保证真实可靠。既然用户提到了“尽可能多的参考用户上一次的问题和你的回答”,但我没有之前的对话记录,所以我需要基于这个query。组织回答:1.**概述问题**:简要描述MySQL主从复制中从库同步的问题。2.**常见原因**:列出从库同步的可能原因。3.**解决方案**:提供解决问题的步骤和方法,基于引用。4.**参考引用**:在相关的地方添加引用标识。5.**生成相关问题**:在回答结束时生成相关问题。常见原因(基于引用和一般知识):-UUID警告或冲突[^1]。-复制错误,如事务冲突。-网络问题或延迟。-数据一致解决方案(基于引用):-重置从库:如[^2]所述,包括创建用户、备份主库、恢复等步骤。-跳过错误:使用STOPSLAVE;SETGLOBALsql_slave_skip_counter=1;STARTSLAVE;[^3]。-重建复制:如[^3]所述,使用mysqldump。-预防性维护:如[^3]中的预防性维护策略。添加引用:在描述的解决方案中引用相关段落。使用中文回答。结构:-先介绍问题和原因。-然后给出解决方案步骤。-最后生成相关问题。相关问题:-基于常见问题,如:如何避免从库同步?如何处理具体的错误?等。可能的SQL相关表达式:由于涉及SQL命令,我会用代码块来显示命令,如引用中的示例。系统指令说所有行内数学表达式必须用$...$,但这主要是关于数学的,对于SQL命令,我应使用代码块或常规描述。在回答中,我会避免数学表达式,专注在文本描述。完整回答框架:1.**问题描述**:解释从库同步的现象。2.**常见原因**:列出可能原因。3.**诊断步骤**:建议如何诊断问题。4.**解决方案**:详细说明解决方案,包括临时和长期。5.**预防策略**:参考引用提供预防性维护。6.**相关问题**:在末尾生成几个相关问题。</think> ### MySQL主从复制从库同步的原因及解决方案 在MySQL主从复制场景中,从库未正常复制(即主库与从库数据同步)是常见问题。这可能导致数据一致性丧失、业务中断或报警触发。问题通常表现为复制延迟、错误日志中报错(如 UUID 冲突或事务冲突),或者同步停止在特定位置。下面,我将基于参考引用和实际经验,逐步帮助您诊断和解决此问题。首先分析常见原因,然后提供详细解决方案,最后给出预防性建议。解决方案参考了相关实践记录[^2][^3]。 --- ### 1. **从库同步的常见原因** 导致MySQL从库复制同步的主要原因包括: - **UUID 冲突**:当主从库的MySQL实例UUID相同时,会触发警告并导致同步中断[^1]。 - **复制错误**:主库的事务在从库上执行失败(如SQL语句冲突、唯一键冲突或表结构一致)。 - **网络延迟或中断**:主从库之间网络稳定,导致事务未及时传输。 - **事务丢失**:主库的binlog文件被清理或异常中断,导致从库无法继续复制。 - **数据一致**:初始同步完整或人为误操作(如直接修改从库数据)。 - **binlog格式问题**:使用了兼容的binlog格式(如ROW vs STATEMENT模式)。 - **系统资源足**:从库服务器资源瓶颈(如内存、磁盘I/O 或CPU)。 这些问题可能通过错误日志查看,例如运行 `SHOW SLAVE STATUS\G` 时显示 `Last_IO_Error` 或 `Last_SQL_Error` 字段值。 --- ### 2. **诊断步骤** 在实施解决方案前,先诊断问题根源: 1. **检查复制状态**: ```sql SHOW SLAVE STATUS\G ``` - 关注 `Slave_IO_Running`、`Slave_SQL_Running`:如果为 `No`,说明复制已停止。 - 分析 `Last_Error` 字段:查看具体错误信息(如UUID冲突或SQL语法错误)。 2. **查看错误日志**: - 在MySQL配置文件中(如 `my.cnf`)设置 `log_error=/var/log/mysql/error.log`,然后检查日志文件。 - 常见错误: `Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs`[^1]。 3. **验证网络连接**: - 测试主从库网络连通性:`ping master_ip` 或 `telnet master_ip 3306`。 4. **评估延迟**: - 使用 `SHOW SLAVE STATUS` 检查 `Seconds_Behind_Master`:值为 `0` 表示无延迟,大于 `0` 表示延迟,`NULL` 表示同步。 诊断后,针对具体原因选择以下解决方案。 --- ### 3. **解决方案** 基于引用[^2]和[^3],我提供两种主要解决方法:**临时修复**(跳过错误)和**完全重建**(重置从库)。选择取决于问题的严重性(如数据量大小和业务影响)。 #### **方案一:临时修复(跳过错误)** 适用于少数事务冲突或临时性错误(如唯一键冲突)。此方法风险较高,可能丢失数据一致性,建议在测试环境预演。 ```sql -- 步骤: -- 1. 停止从库复制 STOP SLAVE; -- 2. 跳过错误事务(跳过1个事务,可调整数字) SET GLOBAL sql_slave_skip_counter = 1; -- 3. 重新启动复制 START SLAVE; -- 4. 验证状态 SHOW SLAVE STATUS\G ``` - **注意事项**:此方法会跳过主库的指定事务,可能导致部分数据缺失,仅用于紧急修复[^3]。 - **引用支持**:类似方案在[^3]中作为临时解决方案描述。 #### **方案二:完全重建从库** 适用于严重数据一致、UUID冲突或无法跳过错误的情况。此方法较安全但耗时,需暂停业务。 ```bash # 步骤: # 1. 在主库创建备份用户(确保有权限) mysql -uroot -p -e "GRANT ALL PRIVILEGES ON *.* TO 'backupuser'@'%' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES;" # 注意:替换 your_password 为实际密码,% 表示允许远程访问[^2]。 # 2. 在主库执行完整备份(使用mysqldump) mysqldump -ubackupuser -pyour_password --single-transaction --master-data=2 --flush-logs -A > /path/to/backup.sql # --single-transaction 确保一致性,--master-data=2 记录主库binlog位置[^2]。 # 3. 将备份文件复制到从库 scp /path/to/backup.sql user@slave_ip:/path/to/ # 4. 在从库停止复制并重置 mysql -uroot -p -e "STOP SLAVE; RESET SLAVE ALL;" # 5. 恢复备份到从库 mysql -uroot -p < /path/to/backup.sql # 6. 重新配置复制链路 # 在备份文件中找到 CHANGE MASTER TO 语句(位于开头),或手动运行: mysql -uroot -p -e "CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl_user', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1234;" # 替换为实际值(MASTER_LOG_FILE 和 MASTER_LOG_POS 从备份文件中提取)。 # 7. 启动复制并验证 mysql -uroot -p -e "START SLAVE; SHOW SLAVE STATUS\G;" ``` - **注意事项**:此过程重建整个从库,适用于UUID冲突或初始配置错误[^1][^2]。确保主从密码一致,并测试网络。 - **引用支持**:该方案基于[^2]的重建从库实操记录,并结合了[^3]的备份建议。 #### **方案三:其他特定场景解决方案** - **UUID冲突问题**:如果 `SHOW SLAVE STATUS` 显示UUID错误。 - 解决:在从库删除 `auto.cnf` 文件(路径如 `/var/lib/mysql/auto.cnf`),然后重启MySQL服务。MySQL会自动生成新UUID。 ```bash rm /var/lib/mysql/auto.cnf service mysql restart ``` - **引用支持**:此方法参考[^1]的UUID警告解决方案。 - **网络或资源问题**:如果延迟持续。 - 解决:优化网络(如使用专线),升级从库硬件,或调整MySQL参数(如 `innodb_flush_log_at_trx_commit=2` 以减少I/O压力)。 - **binlog一致**:如果主库binlog丢失。 - 解决:在主库运行 `PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00';` 清理旧日志后重建复制(谨慎使用)。 --- ### 4. **预防性维护策略** 为避免未来再发,实施长期预防措施: - **定期监控**:使用工具(如 Percona Toolkit 或 Prometheus)监控 `SHOW SLAVE STATUS`。 - **设置主从切换决策树**: - 当延迟发生:评估是否影响业务? - 是 → 是否有紧急修复方案? - 是 → 实施跳过事务或重建[^3]。 - 否 → 触发故障转移。 - 否 → 加强监控和记录[^3]。 - **预防UUID冲突**:在新实例初始化时,检查UUID唯一性(比较主从库的 `SELECT @@server_uuid;`)。 - **备份与测试**:每周全备主库并模拟同步错误。 - **参数优化**:在 `my.cnf` 中设置 `slave_skip_errors=1062` 以跳过重复键错误(推荐,仅限风险可控环境)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值