当前位置:   article > 正文

MySQL主从配置-之GTID复制【第二篇】_grid主从复制

grid主从复制

学习本篇内容之前:建议先看一下windows中MySQL主从配置【第一篇】_Super乐的博客-CSDN博客windows中MySQL主从配置详细教程https://blog.csdn.net/wplblog/article/details/126935242?spm=1001.2014.3001.5502

        1、MySQL 5.6之前只支持传统复制,即 基于二进制日志文件和位置的复制,在5.6及之后的版本中,出现了基于GTID的复制。

       2、传统复制,也可以称为基于二进制日志文件和位置的复制,在从库中配置复制时,要求指定从库中获取的二进制日志文件(binlog file)和位置(binlog position),

以便从库中的复制线程启动时,能够以指定的二进制日志和位置为起点,持续读取主库中的二进制日志,并在从库中应用,从而达到数据库同步的目的。

       3、基于GTID的复制,是新的事务复制方法,利用GTID可以自动在主库寻找需要复制的二进制日志记录,因此不需要关心日志文件或位置,极大地简化了许多常见的复制任务。

        4、GTID( Global Transaction Identifier)全局事务标识,由主库上生成的与事务绑定的唯一标识,这个标识不仅在主库上是唯一的,在MySQL集群内也是唯一的。

        5、GTID是 MySQL 5.6 版本引入的一个有关于主从复制的重大改进,相对于之前版本基于Binlog文件+Position的主从复制,基于GTID的主从复制,数据一致性更高,主从数据复制更健壮,主从切换、故障切换不易出错,很少需要人为介入处理。

        6、GTID之前的主从复制是基于文件+偏移的方式,建立主从复制,必须先知道主库的binlog文件和偏移位置( MASTER_LOG_FILE 和 MASTER_LOG_POS)。

而使用基于GTID的主从复制,设置 MASTER_AUTO_POSITION =1,从库发送自身已经接收到的gtid给主库,主库将从库缺失的gtid及其对应的binlog文件发送给从库,也就是主库只发送从库没有接收到的事务。

        7、所有的信息由MySQL集群自动获取完成,不需要人为干预,大大简化了复制搭建过程。

MySQL 5.7.x 及之后的版本新增了一张InnoDB存储引擎的mysql.gtid_executed表来持久化GTID信息

第一步:修改主库配置,并重新启动MySQL服务

  1. //在MySQL配置文件中添加
  2. [mysqld]
  3. #GTID复制
  4. gtid-mode=on
  5. #enforce-gtid-consistency打开导致的update更新失败
  6. enforce-gtid-consistency=true

链接MySQL查看 master 的状态

1、未配置 GTID 之前,show master status 状态的结果,Executed_Gtid_Set: 是空的

2、 配置 GTID 以后,再次 show master status 状态的结果,Executed_Gtid_Set: 是有值的

 第二步:修改从库配置,并重启MySQL3服务

  1. [mysql]
  2. default-character-set=utf8
  3. [mysqld]
  4. port = 3307
  5. basedir=D:\mysql5.7.39winx64
  6. datadir=D:\mysql5.7.39winx64\data
  7. max_connections=200
  8. character-set-server=utf8
  9. default-storage-engine=InnoDB
  10. #服务的唯一编号
  11. server-id=2
  12. #开启mysql binlog功能
  13. log-bin=mysql-bin
  14. #binlog记录内容的方式,记录被操作的每一行
  15. binlog_format=mixed
  16. # 减少记录日志的内容,只记录受影响的列
  17. binlog_row_image=minimal
  18. replicate_wild_ignore_table=mysql.%
  19. replicate_wild_ignore_table=performance_schema.%
  20. replicate_wild_ignore_table=information_schema.%
  21. #GTID复制
  22. gtid_mode=on
  23. #enforce-gtid-consistency打开导致的update更新失败
  24. enforce-gtid-consistency=true
  25. [client]
  26. port=3307
  27. default-character-set=utf8

 重点:主库和从库都需要下面两行的配置
#GTID复制
gtid_mode=on
#enforce-gtid-consistency打开导致的update更新失败
enforce-gtid-consistency=true

开启GTID后,就不在使用传统的复制方式了;GTID和传统复制方式的mysql实例是不能复制数据的,要么都是GTID,要么都是传统的复制方式;

在从库中执行一下SQL:

  1. mysql> stop slave;
  2. mysql> CHANGE MASTER TO MASTER_HOST='127.0.0.1',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='root',master_auto_position=1;
  3. mysql> start slave;
  4. mysql> show slave status\G;

 参数说明:

  1. master_host #主库IP
  2. master_user #同步账号
  3. master_password #同步账号的密码
  4. master_auto_position=1; #自动 position 号(偏移值)【不用填写binlog & position】

查看 slave 库状态,发现 Retrieved_Gtid_Set: 和  Executed_Gtid_Set: 都以有值了。

发现主库和从库的GTID是一致的就没问题

MySQL GTID复制模式有哪些限制

1.更新操作涉及非事务引擎

在同一个事务中,不能同时操作支持事务(InnoDB)和不支持事务(MyISAM)的引擎。

这是由于同时操作这两类引擎时可能导致将多个GTID被分配给同一个事务。

主从数据库Server中相同的表使用不同的存储引擎时(其中,一个Server使用事务表,另一个Server使用非事务表),如果在非事务表上定义了触发器,可能导致事务与GTID之间一一对应关系被破坏。

2.CREATE TABLE .. SELECT 语句

使用GRID复制时,CREATE TABLE ...语句不允许同时使用SELECT语句。

当binlog_format设置statement时,CREATE TABLE ... SELECT语句是作为一个整体且只分配一个GTID的事务形式被记录在二进制日志中。

如果主库使用statement格式二进制日志,而从库使用row格式的二进制日志,则从库将无法正确处理事务。

3.临时表

使用GTID时(这里指的是系统变量enforce_gtid_consistency设置为ON时),事务、存储过程、存储函数和触发器内不支持CREATE TEMPORARY TABLE和DROP TEMPORARY TABLE语句,

不过可以在这些对象之外执行CREATE TEMPORARY TABLE和DROP TEMPORARY TABLE语句,当需要使用autocommit = 1自动提交。

4.防止执行不受支持的语句

要防止执行会导致GTID复制失败的语句,则需要在启动GTID时,在整个复制拓扑的所有实例中启用系统变量enforce_gtid_consistency。

当启用此系统变量之后,上述可能会导致复制出现问题的语句将直接报错,不予执行。

5.关于跳过事务

使用GTID时不支持使用系统变量sql_slave_skip_counter来跳过事务。

6.忽略Server实例

使用GTID时,不推荐在CHANGE MASTER TO语句中使用IGNORE_SERVER_IDS选项来忽略某个Server实例的二进制日志变更,因为在GTID复制模式下,已经应用的事务会自动被忽略。

在启动GTID复制之前,请检查并清除该选项的设置。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/989284
推荐阅读
相关标签
  

闽ICP备14008679号