「MySQL」- 基于位置复制 => 基于 GTID 复制

问题描述

现有数据库基于位置复制,现在需要切换为基于 GTID 复制。

环境概述

(1)现有主从两台服务器,(2)当前它们基于位置复制。

前提条件

1)以下多数操作需要 ROOT 用户,或者具有 SUPER 权限;关机则需要 SHUTDOWN 权限。

解决方法

第一步、完成数据同步,进入只读模式

使两台数据库进入只读模式,未授予 SUPER 权限的客户端用户将无法写入:

SET @@GLOBAL.read_only = ON;

补充说明:
1)使主库能够处理完全部事务(提交或回滚);
2)使从库能够更上主库,让两种数据保持一致;

当数据库启用 GTID 模式后,由于在旧 binlog 中不包含 GTID,所以旧 binlog不能当前数据中应用,也就是说旧 binlog 等同于作废。这也是第五步(丢弃旧备份,创建新备份)存在的原因。

第二步、停止两台数据库服务

在确保两台主机数据一致后,停止数据库服务(详细过程不再赘述)。

第三步、修改配置,以 GTID 启动

配置两台服务器,启用 GTID 模式:

gtid_mode=ON
enforce-gtid-consistency=ON

在配置完成后,启动数据库。在启动从库时,应该使用 –skip-slave-start 选项,防止从库启用复制。

在主库中,必须启用 binlog 以用于复制。在从库中,可以关闭 binlog 功能(skip-log-bin,–log-slave-updates=OFF)

第四步、设置从库,使其从主库读取

设置从库以使用主库作为数据源,并使用基于 GTID 的自动定位:

CHANGE MASTER TO MASTER_HOST = host, MASTER_PORT = port,
    MASTER_USER = user, MASTER_PASSWORD = password,
   	MASTER_AUTO_POSITION = 1;

第五步、丢弃旧备份,创建新备份

对于旧的备份,由于没有启用 GTID 功能,因此无法在启用 GTID 的服务器中使用。

我们需要创建新的备份。可以使用 FLUSH LOG 推进日志论转,然后创建备份。

第六步、启用从库复制,关闭只读模式

在从库上执行,以开始数据复制:

START SLAVE;

关闭两台服务器的只读模式,以允许客户端写入数据:

SET @@GLOBAL.read_only = OFF;

参考文献

MySQL 5.7 Reference Manual / Setting Up Replication Using GTIDs