原理

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-04 15:15
最后编辑:admin  更新时间:2023-01-06 09:38