想要了解这个问题的原因在于有一次面试的时候,面试官问我一个问题,就是MySQL的双主复制的时候是如何避免回环复制这个问题的,说老实话在基于GTID复制的时候我还是比较了解的,因为GTID复制是MySQL本身是不会执行已经执行过的GTID事务,即使MySQL本身并不会执行已经执行过的GTID事务,但是还是会形成一个回环复制。那么MySQL到底是如何解决回环复制的呢?

猜想

在我们搭建主从的时候我们可以清楚的知道,要想成功的搭建主从,那么主从的server_id必须不能一模一样的,所以猜想可能是因为server_id的原因。

在MySQL 5.5以及一切,我们搭建一主多从的时候,假如slave使用了相同的server_id就会发现在master和slave上面发现slave会经常的断开重连,这个是因为slave在注册的时候会去比对server_id,假如server_id存在的话则会有一个删除操作,但是MySQL 5.6的版本以后引入了uuid,它会优先去比对uuid,假如不存在的话则会去比对server_id。所以在MySQL5.6以及以后是因为uuid的原因呢。

实验

A. 搭建双主。非gtid模式(具体过程不在描述)

master 1

........

........

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 2175

Relay_Log_File: rep_relay_log.000004

Relay_Log_Pos: 283

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

........

master 2

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 3385

Relay_Log_File: rep_relay_log.000004

Relay_Log_Pos: 1235

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

B . master 1 上面执行创建表语句

mysql> show create table test \G

*************************** 1. row ***************************

Table: test

Create Table: CREATE TABLE `test` (

`class_num` int(11) NOT NULL AUTO_INCREMENT,

`class_name` varchar(25) DEFAULT NULL,

PRIMARY KEY (`class_num`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4

1 row in set (0.00 sec)

C. master 1和2上面分别插入部分数据进行验证。

+-----------+------------+

| class_num | class_name |

+-----------+------------+

| 4 | 物理 |

| 5 | 化学 |

| 6 | 生物 |

| 7 | 体育 |

| 8 | 123 |

+-----------+------------+

D. master 1 上面执行

mysql> stop slave;

mysql> set global server_id=3306;

mysql> start slave;

E. master 2上面执行

mysql> stop slave;

mysql> set global server_id=3307;

mysql> start slave;

F. master 1 上面执行

mysql> insert into test(class_name) values(‘321‘);

G. master 1上面观察

mysql > show slave status;

......

Last_SQL_Error: Error ‘Duplicate entry ‘9‘ for key ‘PRIMARY‘‘ on query. Default database: ‘test‘. Query: ‘insert into test(class_name) values(‘321‘)‘

Replicate_Ignore_Server_Ids:

......

H. master 1上面执行下面命令,你会发现还是会有这个错误。

mysql> delete from test where class_num=9;

mysql> start slave;

mysql> show slave status;

......

Last_SQL_Error: Error ‘Duplicate entry ‘9‘ for key ‘PRIMARY‘‘ on query. Default database: ‘test‘. Query: ‘insert into test(class_name) values(‘321‘)‘

......

I. 解析binlog日志信息:

#181204 16:15:00 server id 3306 end_log_pos 2762 CRC32 0xad6f9e83 Intvar

SET INSERT_ID=9/*!*/;

#181204 16:15:00 server id 3306 end_log_pos 2878 CRC32 0x5cf6d5f2 Query thread

_id=54 exec_time=124 error_code=0

SET TIMESTAMP=1543911300/*!*/;

insert into test(class_name) values(‘321‘)

/*!*/;

# at 2878

#181204 16:15:00 server id 3306 end_log_pos 2909 CRC32 0x9ccd43ee Xid = 139

COMMIT/*!*/;

# at 2909

#181204 16:30:52 server id 52213306 end_log_pos 2988 CRC32 0xc9831ff7 Query thread

_id=54 exec_time=0 error_code=0

SET TIMESTAMP=1543912252/*!*/;

BEGIN

/*!*/;

# at 2988

#181204 16:30:52 server id 52213306 end_log_pos 3096 CRC32 0x37f9c65e Query thread

_id=54 exec_time=0 error_code=0

SET TIMESTAMP=1543912252/*!*/;

delete from test where class_num=9

/*!*/;

# at 3096

#181204 16:30:52 server id 52213306 end_log_pos 3127 CRC32 0xc68f6eae Xid = 151

COMMIT/*!*/;

# at 3127

#181204 16:15:00 server id 3306 end_log_pos 3206 CRC32 0xd5fc40b3 Query thread

_id=54 exec_time=959 error_code=0

SET TIMESTAMP=1543911300/*!*/;

BEGIN

/*!*/;

# at 3206

# at 3238

#181204 16:15:00 server id 3306 end_log_pos 3238 CRC32 0x52663932 Intvar

SET INSERT_ID=9/*!*/;

#181204 16:15:00 server id 3306 end_log_pos 3354 CRC32 0xc642ad10 Query thread

_id=54 exec_time=959 error_code=0

SET TIMESTAMP=1543911300/*!*/;

insert into test(class_name) values(‘321‘)

/*!*/;

# at 3354

#181204 16:15:00 server id 3306 end_log_pos 3385 CRC32 0xd5e2ad2a Xid = 155

COMMIT/*!*/;

DELIMITER ;

# End of log file

可以明显得看得到 insert into test(class_name) values(‘321‘); 这条SQL执行了好多次,这个时候明显可以验证在非GTID复制得情况下面是由于server_id才避免了回环复制。

结论

在进行修改uuid得时候发现这是一个只读参数,不能在修改。并且uuid是MySQL初始化得时候先去auto.cnf文件里面查找,若不存在则会随机生成一串随机码,所以可以直接去除这个。再上面得实验中可以获取得到MySQL再非GTID下面是由server_id得原因才避免了回环复制的,但是GTID环境下面会不会也是因为server_id的原因呢,暂时就没有去验证了。不过我还是认为gtid下面也是因为GTID的原因。

原文:http://blog.51cto.com/11819159/2326030

mysql避免回环复制_【20181204】 MySQL 双主复制是如何避免回环复制的相关推荐

  1. mysql 远程复制_关于mysql的复制

    概述 复制允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器). 默认情况下,复制是异步的 从站不需要永久连接以接收来自主站的更新. 根据配置,您可 ...

  2. mysql 基于gtid复制_深入MySQL复制(二):基于GTID复制

    相比传统的MySQL复制,gtid复制无论是配置还是维护都要轻松的多.本文对gtid复制稍作介绍. 1.gtid基本概念 传统的基于binlog position复制的方式有个严重的缺点:如果slav ...

  3. mysql ab复制_实现mysql的ab复制(a-b-b,a-b-c)

    实验环境准备: 三台虚拟机,IP分别为master: 192.168.2.1   slave:192.168.2.2   slave1:192.168.2.3 将192.168.2.1的主机做为mys ...

  4. mysql 多线程并行复制_【MySQL】开启并行复制

    [MySQL]开启并行复制 一.介绍 在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高.TPS 高时就会出现严重的主备延迟问题. 如果备库执行日志的速度持续低于主库生成日志的 ...

  5. mysql和python的关系_八MySQL与Python

    <1>数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. ...

  6. mysql 自动化运维工具_部署MySQL自动化运维工具inception+archer

    *************************************************************************** 部署MySQL自动化运维工具inception+ ...

  7. mysql MDL锁如何解决_理解MySQL的MDL元数据锁

    一.MDL锁的作用 MySQL DBA 对于 Waiting for table metadata lock 肯定不会陌生,一般都是进行 alter 操作时被堵住了,导致了我们在 show proce ...

  8. mysql查看当前表字符集_查看mysql字符集及修改表结构--表字符集,字段字符集

    MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令.包括查看 MySQL 数据库服务器字符集.查看 MySQL 数据库字符集,以及数据表和字段的 ...

  9. MySQL数据库实用教程考核_《MySQL数据库实用教程》郑明秋,蒙连超,赵海侠【pdf】...

    内容简介 郑明秋.蒙连超.赵海侠主编的<MySQL数据库实用教程>是作者在多年的数据库开发实践与教学经验的基础上,根据计算机相关专业的职业岗位能力需求及学生的认知规律倾心组织编写的.本教材 ...

  10. mysql sa密码是什么_忘记mysql数据库root密码

    找到配置文件my.ini  ,然后将其打开,可以选择用记事本打开,查找的方法如下: 打开后,搜索mysqld关键字 找到后,在mysqld下面添加skip-grant-tables,保存退出. PS: ...

最新文章

  1. agc007B - Construct Sequences(构造)
  2. stealwatch里的安全功能——ETA结果会显示加密套件以及key长度,还有流量大小(例如41MB)...
  3. Python 技巧篇-同一个方法多次引用不同效果功能实现,可选参数设置方法
  4. 获取的输入内容,没有被P标签包裹的文本和元素进行处理
  5. 将txt文件的编码格式进行修改
  6. 【Java】模拟分组交换网络的时延、丢包
  7. javascript 无法修改 数组中对象_如何使用JavaScript中的Date对象
  8. OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章)
  9. pdf虚拟打印机下载win7_如何将不同形式的PDF文档进行压缩?
  10. macosx安装之旅(8)-常见问题(转载)
  11. 线性目标规划(线性目标规划、图解法、单纯形法)
  12. 3D游戏编程与设计-游戏分类与热点探索
  13. kafka(15) Kafka Connect
  14. 3060ti海力士测试
  15. CISCO CPOS STM配置示例
  16. 关于PL2303用于STC单片机下载的讨论
  17. 《ARPG游戏深度强化学习 》序贯决策问题、完成ARPG世界里的游戏代码实践
  18. 联想万全t260磁盘阵列_联想万全T168服务器板载Sata+raid系统设置图解
  19. UACANet: Uncertainty Augmented Context Attention for Polyp Segmentation代码补充
  20. 深度解析做亚马逊无货源店群必知点

热门文章

  1. HDU 2833 WuKong
  2. Python if条件判断
  3. android的armeabi和armeabi-v7a
  4. C# .Net中的类型转换
  5. MAC卸载java 12.0.2
  6. 获取安卓应用APK包名的方法
  7. 使用JDBC处理MySQL大数据
  8. 【下载】推荐一款免费的人脸识别SDK
  9. freemarker的测试结果框架_TestNG框架Listener介绍及测试结果的收集
  10. my.ini修改后服务无法启动_VisualSVN Server 自助修改密码页面