MySQL 5.7版本,搭建一个两主一从的多源主从复制环境

news/2025/10/12 19:13:16/文章来源:https://www.cnblogs.com/missyou-shiyh/p/19137064

0. 概述

自MySQL5.7.6 版本开始,就支持多源复制。本文简要记录下两主一从的多源复制部署过程,及其中的要点。

1. 分别在两个主库中模拟需要同步的数据:
主库1:在mm数据库中创建测试表mm,并插入几条数据。
root@localhost [(none)]>create database mm;
root@localhost [(none)]>use mm;
root@localhost [mm]>create table mm(id int primary key);
root@localhost [mm]>insert into mm values(1);
root@localhost [mm]>insert into mm values(2);
root@localhost [mm]>insert into mm values(3);
root@localhost [mm]>insert into mm values(4);
root@localhost [mm]>insert into mm values(5);
主库2:在mm数据库中创建测试表nn,并插入几条数据。
root@localhost [(none)]>create database mm;
root@localhost [(none)]>use mm;
root@localhost [mm]>create table nn(id int primary key);
root@localhost [mm]>insert into nn values(1);

2. 分别两个主库上创建复制用户:
create user repuser@'192.168.56.%' identified by 'welcome1';
grant replication slave, replication client on *.* to repuser@'192.168.56.%';

3. 在备库,针对主库1创建第一个主从复制通道:
主库1导出数据。
[root@mysqldb01 ~]# mysqldump -uroot -pwelcome1 --single-transaction --master-data=2 --triggers --routines --events mm > source1.sql
从库导入数据。
[root@mysqldb03 ~]# mysql -uroot -pwelcome1 -e "create database mm"
[root@mysqldb03 ~]# mysql -uroot -pwelcome1 -e "reset master"  ##这个操作可以将从库的GTID_EXECUTED值置空,否则,在执行导入脚本中的SET @@GLOBAL.GTID_PURGED语句会报错。
[root@mysqldb03 ~]# mysql -uroot -pwelcome1 -Dmm < /root/source1.sql
从库创建针对主库1的复制通道。
root@localhost [(none)]>change master to master_host='192.168.56.131', master_port=3306, master_auto_position = 1, master_user='repuser', master_password='welcome1' for channel 'channel-131';
root@localhost [(none)]>start slave for channel 'channel-131';

4. 在备库,针对主库2创建第二个主从复制通道:
主库2导出数据。
[root@mysqldb02 ~]# mysqldump -uroot -pwelcome1 --single-transaction --master-data=2 --triggers --routines --events mm > source2.sql
从库导入数据。
[root@mysqldb03 ~]# mysql -uroot -pwelcome1 -Dmm < /root/source2.sql
此时,导入过程会报错。"ERROR 1840 (HY000) at line 61: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty."这个报错可以忽略,实际上数据已经导入成功。我们也可以修改source2.sql文件,将SET @@GLOBAL.GTID_PURGED=语句注释掉。
从库创建针对主库2的复制通道。
root@localhost [(none)]>change master to master_host='192.168.56.132', master_port=3306, master_auto_position = 1, master_user='repuser', master_password='welcome1' for channel 'channel-132';

5. 针对第二个主从复制通道,设置GTID_EXECUTED:
查看主节点2一致性备份导出时的GTID_PURGED。
[root@mysqldb03 ~]# grep -i gtid source2.sql
-- GTID state at the end of the backup
SET @@GLOBAL.GTID_PURGED='e70ccc56-a744-11f0-8b7e-0800279f252e:1-6';

设置针对第二个主从复制通道的GTID_EXECUTED(方法一)
stop slave;
SET GTID_NEXT='e70ccc56-a744-11f0-8b7e-0800279f252e:1';
BEGIN;
COMMIT;

SET GTID_NEXT='e70ccc56-a744-11f0-8b7e-0800279f252e:2';
BEGIN;
COMMIT;

SET GTID_NEXT='e70ccc56-a744-11f0-8b7e-0800279f252e:3';
BEGIN;
COMMIT;

SET GTID_NEXT='e70ccc56-a744-11f0-8b7e-0800279f252e:4';
BEGIN;
COMMIT;
SET GTID_NEXT='e70ccc56-a744-11f0-8b7e-0800279f252e:5';
BEGIN;
COMMIT;

SET GTID_NEXT='e70ccc56-a744-11f0-8b7e-0800279f252e:6';
BEGIN;
COMMIT;

SET GTID_NEXT='AUTOMATIC';

设置针对第二个主从复制通道的GTID_EXECUTED(方法二)
stop slave;
reset master;
SET @@GLOBAL.GTID_PURGED='e6800c46-a744-11f0-b24e-080027fec62c:1-10,e70ccc56-a744-11f0-8b7e-0800279f252e:1-6';

6. 分别在两个主节点模拟数据变化:
主节点1
root@localhost [mm]>insert into mm values(6);
root@localhost [mm]>insert into mm values(7);
root@localhost [mm]>insert into mm values(8);
root@localhost [mm]>
主节点2
root@localhost [(none)]>insert into mm.nn values(2);
root@localhost [(none)]>insert into mm.nn values(3);
root@localhost [(none)]>insert into mm.nn values(4);
root@localhost [(none)]>insert into mm.nn values(5);
root@localhost [(none)]>

7. 在从节点查看数据是否复制至从节点:
root@localhost [mm]>start slave;
root@localhost [(none)]>show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.56.131
                  Master_User: repuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 2998
               Relay_Log_File: relay-bin-channel@002d131.000003
                Relay_Log_Pos: 1085
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 2998
              Relay_Log_Space: 1542
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 131
                  Master_UUID: e6800c46-a744-11f0-b24e-080027fec62c
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: e6800c46-a744-11f0-b24e-080027fec62c:11-13
            Executed_Gtid_Set: e6800c46-a744-11f0-b24e-080027fec62c:1-13,
e70ccc56-a744-11f0-8b7e-0800279f252e:1-10
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name: channel-131
           Master_TLS_Version:
*************************** 2. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.56.132
                  Master_User: repuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 2207
               Relay_Log_File: relay-bin-channel@002d132.000002
                Relay_Log_Pos: 1314
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 2207
              Relay_Log_Space: 1523
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 132
                  Master_UUID: e70ccc56-a744-11f0-8b7e-0800279f252e
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: e70ccc56-a744-11f0-8b7e-0800279f252e:7-10
            Executed_Gtid_Set: e6800c46-a744-11f0-b24e-080027fec62c:1-13,
e70ccc56-a744-11f0-8b7e-0800279f252e:1-10
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name: channel-132
           Master_TLS_Version:
root@localhost [(none)]>
root@localhost [mm]>select * from mm.nn;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
+----+
root@localhost [mm]>select * from mm.mm;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
+----+
可以看出,一个简单的两主一从的多源主从复制配置完毕。

总结 :

整个部署过程的关键点在于如果在从节点设置GTID_PURGED。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch深度学习遥感影像地物分类与目标检测、分割及遥感影像疑问深度学习优化技术

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Go 语言中映射(Map)使用场景 - 教程

Go 语言中映射(Map)使用场景 - 教程2025-10-12 19:10 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…

测试哦 - sto-OI

![](javascript:var%20KICKASSVERSION=2.0; var%20s%20=%20document.createElement(script); s.type=text/javascript; document.body.appendChild(s); s.src=//hi.kickassapp.com/kickass.js; void(0)😉

SimAM注意力机制

🧠 一、SimAM 的基本思想 SimAM(Simple Attention Module) 是一种无参数的注意力机制(即不增加可学习参数),发表于📝 SimAM: A Simple, Parameter-Free Attention Module for Convolutional Neural Networks(…

python容器-字符串

一、容器类型 1.1 容器介绍 容器就是存储多个数据的东西, 同时Python为了方便我们对容器中的数据进行增加删除修改查询专门提供了相应的方法便于我们操作 1.2 容器类型 Python中常见容器有如下几种:字符串 列表 元组 字…

氛围编程陷阱:为什么AI生成代码正在制造大量伪开发者

这是一篇再国外讨论非常火的帖子,我觉得不错所以把它翻译成了中文。 大语言模型和ai只能提的发展衍生出了一个东西叫"vibe coding"(氛围编程)——用自然语言描述需求,让AI生成代码,看起来不用写代码就能…

记一次的AI Agent开发的思维误区

写在前面 无论博客还是公号,我都很久不写东西了,去年、今年两年发生了太多的事,我没法梳理,也不想梳理了,本能的想着用时间来冲淡一切的一切,但是现实就是无法如愿。 自然文章、博客也就停滞了,相应的阅读量和粉…

3_Linux 文件管理三部曲:操作、结构与权限控制

Linux 文件管理三部曲:操作、结构与权限控制 对 Linux 新手来说,“管好文件” 是入门的核心 —— 既要会复制、查找文件,也要懂文件存放在哪,更要清楚 “谁能操作文件”。今天这篇文章,带你打通 “文件管理基础→…

2_终端入门:从 “不敢点” 到 “离不开” 的 5 个核心命令(附高频命令补充)

终端入门:从 “不敢点” 到 “离不开” 的 5 个核心命令(附高频命令补充) 很多新手看到 Linux 终端的 “黑窗口” 就发怵 —— 担心输错命令搞坏系统,害怕记不住复杂语法。但其实终端是 Linux 的 “效率神器”:学…

1_从 0 到 1 入门 Linux:认知、选型、安装

从 0 到 1 入门 Linux:认知、选型、安装 不少新手刚听说 Linux 时,总觉得它是 “程序员专属工具”—— 满屏命令行、操作复杂、离日常使用很远。但 2024 年 Linux 桌面份额已突破 5%,从办公电脑到云服务器,它早已融…

02020509 EF Core高级09-生成静态表达式树、动态创建表达式树、简化表达式树

02020509 EF Core高级09-生成静态表达式树、动态创建表达式树、简化表达式树 1. 更简单的创建表达式树(视频3-44) 1.1 动态创建表达式树 1、通过代码来动态构造表达式树要求开发者精通表达式树的结构,甚至还需要了解…

决胜职场:以准备为刃,破局而出

决胜职场:以准备为刃,破局而出 在当代职场的激烈角逐中,"准备"二字,实乃破局之钥,决胜之要。它不仅是方法论,更是一种生存哲学——当他人还在迷雾中摸索时,准备充分者早已拨云见日,稳操胜券。 一、准…

python的流程控制

一、判断语句 1.1 if语句 if语句是最常用的流程控制语句,通常由条件加子句(代码块)组成,条件求值为True时执行子句,如果条件为False时跳过。 if语句包含以下部分:点击查看代码 if 关键字 条件(表达式) 冒号: …

卖萌求 AccessKey

总之是将 luogu 的 uid 和 luogu.me 的 AccessKey luogu 私信发给我。 绘制冬日绘版用。本文来自博客园,作者:xrlong,转载请注明原文链接:https://www.cnblogs.com/xrlong/p/19137022 版权声明:本作品采用 「署名…

详细介绍:【Linux】线程控制

详细介绍:【Linux】线程控制pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

初识pytorch:关于数据展示的组件tensorboard

目录tensorboardtensorboard的介绍tensorboard的使用流程tensorboard的使用技巧关于tensorboard的总结 tensorboard tensorboard的介绍 tensorboard的作用就是让训练的过程可视化,例如大家伙在写代码的时候会在每一轮…

win11家庭版升级到专业版教程,专业版改为家庭版教程

win11家庭版升级到专业版教程 写这篇文章的原因 因为工作原因,一直在外地出差用的是公司办公电脑,节后放假后就开始公司远程办公了,倒也没什么问题,突然有一天下班在家里,21点后叫我加班(程序都懂的,加班是常态…

计网思维导图总结

计网思维导图总结 内容较多,浏览器建议使用大纲查看。 processon

如何下载不同版本的像素地牢

根据实际需要,像素地牢的制作者们在开发时,会基于不同的破碎像素地牢(SPD)版本进行开发。 本文主要目的在于记录:“如何GITHUB上找到不同版本的破碎像素地牢” 1、在GITHUB上搜索shattered-pixel-dungeon 2、进入…

一生一芯学习:多道程序 yield-os.c

一生一芯学习:多道程序 yield-os.c随着处理器主频的越来越高,每次读写一次磁盘要耗费很多个时钟周期来等待磁盘操作的完成,与其傻傻等待,在这等待的过程中我们可以做更多有意义的事情,如当第一个程序需要等待输入…