gtid 特性
1 数据库重启GTID值不变。
1 GTID不会改变
查看
show master status \G
55390eba-d320-11eb-8e31-00ffaabbccdd:1-4
net stop mysql80
net start mysq80
use test;
delete from t1 limit 1;
show master status \G
55390eba-d320-11eb-8e31-00ffaabbccdd:1-5
2 SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '55390eba-d320-11eb-8e31-00ffaabbccdd:1-5';
已经清除掉的不再执行。
3 跳过某个 gtid
MySQL [(none)]> set gtid_next='9ba7958e-2ce8-11ed-ad3c-bc16951e4027:44568546';
Query OK, 0 rows affected (0.00 sec)
MySQL [(none)]> begin;
Query OK, 0 rows affected (0.00 sec)
MySQL [(none)]> commit;
Query OK, 0 rows affected (0.00 sec)
MySQL [(none)]> exit
14:46: [(none)]> show master status \G
*************************** 1. row ***************************
File: log.000073
Position: 416
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 55390eba-d320-11eb-8e31-00ffaabbccdd:1-6
1 row in set (0.00 sec)
14:46: [(none)]> set gtid_next='55390eba-d320-11eb-8e31-00ffaabbccdd:7';
Query OK, 0 rows affected (0.00 sec)
14:46: [(none)]> begin
-> ;
Query OK, 0 rows affected (0.00 sec)
14:46: [(none)]> commit;
Query OK, 0 rows affected (0.01 sec)
14:46: [(none)]> show master status \G
*************************** 1. row ***************************
File: log.000073
Position: 636
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 55390eba-d320-11eb-8e31-00ffaabbccdd:1-7
1 row in set (0.00 sec)
一、GTID概述
1 sql线程执行的事件也可以通过log_slave_updates系统变量来决定是否写入自己的二进制文件中,这是可以用于级联复制的场景。
GTID是MYSQL5.6新增的特性,GTID(Global Transaction Identifier)全称为全局事务标示符,用以数据库实例事务唯一标识,其组成主要是source_id和transaction_id 即GTID = source_id:transaction_id。其中source_id是数据库启动自动生成的数据库实例唯一标识,保存在auto.cnf中,而transaction_id则是事务执行的序列号。
二、GTID优缺点
优点:
复制安全性更高,一个事务在每个实例上只执行一次;
故障切换简单,可通过设置MASTER_AUTO_POSITION=1,而非master_log_file和master_log_pos来建立主从关系;
可根据GTID确定事务最早提交的实例;
缺点:
组复制中,必须要求统一开启GTID或者关闭GTID;
不支持复制create table table_name select ... from table_name_xx ;
不支持create temporary table和drop temporary table;
不支持sql_slave_skip_counter,可通过set global gtid_next='' 跳过;
从库和主库都必须设置log_slave_updates
三、GTID工作原理
1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
四、GTID开启和关闭
gtid_mode=ON(必选)
log_bin=ON(必选)
log-slave-updates=ON(必选)
enforce-gtid-consistency(必选)
log-bin = /home/mysql/mysql-bin(必选)
binlog_format = MIXED(必选mixed或者row)
##
change master to master_host = 'ipaddr',master_port = 3306,master_user = 'username',master_password='password',master_auto_position = 1;
五、GTID适用场景
1、搭建高可用架构,方便主从切换后,新的从库重新指定主库(例如一主二从的结构,A为mater,B为Slave,C为Slave,A宕机切换到B后,C重新指定主库为B)
2、不经常使用create table table_name select * from table_name/create temporary table/update t1,t2 where ...这种语句的场合
六、GTID相关参数
参数 comment
gtid_executed 执行过的所有GTID,可通过reset master重置
gtid_purged 丢弃掉的GTID,设置后从而导致slave不会再去master请求这些GTIDs,并且Executed_Gtid_Set为空时,才可以设置此值
gtid_mode gtid模式
gtid_next session级别的变量,下一个gtid
gtid_owned 正在运行的gtid
enforce_gtid_consistency 保