原理
GTID:全局事务ID(Global Transaction ID),是一个已提交事务的编号,是一个全局唯一的编号(mysql5.6之后在主从复制类型上新增了GTID复制)
组成:
GTID 由 server_uuid 和 事务 id 组成,即 GTID = server_uuid:transaction_id
事务ID 是 事务提交时 由系统顺序分配的 唯一序列号。
价值
(1)GTID 使用 master_auto_position=1 代替了基于 binlog 和 position 号的 主从复制搭建方案。
(2)GTID 可以知道事务 最开始 是在 哪个实例上提交的。
(3)GTID 方便实现 主从之间的 故障转移(failover),再也不用不断的寻找 position 和 binlog。
搭建
(1)主库配置:
gtid_mode=on
enforce_gtid_consistency=on
log_bin=on
server-id 主库与从库不能一样,并且 binlog_format=row
。
(2)从库配置:
gtid_mode=on
enforce_gtid_consistency=on
log_slave_updates=1
(3)主库数据准备:
(如是基于异步复制,则可以跳过此步骤)
从主库 备份数据
mysqldump --single-transaction -uroot -pliu123456 -A > all_master.sql
从库 导入 主库数据
mysql -uroot -pliu123456 < all_master.sql
(4)执行主从配置命令
CHANGE MASTER TO
MASTER_HOST='192.168.23.132',
MASTER_USER='bak',
MASTER_PASSWORD='bak123456',
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1;
(5)执行开始主从复制命令
start slave;
(6)查看主从复制状态
在从库执行如下查看主从是否设置成功
show slave status\G;
图中的如下内容表示ok
Retrieved_Gtid_Set: 781293e1-858f-11ed-917c-000c2927e0d2:1
Executed_Gtid_Set: 781293e1-858f-11ed-917c-000c2927e0d2:1
再在主库上执行 show master status
命令,通过 Executed_Gtid_Set
查看执行过的GTID。
mysql5.7之后,gtid_executed 已经持久化了。在mysql库下新增了表 gtid_executed,该表会记录已经执行的GTID集合信息。
有了这个表,就不用像 mysql 5.6 版本时,必须开启log_slave_updates 参数,从库才能进行复制。
从库 不开启 log_slave_updates 时,GTID 信息会保存 在 gtid_executed 表中,可以关闭从库的 binlog,节约binlog 的记录开销。执行 reset master 时, 会清空表内的所有数据。
在 MySQL 5.7 中 还有 gtid_executed_compression_period
参数,用于控制 gtid_executed 表的压缩。默认值为 1000,表示 表的压缩在执行完1000个事务后开始。
(7)gtid_mode 参数说明
MySQL 5.7.6 开始 gtid_mode 支持动态修改。
取值范围:
OFF
:不支持GTID事务。OFF_PERMISSIVE
:新的事务是匿名的,同时允许复制的事务可以是GTID,也可以是匿名的。ON_PERMISSIVE
:新的事务使用GTID,同时允许复制的事务可以是GTID,也可以是匿名的。ON
:支持GTID事务。
备注:
对于把传统复制 改为 GTID 模式的情况,要特别注意,gtid_mode 虽然支持动态修改,但不支持跳跃是修改。
从 ON_PERMISSIVE
直接修改为 OFF
是不可以的。
GTID 复制 与 传统复制 的切换
(1)GTID 切换 为 传统复制
实施步骤:
(A)先在从库 执行
stop slave
,停止主从复制。然后 使用以下 的命令 调整为 传统复制模式,让master_auto_position=0
。执行完之后,开启复制功能start slave
。CHANGE MASTER TO MASTER_HOST='192.168.23.132', MASTER_USER='bak', MASTER_PASSWORD='bak123456', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=9115;
(B)GTID 模式 逐步切换 为 OFF
先在 主从服务器上 同时调整 GTID 模式 为on_permissive
。set global gtid_mode=on_permissive;
再在 主从服务器上 同时调整 GTID 模式 为
off_permissive
。set global gtid_mode=off_permissive;
最后再在 主从服务器上 同时 关闭 GTID 功能。
set global enforce_gtid_consistency=off; set global gtid_mode=off;
(C)将 gtid_mode=off 和 enforce_gtid_consistency=off 写入 my,cnf 配置文件,重启mysql服务。
(D)测试是否切换成功,在主库 执行增删改语句,查看从库 同步状态
show slave status
,检查 GTID 的值 是否增加。
(2)传统复制 切换 GTID 模式
暂略……
GTID 使用中的 限制条件
GTID 复制 是针对事务的,一个事务 只对应一个GTID。
不能使用
create table table_name select * from table_name
。在一个事务中既包含事务表的操作,又包含非事务表。
不支持
CREATE TEMPORARY TABLE or DROP TEMPORARY TABLE
语句操作。使用 GTID 复制 从库 跳过错误时,不支持执行 sql_slave_skip_counter 参数的语法。
最后编辑:admin 更新时间:2023-01-06 09:38