暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

作者: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解决方案工程师“!



        文章转载自MySQL解决方案工程师,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论