前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL8.0.23的新功能——从未开启 GTID 的源服务器复制到启用 GTID 的副本服务器

MySQL8.0.23的新功能——从未开启 GTID 的源服务器复制到启用 GTID 的副本服务器

作者头像
MySQLSE
发布2021-07-23 14:21:52
7870
发布2021-07-23 14:21:52
举报

作者: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 文件。

代码语言:javascript
复制
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复制。

代码语言:javascript
复制
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>

代码语言:javascript
复制
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,以便更多人解锁组复制、故障转移和其他简化复制管理的功能。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQL解决方案工程师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用法
  • 结论:
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档