作者:Neha Kumari 译:徐轶韬
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|<UUID>;
下面是查询执行和复制的一些示例,您可以检查源服务器的二进制日志文件和副本的中继日志,并查看所使用选项的结果。
可以在下面看到源代码中一些命令的执行以及生成的 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 = <UUID>
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,以便更多人解锁组复制、故障转移和其他简化复制管理的功能。
感谢您关注”MySQL解决方案工程师“!





