MySQL 8.0.23 引入了一项新功能,可以从配置为没有全局事务标识符 (GTID)的源服务器复制到配置有 GTID 的副本服务器。这可以通过将复制通道配置为在 CHANGE REPLICATION SOURCE 命令中使用参数 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 来实现。启用此选项将允许副本为从源接收的每个非 GTID(匿名)事务分配一个新的 GTID。
该功能的一些可能用例:
- 要在数据库设置中测试 GTID 的使用,只需添加一个具有 GTID_MODE=ON 的新副本,并在该副本上启用该功能。新副本将处理您的所有工作负载并将 GTID 分配给事务,因此您可以看到一切正常运行,而不会干扰生产服务器。
- 当您无法在源上启用 GTID 时,也可以使用该功能,例如,它由其他人管理,并且您希望迁移到使用 GTID 的现代拓扑。
启用 GTID 对于诸如组复制、自动故障转移以及通常更容易管理数据库复制之类的任务是必要的,因为 GTID 提供了一种方法来观察和比较拓扑服务器之间的执行状态,并确定事务是否具有给定的 GTID 已经在拓扑的某些服务器中处理过。
让我们了解如何使用此功能以及它可接受的输入是什么。
可以赋值
- OFF:这也是默认设置。这只是意味着我们没有在该频道上启用该功能。
- LOCAL:在这种情况下,GTID 中使用的 UUID 将与正在设置通道的服务器的“server_uuid”全局变量相同。
- UUID:您可以指定在此通道上生成 GTID 事务时将使用的有效 UUID。
用法
CHANGE REPLICATION SOURCE TO ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS=OFF|LOCAL|
以下是查询执行和复制的一些示例,您可以检查源服务器二进制日志文件和副本中继日志,并查看所使用选项的结果。
您可以在下面看到源代码中一些命令的执行以及生成的 binlog 文件。
mysql> CREATE TABLE t(s INT);
mysql> INSERT INTO t VALUES(10);
mysql> SHOW BINLOG EVENTS IN 'source-bin.000001';
+-------------------+-----+----------------+-----------+-------------+-------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+-------------------+-----+----------------+-----------+-------------+-------------------------------------------------+
| source-bin.000001 | 4 | Format_desc | 1 | 125 | Server ver: 8.0.24-tr-debug-asan, Binlog ver: 4 |
| source-bin.000001 | 125 | Previous_gtids | 1 | 156 | |
| source-bin.000001 | 156 | Anonymous_Gtid | 1 | 233 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| source-bin.000001 | 233 | Query | 1 | 342 | use `test`; CREATE TABLE t(s INT) /* xid=5 */ |
| source-bin.000001 | 342 | Anonymous_Gtid | 1 | 421 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| source-bin.000001 | 421 | Query | 1 | 496 | BEGIN |
| source-bin.000001 | 496 | Table_map | 1 | 543 | table_id: 112 (test.t) |
| source-bin.000001 | 543 | Write_rows | 1 | 583 | table_id: 112 flags: STMT_END_F |
| source-bin.000001 | 583 | Xid | 1 | 614 | COMMIT /* xid=37 */ |
+-------------------+-----+----------------+-----------+-------------+----------
现在让我们看看副本中的中继日志文件。
源上的 CREATE 命令将被复制ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS=OFF。
源上的 INSERT 命令将与ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS=LOCAL一起复制。
mysql> SHOW BINLOG EVENTS IN 'replica-bin.000001';
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------+
| replica-bin.000001 | 4 | Format_desc | 2 | 125 | Server ver: 8.0.24-tr-debug-asan, Binlog ver: 4 |
| replica-bin.000001 | 125 | Previous_gtids | 2 | 156 | |
| replica-bin.000001 | 156 | Anonymous_Gtid | 1 | 240 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| replica-bin.000001 | 240 | Query | 1 | 349 | use `test`; CREATE TABLE t(s INT) /* xid=8 */ |
| replica-bin.000001 | 349 | Rotate | 2 | 396 | replica-bin.000002;pos=4 |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------+
...
mysql>CHANGE REPLICATION SOURCE TO ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS=LOCAL;
...
mysql> SHOW BINLOG EVENTS IN 'replica-bin.000004';
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
| replica-bin.000004 | 4 | Format_desc | 2 | 125 | Server ver: 8.0.24-tr-debug-asan, Binlog ver: 4 |
| replica-bin.000004 | 125 | Previous_gtids | 2 | 156 | |
| replica-bin.000004 | 156 | Gtid | 1 | 242 | SET @@SESSION.GTID_NEXT= 'b90cdeb5-824b-11eb-83ad-0010e0dc7238:1' |
| replica-bin.000004 | 242 | Query | 1 | 312 | BEGIN |
| replica-bin.000004 | 312 | Table_map | 1 | 359 | table_id: 112 (test.t) |
| replica-bin.000004 | 359 | Write_rows | 1 | 399 | table_id: 112 flags: STMT_END_F |
| replica-bin.000004 | 399 | Xid | 1 | 430 | COMMIT /* xid=28 */ |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
mysql> SELECT @@SERVER_UUID;
+--------------------------------------+
| @@SERVER_UUID |
+--------------------------------------+
| b90cdeb5-824b-11eb-83ad-0010e0dc7238 |
+--------------------------------------+
您可以看到与 INSERT 关联的 GTID 与全局变量“server_uuid”具有相同的 UUID。
这是因为我们使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS = LOCAL 来复制 INSERT 语句。
现在如果我们设置 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS =
mysql> CHANGE REPLICATION SOURCE TO ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS='c9029522-824b-11eb-8395-0010e0dc7238';
...
mysql> show binlog events in 'replica-bin.000004';
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
| replica-bin.000004 | 4 | Format_desc | 2 | 125 | Server ver: 8.0.24-tr-debug-asan, Binlog ver: 4 |
| replica-bin.000004 | 125 | Previous_gtids | 2 | 156 | |
| replica-bin.000004 | 156 | Gtid | 1 | 242 | SET @@SESSION.GTID_NEXT= 'b90cdeb5-824b-11eb-83ad-0010e0dc7238:1' |
| replica-bin.000004 | 242 | Query | 1 | 312 | BEGIN |
| replica-bin.000004 | 312 | Table_map | 1 | 359 | table_id: 112 (test.t) |
| replica-bin.000004 | 359 | Write_rows | 1 | 399 | table_id: 112 flags: STMT_END_F |
| replica-bin.000004 | 399 | Xid | 1 | 430 | COMMIT /* xid=28 */ |
| replica-bin.000004 | 430 | Gtid | 1 | 516 | SET @@SESSION.GTID_NEXT= 'c9029522-824b-11eb-8395-0010e0dc7238:1' |
| replica-bin.000004 | 516 | Query | 1 | 586 | BEGIN |
| replica-bin.000004 | 586 | Table_map | 1 | 633 | table_id: 112 (test.t) |
| replica-bin.000004 | 633 | Write_rows | 1 | 673 | table_id: 112 flags: STMT_END_F |
| replica-bin.000004 | 673 | Xid | 1 | 704 | COMMIT /* xid=37 */ |
+------------------+-----+----------------+-----------+-------------+-----------
您可以看到在后面的事务中更改了 UUID,它与在 CHANGE REPLICATION SOURCE 中传递给 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 的内容相同。
如果服务器从多个源服务器复制,或者如果有客户端在同一副本上提交事务,则手动指定 UUID 可用于识别每个事务的源。
如果复制在运行事务之间中断,您将必须手动重新定位副本并进行故障排除,这是与基于位置的复制拓扑共享的限制。
结论:
只要有可能,我们建议迁移所有服务器以使用 GTID。新功能的目的是在两种情况下简化迁移。首先,您可以在未生产的副本上预览您的工作负载如何拥有 GTID。其次,如果您没有足够的控制权在源服务器上启用 GTID,您可以在您可以控制的拓扑下游部分启用 GTID。在这种情况下,重要的是要了解 GTID 的好处仅适用于已启用 GTID 的拓扑部分。
借助此功能,我们希望能够更轻松地迁移以启用 GTID,以便更多人解锁组复制、故障转移和其他简化复制管理的功能。




