适用于:
Azure Database for MySQL - 灵活服务器
本文介绍如何通过配置源服务器和副本服务器在 Azure Database for MySQL 灵活服务器中设置
数据传入复制
。 本文假设读者在 MySQL 服务器和数据库方面有一定的经验。
本文包含对术语“从属”的引用,这是 Microsoft 不再使用的术语。 在从软件中删除该术语后,我们会将其从本文中删除。
若要在 Azure Database for MySQL 灵活服务器实例中创建副本,
数据传入复制
需同步本地 MySQL 源服务器、虚拟机 (VM) 或云数据库服务中的数据。 可以使用基于二进制日志 (binlog) 文件位置的复制或基于 GTID 的复制来配置数据传入复制。 要了解有关 binlog 复制的详细信息,请参阅
MySQL 复制
。
在执行本文中的步骤之前,请查看数据传入复制的
限制和要求
。
创建要用作副本的 Azure Database for MySQL 灵活服务器实例
创建一个新的 Azure Database for MySQL 灵活服务器实例(例如
replica.mysql.database.azure.com
)。 请参阅
使用 Azure 门户创建 Azure Database for MySQL 灵活服务器实例以进行服务器创建
。 此服务器是数据传入复制的“副本”服务器。
创建相同的用户帐户和对应的特权。
用户帐户不会从源服务器复制到副本服务器。 如果你打算为用户提供访问副本服务器的权限,则需在这个新创建的 Azure Database for MySQL 灵活服务器实例上手动创建所有帐户和相应的特权。
以下步骤准备并配置本地或虚拟机中托管的 MySQL 服务器或其他云提供程序托管的数据库服务,以便进行数据传入复制。 该服务器是数据传入复制的“源”。
请先查看
源服务器要求
,然后再继续。
请确保源服务器允许端口 3306 上的入站和出站流量,并且源服务器具有公共 IP 地址,DNS 可供公开访问,或者 DNS 具有完全限定的域名 (FQDN)。
如果使用的是专用访问,请确保源服务器与托管副本服务器的 Vnet 之间具有连接。
请确保使用
ExpressRoute
或
VPN
提供与本地源服务器的站点到站点连接。 有关创建虚拟网络的详细信息,请参阅
虚拟网络文档
,尤其是提供了分步详细信息的快速入门文章。
如果在副本服务器中使用专用访问,并且源是 Azure VM,请确保已建立 VNet 到 VNet 的连接。 支持 VNet-Vnet 对等互连。 也可以使用其他连接方法跨不同区域在 Vnet 之间进行通信,例如 VNet 到 VNet 连接。 有关详细信息,请参阅
VNet 到 VNet VPN 网关
确保虚拟网络网络安全组规则不会阻止出站端口 3306(如果 MySQL 在 Azure VM 上运行,也请确保不会阻止入站端口)。 有关虚拟网络 NSG 流量筛选的更多详细信息,请参阅
使用网络安全组筛选网络流量
一文。
将源服务器的防火墙规则配置为允许副本服务器 IP 地址。
根据要使用基于 bin-log 位置还是基于 GTID 的数据传入复制来执行相应的步骤。
基于 Bin-log 位置的复制
基于 GTID 的复制
如果返回了值为“ON”的变量
log_bin
,则表示已在服务器上启用了二进制日志记录。
如果返回了值为“OFF”的
log_bin
,且源服务器在本地或虚拟机(在其中你可以访问配置文件 (my.cnf))上运行,则可以执行以下步骤:
在源服务器中找到 MySQL 配置文件 (my.cnf)。 例如:/etc/my.cnf
打开配置文件进行编辑,并在文件中找到“mysqld”部分。
在 mysqld 部分中,添加以下行:
log-bin=mysql-bin.log
重启源服务器上的 MySQL 服务(或重启)以使更改生效。
重启服务器后,运行与之前相同的查询来验证是否已启用二进制日志记录:
SHOW VARIABLES LIKE 'log_bin';
主服务器需要通过将 gtid_mode 变量设置为“开”来启用 GTID 模式。 启用 enforce_gtid_consistency 变量也很重要,这可确保只记录对 MySQL GTID 复制安全的语句。
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
SET @@GLOBAL.GTID_MODE = ON;
如果主服务器是另一个 Azure Database for MySQL 灵活服务器实例,则还可以通过在门户中导航到服务器参数页来更新这些服务器参数。
配置源服务器设置。
数据传入复制要求参数 lower_case_table_names
在源服务器与副本服务器之间保持一致。 在 Azure Database for MySQL 灵活服务器中,该参数默认为 1。
SET GLOBAL lower_case_table_names = 1;
创建新的复制角色并设置权限。
在源服务器上创建一个配置有复制特权的用户帐户。 可通过 SQL 命令或 MySQL Workbench 等工具实现此目的。 考虑是否打算使用 SSL 进行复制,因为这需要在创建用户时指定。 请参阅 MySQL 文档,了解如何在源服务器上添加用户帐户。
在以下命令中,创建的新复制角色可从任何计算机访问源服务器,而不仅仅可从托管源服务器本身的计算机进行访问。 这可以通过在创建用户的命令中指定“syncuser@'%'”来完成。 请参阅 MySQL 文档,详细了解如何指定帐户名称。
使用 SSL 复制
如果所有用户连接都要求 SSL,请使用以下命令来创建用户:
CREATE USER 'syncuser'@'%' IDENTIFIED BY 'yourpassword';
GRANT REPLICATION SLAVE ON *.* TO ' syncuser'@'%' REQUIRE SSL;
不使用 SSL 复制
如果并非所有连接都要求 SSL,请使用以下命令来创建用户:
CREATE USER 'syncuser'@'%' IDENTIFIED BY 'yourpassword';
GRANT REPLICATION SLAVE ON *.* TO ' syncuser'@'%';
在开始转储数据库之前,需将服务器置于只读模式。 在只读模式下,源服务器将无法处理任何写入事务。 评估对业务的影响,根据需要在非高峰时间计划只读窗口。
FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
获取二进制日志文件名和偏移量。
运行 show master status
命令,确定当前的二进制日志文件名和偏移量。
show master status;
结果应如下所示。 请务必记下二进制文件名,以供在后续步骤中使用。
确定要将哪些数据库和表复制到 Azure Database for MySQL 灵活服务器并从源服务器执行转储。
可以使用 mysqldump 从主服务器转储数据库。 有关详细信息,请参阅转储和还原。 不需转储 MySQL 库和测试库。
将源服务器设置为读/写模式。
转储数据库后,将 MySQL 源服务器改回读/写模式。
SET GLOBAL read_only = OFF;
UNLOCK TABLES;
[!NOTE]
在服务器重新设置为读/写模式之前,可以使用全局变量 GTID_EXECUTED 检索 GTID 信息。 稍后将使用该信息在副本服务器上设置 GTID
将转储文件还原到新服务器。
将转储文件还原到在 Azure Database for MySQL 灵活服务器中创建的服务器。 请参阅转储和还原,了解如何将转储文件还原到 MySQL 服务器。 如果转储文件较大,请将它上传到副本服务器所在区域的 Azure 中的虚拟机。 将它从虚拟机还原到 Azure Database for MySQL 灵活服务器实例。
如果你想要避免在转储和还原时将数据库设置为只读,可以使用 mydumper/myloader。
在副本服务器中设置 GTID
如果使用基于 bin-log 位置的复制,请跳过此步骤
需要从源获取的转储文件中的 GTID 信息才能重置目标(副本)服务器的 GTID 历史记录。
使用来自源的此 GTID 信息,通过以下 CLI 命令在副本服务器上执行 GTID 重置:
az mysql flexible-server gtid reset --resource-group <resource group> --server-name <replica server name> --gtid-set <gtid set from the source server> --subscription <subscription id>
有关更多详细信息,请参阅 GTID 重置。
无法在启用了异地冗余备份的服务器上执行 GTID 重置。 要在服务器上执行 GTID 重置,请禁用异地冗余。 可以在 GTID 重置后再次启用异地冗余选项。 GTID 重置操作会使所有可用的备份失效,因此一旦再次启用异地冗余,就可能需要一天时间才能在服务器上执行异地还原
链接源服务器和副本服务器以启动数据传入复制
设置源服务器。
所有数据传入复制函数均由存储过程执行。 可以在数据传入复制存储过程中找到所有过程。 这些存储过程可以在 MySQL shell 或 MySQL Workbench 中运行。
要链接两个服务器并启动复制,请在 Azure Database for MySQL 服务中登录到目标副本服务器,并将外部实例设置为源服务器。 为此,可在 Azure Database for MySQL 服务器上使用 mysql.az_replication_change_master
或 mysql.az_replication_change_master_with_gtid
存储过程。
CALL mysql.az_replication_change_master('<master_host>', '<master_user>', '<master_password>', <master_port>, '<master_log_file>', <master_log_pos>, '<master_ssl_ca>');
CALL mysql.az_replication_change_master_with_gtid('<master_host>', '<master_user>', '<master_password>', <master_port>,'<master_ssl_ca>');
master_host:源服务器的主机名
master_user:源服务器的用户名
master_password:源服务器的密码
master_port:源服务器侦听连接的端口号。 (3306 是 MySQL 侦听的默认端口)
master_log_file:正在运行的 show master status
中的二进制日志文件名
master_log_pos:正在运行的 show master status
中的二进制日志位置
master_ssl_ca:CA 证书的上下文。 如果不使用 SSL,请传入空字符串。
建议以变量形式传入此参数。 有关更多信息,请访问以下示例。
如果源服务器托管在 Azure VM 中,请将“允许访问 Azure 服务”设置为“启用”,以允许源服务器和副本服务器相互通信。 从“连接安全性”选项可更改此设置。 有关详细信息,请参阅使用门户管理防火墙规则。
如果已使用 mydumper/myloader 转储了数据库,则可以从 /backup/metadata 文件获取 master_log_file 和 master_log_pos。
使用 SSL 复制
运行以下 MySQL 命令创建变量 @cert
:
SET @cert = '-----BEGIN CERTIFICATE-----
PLACE YOUR PUBLIC KEY CERTIFICATE'`S CONTEXT HERE
-----END CERTIFICATE-----'
在域“companya.com”中托管的源服务器与 Azure Database for MySQL 灵活服务器中托管的副本服务器之间设置了使用 SSL 进行复制的功能。 将在副本上运行此存储过程。
CALL mysql.az_replication_change_master('master.companya.com', 'syncuser', 'P@ssword!', 3306, 'mysql-bin.000002', 120, @cert);
CALL mysql.az_replication_change_master_with_gtid('master.companya.com', 'syncuser', 'P@ssword!', 3306, @cert);
不使用 SSL 复制
在域“companya.com”中托管的源服务器与 Azure Database for MySQL 灵活服务器中托管的副本服务器之间设置了不使用 SSL 进行复制的功能。 将在副本上运行此存储过程。
CALL mysql.az_replication_change_master('master.companya.com', 'syncuser', 'P@ssword!', 3306, 'mysql-bin.000002', 120, '');
CALL mysql.az_replication_change_master_with_gtid('master.companya.com', 'syncuser', 'P@ssword!', 3306, '');
启动复制。
调用 mysql.az_replication_start
存储过程以启动复制。
CALL mysql.az_replication_start;
检查复制状态。
在副本服务器上调用 show slave status
命令查看复制状态。
show slave status;
若要了解复制的正确状态,请查看监视页面下的复制指标 -“副本 IO 状态”和“副本 SQL 状态”。
如果 Seconds_Behind_Master
为 "0",则复制在正常工作。 Seconds_Behind_Master
指示副本的陈旧状态。 如果其值不为“0”,则表示副本正在处理更新。
用于数据传入复制操作的其他有用的存储过程
若要停止源服务器与副本服务器之间的复制,请使用以下存储过程:
CALL mysql.az_replication_stop;
删除复制关系
若要删除源服务器与副本服务器之间的关系,请使用以下存储过程:
CALL mysql.az_replication_remove_master;
跳过复制错误
若要跳过复制错误并允许复制继续,请使用以下存储过程:
CALL mysql.az_replication_skip_counter;
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos][LIMIT [offset,] row_count]
详细了解 Azure Database for MySQL 灵活服务器的数据传入复制。