例证MySQL GTID与MariaDB GTID的不同之处

GTID是全称是Global Transaction Identifier,可简化MySQL的主从切换以及Failover。GTID用于在binlog中唯一标识一个事务。当事务提交时,MySQL Server在写binlog的时候,会先写一个特殊的Binlog Event,类型为GTID_Event,指定下一个事务的GTID,然后再写事务的Binlog。主从同步时GTID_Event和事务的Binlog都会传递到从库,从库在执行的时候也是用同样的GTID写binlog,这样主从同步以后,就可通过GTID确定从库同步到的位置了。

在MySQL 5.6 中,数据库服务器上的每个事务都会被分配一个唯一的事务标示符,它是一个64位非零数值,根据事务提交的顺序分配。GTID有两部分。 第一部分是指服务器UUID。 此UUID是32个字符的随机字符串。 该值取自位于mysql数据目录中的auto.cnf文件。 第二部分是序列。

例如:

在从库上,GTID是单个表达式:

fba30f4d-5815-11e8-9beb-000c2900351f:10

需要了解的是,如果事务从 master 复制到了 slave 端,事务的二进制位置会发生改变,这是由于在 slave 端需要将事务写入到 slave 自己的二进制日志里面,那所写位置是不一样的,但是全局事务标识符是一样的。

对于GTID的参数

  • l gtid_executed会记录当前执行的GTID的 UUID,在MySQL 5.6中必须配置参数log_slave_updates的最重要原因在于当slave重启后,无法得知当前slave已经运行到的GTID位置,因为变量gtid_executed是一个内存值。
  • l gtid_mode用于控制开启/关闭GTID模式。
  • l gtid_owned是一个只读变量,其内容取决于它的范围。 当与session会话级一起使用时,该列表包含此客户端拥有的所有GTID; 当与global 级一起使用时,它包含所有GTID及其所有者的列表。
  • l gtid_purged,表示被purge掉的GTID集合

示例:

查看binlog

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #181009 23:02:36 server id 1 end_log_pos 120 CRC32 0x07eff3b3 Start: binlog v 4, server v 5.6.40-log created 181009 23:02:36 at startup # Warning: this binlog is either in use or was not closed properly. ROLLBACK/*!*/; # at 120 #181009 23:02:36 server id 1 end_log_pos 151 CRC32 0xb62fd2d2 Previous-GTIDs # [empty] # at 151 #181010 4:37:11 server id 1 end_log_pos 199 CRC32 0x2f451f69 GTID [commit=yes] SET @@SESSION.GTID_NEXT= 'fba30f4d-5815-11e8-9beb-000c2900351f:1'/*!*/; # at 199 #181010 4:37:11 server id 1 end_log_pos 271 CRC32 0xa6b6773e Query thread_id=5 exec_time=0 error_code=0 SET TIMESTAMP=1539160631/*!*/; SET @@session.pseudo_thread_id=5/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1075838976/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 271 #181010 4:37:11 server id 1 end_log_pos 336 CRC32 0x0f828e75 Table_map: `test`.`tx_albert` mapped to number 75 # at 336 #181010 4:37:11 server id 1 end_log_pos 398 CRC32 0xd023df0a Write_rows: table id 75 flags: STMT_END_F ### INSERT INTO `test`.`tx_albert` ### SET ### @1=3 ### @2='enmo' ### @3=5 ### @4='F' ### @5='BeiJing' ### @6='BJ' # at 398 #181010 4:37:11 server id 1 end_log_pos 429 CRC32 0x7117fe15 Xid = 45 COMMIT/*!*/; # at 429 #181010 4:38:24 server id 1 end_log_pos 477 CRC32 0x8b8da3af GTID [commit=yes] SET @@SESSION.GTID_NEXT= 'fba30f4d-5815-11e8-9beb-000c2900351f:2'/*!*/; # at 477 #181010 4:38:24 server id 1 end_log_pos 549 CRC32 0xe2c69fee Query thread_id=5 exec_time=0 error_code=0 SET TIMESTAMP=1539160704/*!*/; BEGIN /*!*/; # at 549 #181010 4:38:24 server id 1 end_log_pos 614 CRC32 0xa52a4212 Table_map: `test`.`tx_albert` mapped to number 75 # at 614 #181010 4:38:24 server id 1 end_log_pos 676 CRC32 0x12c7c08f Write_rows: table id 75 flags: STMT_END_F ### INSERT INTO `test`.`tx_albert` ### SET ### @1=4 ### @2='sed' ### @3=34 ### @4='M' ### @5='GuiYang' ### @6='DBA' # at 676 #181010 4:38:24 server id 1 end_log_pos 707 CRC32 0xab6aa483 Xid = 46 COMMIT/*!*/; SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog *//*!*/; DELIMITER ; # End of log file SET @@SESSION.GTID_NEXT= 'fba30f4d-5815-11e8-9beb-000c2900351f:1'/*!*/; 其中'fba30f4d-5815-11e8-9beb-000c2900351f' 是server UUID,‘1’ 是sequence ,即提交的序列 #181010 4:37:11 server id 1 end_log_pos 429 CRC32 0x7117fe15 Xid = 45 Xid = 45 表示下一个sequence。

MySQL通过全局变量gtid_mode控制开启/关闭GTID模式。但是gtid_mode是只读的,可添加到配置文件中,然后重启mysqld来开启GTID模式。由于GTID需要写入到二进制日志,所以要使用了GTID,同时也需要把二进制日志启用。相关配置项如下:

MariaDB 数据库作为是 MySQL 的一个分支,在某些特性上与 MySQL相同。MariaDB是完全兼容MySQL,包括API和命令行,同时在存储引擎方面,它使用XtraDB作为MySQL InnoDB的替代品,而XtraDB 也能兼容着 InnoDB。

GTID复制是出现在MariaDB 10版中,它由The Domain ID,server ID,事务序列号组成。在MariaDB 10版中默认是开启GTID复制模式,每个 Event Group 写到 Binlog 时会先收到一个GTID_EVENT,用MariaDB的 mysqlbinlog 工具或者 SHOW BINLOG EVENTS 命令可以看到这个Event。同时在MariaDB 10版无需设置GTID任何参数,更不需像MySQL 5.6 那样,需要在slave上设置log_slave_updates=1(这样会增加slave的I/O压力)。

MariaDB 支持热切换GTID,不像MySQL5.6/5.7 版本一样,修改GTID 模式需要修改相应的GTID 参数,并需要重启。

示例:

CHANGE MASTER TO master_use_gtid = { slave_pos | current_pos | no }

  • l slave_pos,是将把Slave配置为使用 GTID 方式。当Slave连接到Master时,Master将从最后一个GTID开始给Slave复制 Binlog
  • l current_pos,该设置无需知道当前实例是否是Master还是Slave,但是对于slave来说,如果存在于复制无关的其他事务,可能会引起复制的错误。当然可以在slave 上设置@@GLOBAL.gtid_strict_mode=1,即开启GTID严格模式。
  • l no,也即是传统的复制模式

查看slave 复制情况:

MariaDB [(none)]> show slave status\G show processlist; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.34 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mariadb-bin.000002 Read_Master_Log_Pos: 993 Relay_Log_File: mariadb-relay-bin.000002 Relay_Log_Pos: 644 Relay_Master_Log_File: mariadb-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: 993 Relay_Log_Space: 944 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: 1000 Master_SSL_Crl: Master_SSL_Crlpath: Using_Gtid: Slave_Pos Gtid_IO_Pos: 0-1000-4 Replicate_Do_Domain_Ids: Replicate_Ignore_Domain_Ids: Parallel_Mode: conservative 1 row in set (0.00 sec)

可以看到当前slave使用的GTID 传输为Using_Gtid: Slave_Pos,获取到的pos位置为0-1000-4。

“0”,第一位是Domain ID,这是一个32位的无符号整型; “ 1000”,第二位是Server ID,这跟传统的主备复制中 Server ID 的含义是一样的,也是一个32位无符号整型。因此在一个复制拓扑中每个实例的Server ID必须是唯一的; “4”,第三位是事务序列号(Sequence Number)。这是一个64位的无符号整型。每个新产生的 Event Group 记录到Binlog时都会新生成一个单调递增的序列号

备注:MariaDB 10.0/10.1的GTID复制与MySQL 5.6/5.7 不兼容。

参阅:https://mariadb.com/kb/en/mariadb/mariadb-vs-mysql-compatibility


原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2018-10-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hadoop实操

如何实现CDH元数据库MySQL的主备

MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的扩展。多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数...

4708
来自专栏乐沙弥的世界

基于mysqldump搭建gtid主从

有关知识点参考: 配置MySQL GTID 主从复制 基于mysqldump快速搭建从库 使用mysqldump导出数据库

750
来自专栏耕耘实录

MySQL数据库的主主同步配置

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

1553
来自专栏腾讯IVWEB团队的专栏

使用 Xposed 强制 androidwebView 开启 debug 模式

从 《远程调试 Android 设备使用入门》文章中我们可以知道在 android 4.4+可以通过在apk中使用下面的代码开启 webview 的 chrom...

6460
来自专栏性能与架构

Mysql 主从复制日志参数优化

MySQL的复制(Replication),实际上就是通过将Master端的Binlog利用IO线程通过网络复制到Slave端,然后再通过SQL线程解析Binl...

3584
来自专栏散尽浮华

mysql主从同步(4)-Slave延迟状态监控

之前部署了mysql主从同步环境(Mysql主从同步(1)-主从/主主环境部署梳理),针对主从同步过程中slave延迟状态的监控梳理如下: 在mysql日常维护...

3457
来自专栏酷玩时刻

MySql 5.7.18 数据库主从(Master/Slave)同步安装与配置详解

MySql复制的优点: 1.如果主服务器出现问题,可以快速切换到从服务器提供的服务 2.可以在从服务器上执行查询操作,降低主服务器的访问压力 3.可以在从...

863
来自专栏cmazxiaoma的架构师之路

MySQL基于GTID主从复制的杂谈

先来回顾一下MySQL的二进制知识点。基于Row格式的日志可以避免MySQL主从复制中出现的主从不一致问题。在一个sql语句修改了1000条数据的情况下,基于段...

1495
来自专栏从零开始的linux

mysql主从简单配置

环境 hostnameip端口master128.0.0.1013306slave128.0.0.1023306 安装mysql [root@master ~]...

3578
来自专栏Laoqi's Linux运维专列

MySQL两主(多主)多从架构配置

1.4K8

扫码关注云+社区