作者:Neha Kumari 译:徐轶韬
MySQL 8.0.23 引入了一项新功能,可以从未开启全局事务标识符 (GTID)的源服务器复制到配置有 GTID 的副本服务器。这可以通过在 CHANGE REPLICATION SOURCE 命令中使用参数 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 来实现。启用此选项将允许副本为从源接收的每个非 GTID(匿名)事务分配一个新的 GTID。
该功能的使用场景如下:
启用 GTID 对于组复制、自动故障转移以及管理数据库复制之类的任务是非常必要的,因为 GTID 提供了一种方法来观察和比较拓扑中服务器之间的执行状态,并确定事务给定的 GTID 是否已经在拓扑中的某些服务器中处理过。
接下来让我们了解如何使用此功能以及它可接受的参数值是什么。 参数值:
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解决方案工程师 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!