MySQL GTID与MariaDB GTID的不同之处有哪些
小编给大家分享一下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的参数
lgtid_executed会记录当前执行的GTID的 UUID,在MySQL 5.6中必须配置参数log_slave_updates的最重要原因在于当slave重启后,无法得知当前slave已经运行到的GTID位置,因为变量gtid_executed是一个内存值。
lgtid_mode用于控制开启/关闭GTID模式。
lgtid_owned是一个只读变量,其内容取决于它的范围。 当与session会话级一起使用时,该列表包含此客户端拥有的所有GTID; 当与global 级一起使用时,它包含所有GTID及其所有者的列表。
lgtid_purged,表示被purge掉的GTID集合
示例:
查看binlog
/*!50530SET@@SESSION.PSEUDO_SLAVE_MODE=1*/;/*!40019SET@@session.max_insert_delayed_threads=0*/;/*!50003SET@OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;DELIMITER/*!*/;#at4#18100923:02:36serverid1end_log_pos120CRC320x07eff3b3Start:binlogv4,serverv5.6.40-logcreated18100923:02:36atstartup#Warning:thisbinlogiseitherinuseorwasnotclosedproperly.ROLLBACK/*!*/;#at120#18100923:02:36serverid1end_log_pos151CRC320xb62fd2d2Previous-GTIDs#[empty]#at151#1810104:37:11serverid1end_log_pos199CRC320x2f451f69GTID[commit=yes]SET@@SESSION.GTID_NEXT='fba30f4d-5815-11e8-9beb-000c2900351f:1'/*!*/;#at199#1810104:37:11serverid1end_log_pos271CRC320xa6b6773eQuerythread_id=5exec_time=0error_code=0SETTIMESTAMP=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/*!*/;/*!\Cutf8*//*!*/;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/*!*/;#at271#1810104:37:11serverid1end_log_pos336CRC320x0f828e75Table_map:`test`.`tx_albert`mappedtonumber75#at336#1810104:37:11serverid1end_log_pos398CRC320xd023df0aWrite_rows:tableid75flags:STMT_END_F###INSERTINTO`test`.`tx_albert`###SET###@1=3###@2='enmo'###@3=5###@4='F'###@5='BeiJing'###@6='BJ'#at398#1810104:37:11serverid1end_log_pos429CRC320x7117fe15Xid=45COMMIT/*!*/;#at429#1810104:38:24serverid1end_log_pos477CRC320x8b8da3afGTID[commit=yes]SET@@SESSION.GTID_NEXT='fba30f4d-5815-11e8-9beb-000c2900351f:2'/*!*/;#at477#1810104:38:24serverid1end_log_pos549CRC320xe2c69feeQuerythread_id=5exec_time=0error_code=0SETTIMESTAMP=1539160704/*!*/;BEGIN/*!*/;#at549#1810104:38:24serverid1end_log_pos614CRC320xa52a4212Table_map:`test`.`tx_albert`mappedtonumber75#at614#1810104:38:24serverid1end_log_pos676CRC320x12c7c08fWrite_rows:tableid75flags:STMT_END_F###INSERTINTO`test`.`tx_albert`###SET###@1=4###@2='sed'###@3=34###@4='M'###@5='GuiYang'###@6='DBA'#at676#1810104:38:24serverid1end_log_pos707CRC320xab6aa483Xid=46COMMIT/*!*/;SET@@SESSION.GTID_NEXT='AUTOMATIC'/*addedbymysqlbinlog*//*!*/;DELIMITER;#EndoflogfileSET@@SESSION.GTID_NEXT='fba30f4d-5815-11e8-9beb-000c2900351f:1'/*!*/;
其中'fba30f4d-5815-11e8-9beb-000c2900351f' 是server UUID,‘1’ 是sequence ,即提交的序列
#1810104:37:11serverid1end_log_pos429CRC320x7117fe15Xid=45
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 }
lslave_pos,是将把Slave配置为使用 GTID 方式。当Slave连接到Master时,Master将从最后一个GTID开始给Slave复制 Binlog
lcurrent_pos,该设置无需知道当前实例是否是Master还是Slave,但是对于slave来说,如果存在于复制无关的其他事务,可能会引起复制的错误。当然可以在slave 上设置@@GLOBAL.gtid_strict_mode=1,即开启GTID严格模式。
lno,也即是传统的复制模式
查看slave 复制情况:
MariaDB[(none)]>showslavestatus\Gshowprocesslist;***************************1.row***************************Slave_IO_State:WaitingformastertosendeventMaster_Host:192.168.1.34Master_User:replMaster_Port:3306Connect_Retry:60Master_Log_File:mariadb-bin.000002Read_Master_Log_Pos:993Relay_Log_File:mariadb-relay-bin.000002Relay_Log_Pos:644Relay_Master_Log_File:mariadb-bin.000002Slave_IO_Running:YesSlave_SQL_Running:YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno:0Last_Error:Skip_Counter:0Exec_Master_Log_Pos:993Relay_Log_Space:944Until_Condition:NoneUntil_Log_File:Until_Log_Pos:0Master_SSL_Allowed:NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master:0Master_SSL_Verify_Server_Cert:NoLast_IO_Errno:0Last_IO_Error:Last_SQL_Errno:0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id:1000Master_SSL_Crl:Master_SSL_Crlpath:Using_Gtid:Slave_PosGtid_IO_Pos:0-1000-4Replicate_Do_Domain_Ids:Replicate_Ignore_Domain_Ids:Parallel_Mode:conservative1rowinset(0.00sec)
可以看到当前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时都会新生成一个单调递增的序列号.
以上是“MySQL GTID与MariaDB GTID的不同之处有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。