本指南介绍了如何使用 Database Migration Service 中的分布式可用性组 (DAG),通过专用网络连接将数据库从自行管理的 SQL Server 企业版实例迁移到 Cloud SQL for SQL Server 企业版。
通过 DAG 迁移,Database Migration Service 会在源可用性组和目标 Cloud SQL for SQL Server 可用性组之间的网络上直接流式传输初始完整加载(称为 FULL_DUMP 阶段)和持续事务日志复制(称为变更数据捕获 - CDC - 阶段)。如需详细了解 DAG 迁移的架构、前提条件和限制,请参阅分布式可用性组 (DAG) 迁移简介。如需使用存储在 Cloud Storage 中的备份文件进行迁移,请参阅将 SQL Server 数据库迁移到 Cloud SQL for SQL Server。
如需执行分布式可用性组迁移,您需要完成以下概要任务:
- 创建并准备 Cloud SQL for SQL Server 目标实例。
- 准备源 SQL Server 实例和可用性组。
- 建立双向专用网络连接并配置链接服务器。
- 创建连接配置文件并运行迁移作业。
- 监控并验证迁移。
- 提升、故障切换或完成迁移。
费用
对于到 Cloud SQL 的同构迁移,使用 Database Migration Service 无需额外付费。不过,您需要支付标准 Cloud SQL 和网络费用。 如需估算您的使用费,请使用价格计算器。
准备工作
- 验证您的源数据库和目标数据库是否满足分布式可用性组迁移的所有前提条件和限制(包括运行企业版、将数据文件存储在默认数据目录中,以及不使用
sa作为数据库所有者)。请参阅关于分布式可用性组 (DAG) 迁移。 - 选择迁移 Google Cloud 区域。Database Migration Service 是一款完全区域性的产品;与迁移相关的所有实体(源和目标连接配置文件、迁移作业以及目标 Cloud SQL for SQL Server 实例)都必须位于同一区域。
- 在 Google Cloud 控制台的项目选择器页面上,选择或创建 Google Cloud 项目。
- 启用 Database Migration Service、Compute Engine 和 Cloud SQL Admin API。
所需的角色
确保在您的Google Cloud 项目中授予了以下 IAM 角色:
- 执行迁移的用户账号:
- Database Migration Admin (
roles/datamigration.admin) - Cloud SQL Editor (
roles/cloudsql.editor)
- Database Migration Admin (
- Database Migration Service 服务账号 (
service-<var>PROJECT_NUMBER</var>@gcp-sa-datamigration.iam.gserviceaccount.com):- Database Migration Service Agent (
roles/datamigration.serviceAgent) - Cloud SQL Editor (
roles/cloudsql.editor) - Cloud SQL Studio User (
roles/cloudsql.studioUser)
- Database Migration Service Agent (
如需详细了解如何授予角色,请参阅管理访问权限。
创建并准备 Cloud SQL for SQL Server 目标实例
在此步骤中,您将创建目标 Cloud SQL for SQL Server 企业版实例,并启用链接服务器所需的数据库标志。
- 创建 Cloud SQL for SQL Server 目标实例。如需了解详细的创建说明,请参阅创建 Cloud SQL for SQL Server 实例。确保您的实例满足以下分布式可用性组迁移要求:
- 选择企业版(2017、2019、2022 或 2025 版)。
- 配置专用网络,使其与您计划连接源 SQL Server 实例和目标 Cloud SQL for SQL Server 实例的方式保持一致。如果您计划通过虚拟私有云对等互连连接实例,请启用
专用服务访问通道;如果您计划使用入站 Private Service Connect 端点和出站 Private Service Connect 网络连接来连接实例,请使用
Private Service Connect。
请勿在同一目标 Cloud SQL for SQL Server 实例上同时启用专用服务访问通道和 Private Service Connect。如果同时启用这两项功能,Cloud SQL for SQL Server 不支持关联的服务器。如需了解完整的网络设置详情,请参阅建立双向专用网络连接。
- 在完成并删除 DAG 迁移作业之前,请保持时间点恢复 (PITR) 处于停用状态,并且不要添加读取副本。
- 如果任何源数据库归 Windows Active Directory 登录名所有,请在迁移前将源数据库所有者更改为 SQL 登录名,或将目标 Cloud SQL for SQL Server 实例加入 Active Directory,以便 Database Migration Service 可以在迁移作业启动时自动在目标实例上创建相应的 Windows 登录名。如需查看相关说明,请参阅为 Cloud SQL for SQL Server 配置 Microsoft AD 托管服务。
- 在 Cloud SQL for SQL Server 目标实例上启用
cloudsql enable linked servers数据库标志(设置为on)。如需了解如何设置标志,请参阅管理关联的服务器和配置数据库标志。在本指南的后续步骤中,当您在目标 Cloud SQL for SQL Server 实例上创建并验证链接服务器时,需要使用此标志。
准备源 SQL Server 实例
在此步骤中,您将在源 SQL Server 实例上启用 Always On 可用性组,创建数据库镜像端点和证书,为 Database Migration Service 创建专用 SQL 登录名,并准备源可用性组。
启用 Always On 可用性组
确保在源 SQL Server 实例上启用了 Always On 可用性组功能:
- 对于 Windows,请参阅 Microsoft 文档中的启用和停用 Always On 可用性组。
- 对于 Linux,请参阅 Microsoft 文档中的在 Linux 上配置 SQL Server Always On 可用性组以实现高可用性。
创建数据库镜像端点和证书
在 SQL Server 中,分布式可用性组通过 TCP DATABASE_MIRRORING (DBM) 端点(默认端口 5022)在实例之间流式传输数据和事务日志。由于您的自管理 SQL Server 实例和目标 Cloud SQL for SQL Server 实例是独立实例,因此它们需要基于证书的双向身份验证和 AES 加密,才能通过 DBM 端点建立信任。
您只需创建一个证书,并将其绑定到源 SQL Server 实例上的 DATABASE_MIRRORING 端点。您无需在目标 Cloud SQL for SQL Server 实例上手动导出证书文件或创建证书:
- 启动迁移作业时,Database Migration Service 会自动在目标 Cloud SQL for SQL Server 实例上配置
DATABASE_MIRRORING端点和证书,并使用关联服务器在两个实例之间交换公钥。 - 如果您在完成割接后删除迁移作业,Database Migration Service 会自动从这两个实例中移除导入的证书。
如果您的源 SQL Server 实例还没有使用证书进行身份验证的 DATABASE_MIRRORING 端点,请创建一个:
- 使用 SQL 客户端(例如
sqlcmd实用程序)连接到源实例。 - 运行以下 T-SQL 命令,以创建数据库主密钥、证书和
DATABASE_MIRRORING端点,并监听您选择的DBM端口(默认值为5022):USE [master]; GO IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101) BEGIN CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MASTER_KEY_PASSWORD'; END GO CREATE CERTIFICATE [SOURCE_CERT_NAME] WITH SUBJECT = 'AlwaysOn AG Certificate', EXPIRY_DATE = 'CERT_EXPIRY_DATE'; GO CREATE ENDPOINT [HADR_ENDPOINT_NAME] STATE = STARTED AS TCP (LISTENER_PORT = SOURCE_DBM_PORT_NUMBER) FOR DATABASE_MIRRORING ( ROLE = ALL, AUTHENTICATION = CERTIFICATE [SOURCE_CERT_NAME], ENCRYPTION = REQUIRED ALGORITHM AES ); GO
替换以下内容:
- 将
MASTER_KEY_PASSWORD替换为用于加密数据库主密钥的密码。 - 将
SOURCE_CERT_NAME替换为源数据库镜像证书的名称(例如dbmCertificate)。 - 将
CERT_EXPIRY_DATE替换为证书的失效日期(采用YYYYMMDD格式)。 - 将
HADR_ENDPOINT_NAME替换为数据库镜像端点的名称。 - 将
SOURCE_DBM_PORT_NUMBER替换为数据库镜像流量的 TCP 端口号(默认为5022)。
- 将
创建专用 Database Migration Service 登录名和权限
Database Migration Service 通过关联的服务器,使用您在来源连接配置文件中提供的专用 SQL 登录名连接到源 SQL Server 实例。您可以通过授予 sysadmin 服务器角色或使用 gcp_dms_db 辅助数据库配置最小权限来配置此登录:
授予 sysadmin 角色
如果您的安全政策允许向迁移登录账号授予 sysadmin 服务器角色,请运行以下 T-SQL 命令:
USE [master]; GO CREATE LOGIN [SOURCE_USERNAME] WITH PASSWORD = 'SOURCE_PASSWORD'; CREATE USER [SOURCE_USER] FOR LOGIN [SOURCE_USERNAME]; ALTER SERVER ROLE [sysadmin] ADD MEMBER [SOURCE_USERNAME]; GRANT CONNECT ON ENDPOINT::[HADR_ENDPOINT_NAME] TO [SOURCE_USERNAME]; GO
替换以下内容:
- 将
SOURCE_USERNAME替换为 Database Migration Service 用于连接到源实例的 SQL 登录名(例如cloud_dms_login)。 - 将
SOURCE_PASSWORD替换为SOURCE_USERNAME登录密码。 - 将
SOURCE_USER替换为映射到SOURCE_USERNAME的数据库用户名(例如cloud_dms_user)。 - 将
HADR_ENDPOINT_NAME替换为数据库镜像端点的名称(例如Hadr_endpoint)。
最小权限 (gcp_dms_db)
如果您的安全政策禁止向迁移登录授予 sysadmin,请创建专用的 gcp_dms_db 辅助数据库(由 sa 拥有,具有 TRUSTWORTHY ON),创建三个 Database Migration Service 封装容器存储过程,并向迁移登录授予精细权限:
USE [master]; GO CREATE DATABASE [gcp_dms_db]; GO ALTER AUTHORIZATION ON DATABASE::[gcp_dms_db] TO [sa]; ALTER DATABASE [gcp_dms_db] SET TRUSTWORTHY ON; GO USE [gcp_dms_db]; GO CREATE OR ALTER PROCEDURE dbo.gcp_dms_set_dag_commit_mode @dag_name NVARCHAR(128), @source_ag NVARCHAR(128), @dest_ag NVARCHAR(128), @commit_mode NVARCHAR(30) WITH EXECUTE AS 'dbo' AS BEGIN SET NOCOUNT ON; IF @commit_mode NOT IN ('SYNCHRONOUS_COMMIT', 'ASYNCHRONOUS_COMMIT') BEGIN RAISERROR('Invalid commit mode. Must be SYNCHRONOUS_COMMIT or ASYNCHRONOUS_COMMIT.', 16, 1); RETURN; END DECLARE @sql NVARCHAR(MAX); SET @sql = N'USE master; ALTER AVAILABILITY GROUP ' + QUOTENAME(@dag_name) + N' MODIFY AVAILABILITY GROUP ON ' + QUOTENAME(@source_ag, '''') + N' WITH (AVAILABILITY_MODE = ' + @commit_mode + N'), ' + QUOTENAME(@dest_ag, '''') + N' WITH (AVAILABILITY_MODE = ' + @commit_mode + N');'; EXECUTE sp_executesql @sql; END; GO CREATE OR ALTER PROCEDURE dbo.gcp_dms_set_dag_secondary @dag_name NVARCHAR(128) WITH EXECUTE AS 'dbo' AS BEGIN SET NOCOUNT ON; DECLARE @sql NVARCHAR(MAX); SET @sql = N'USE master; ALTER AVAILABILITY GROUP ' + QUOTENAME(@dag_name) + N' SET (ROLE = SECONDARY);'; EXECUTE sp_executesql @sql; END; GO CREATE OR ALTER PROCEDURE dbo.gcp_dms_failover_dag @dag_name NVARCHAR(128) WITH EXECUTE AS 'dbo' AS BEGIN SET NOCOUNT ON; DECLARE @sql NVARCHAR(MAX); SET @sql = N'USE master; ALTER AVAILABILITY GROUP ' + QUOTENAME(@dag_name) + N' FORCE_FAILOVER_ALLOW_DATA_LOSS;'; EXECUTE sp_executesql @sql; END; GO USE [master]; GO CREATE LOGIN [SOURCE_USERNAME] WITH PASSWORD = 'SOURCE_PASSWORD'; CREATE USER [SOURCE_USER] FOR LOGIN [SOURCE_USERNAME]; GRANT VIEW SERVER STATE TO [SOURCE_USERNAME]; -- Note: Run GRANT VIEW SERVER PERFORMANCE STATE on SQL Server 2022 and later: GRANT VIEW SERVER PERFORMANCE STATE TO [SOURCE_USERNAME]; GRANT VIEW ANY DEFINITION TO [SOURCE_USERNAME]; GRANT ALTER ANY AVAILABILITY GROUP TO [SOURCE_USERNAME]; GRANT CONNECT ON ENDPOINT::[HADR_ENDPOINT_NAME] TO [SOURCE_USERNAME]; GRANT CREATE CERTIFICATE TO [SOURCE_USER]; GO USE [gcp_dms_db]; GO CREATE USER [SOURCE_USER] FOR LOGIN [SOURCE_USERNAME]; GRANT EXECUTE ON dbo.gcp_dms_set_dag_commit_mode TO [SOURCE_USER]; GRANT EXECUTE ON dbo.gcp_dms_set_dag_secondary TO [SOURCE_USER]; GRANT EXECUTE ON dbo.gcp_dms_failover_dag TO [SOURCE_USER]; GO -- Repeat the following block for EACH user database in your source Availability Group: USE [DATABASE_NAME]; GO CREATE USER [SOURCE_USER] FOR LOGIN [SOURCE_USERNAME]; ALTER ROLE [db_backupoperator] ADD MEMBER [SOURCE_USER]; GO
替换以下内容:
- 将
SOURCE_USERNAME替换为 Database Migration Service 用于连接到源实例的 SQL 登录名(例如cloud_dms_login)。 - 将
SOURCE_PASSWORD替换为SOURCE_USERNAME登录密码。 - 将
SOURCE_USER替换为映射到SOURCE_USERNAME的数据库用户名(例如cloud_dms_user)。 - 将
HADR_ENDPOINT_NAME替换为数据库镜像端点的名称(例如Hadr_endpoint)。 - 将
DATABASE_NAME替换为可用性组中每个源数据库的名称。Database Migration Service 预检验证要求在每个迁移的数据库上授予db_backupoperator,并允许在升级期间使用CHECKPOINT刷新事务日志。
准备源数据库和可用性组
您可以从现有 Always On 可用性组迁移数据库,也可以创建新的独立可用性组 (CLUSTER_TYPE = NONE)。在继续操作之前,请验证以下要求:
- 可用性组中的每个数据库都使用
FULL恢复模式,不归sa所有,并将其数据文件(.mdf和.ndf)存储在默认数据目录中。 - 如果您重复使用现有可用性组,请确认您的数据库镜像端点已在端口
5022(或您选择的 DBM 端口)上配置,副本上已启用SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL),以便在提升翻转 DAG 角色后,辅助数据库仍可通过标准连接字符串读取,并且您的迁移登录具有CONNECT ON ENDPOINT。如果源可用性组配置了多个副本和一个可用性组监听器,请在配置关联服务器和源连接配置文件时使用监听器 IP 地址作为<var>SOURCE_HOST_IP_ADDRESS</var>,以便在源可用性组发生故障切换时可以恢复迁移。
如需准备数据库并创建新的独立可用性组 (CLUSTER_TYPE = NONE),请运行以下 T-SQL 命令:
USE [master]; GO ALTER DATABASE [DATABASE_NAME] SET RECOVERY FULL; GO -- If the database is owned by 'sa', change the owner to another login: ALTER AUTHORIZATION ON DATABASE::[DATABASE_NAME] TO [DB_OWNER_LOGIN]; GO -- Initialize the local SQL Server transaction log chain for the Availability Group: BACKUP DATABASE [DATABASE_NAME] TO DISK = 'NUL'; GO CREATE AVAILABILITY GROUP [SOURCE_AVAILABILITY_GROUP_NAME] WITH (CLUSTER_TYPE = NONE) FOR REPLICA ON N'SOURCE_SERVER_NAME' WITH ( ENDPOINT_URL = N'TCP://localhost:SOURCE_DBM_PORT_NUMBER', FAILOVER_MODE = MANUAL, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, SEEDING_MODE = MANUAL, PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE), SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL) ); GO ALTER AVAILABILITY GROUP [SOURCE_AVAILABILITY_GROUP_NAME] ADD DATABASE [DATABASE_NAME]; GO
替换以下内容:
- 将
DATABASE_NAME替换为要包含在可用性组中的数据库的名称。 - 将
DB_OWNER_LOGIN替换为拥有数据库的非sa登录名。 - 将
SOURCE_AVAILABILITY_GROUP_NAME替换为源可用性组的名称(例如source_ag)。 - 将
SOURCE_SERVER_NAME替换为源 SQL Server 实例的服务器名称(与SELECT @@SERVERNAME返回的值匹配)。 SOURCE_DBM_PORT_NUMBER替换为数据库镜像端点的 TCP 端口号(默认值为5022)。
建立双向专用网络连接
对于 DAG 迁移,Database Migration Service 通过内部 Google Cloud API 与目标 Cloud SQL for SQL Server 实例通信,通过目标 Cloud SQL for SQL Server 实例上的链接服务器在源 SQL Server 实例上执行编排查询,并通过专用网络在两个实例之间直接流式传输数据。此迁移要求您通过虚拟私有云网络在源 SQL Server 主机与目标 Cloud SQL for SQL Server 实例之间直接建立双向专用 IP 连接。不支持源实例和目标实例之间的公共 IP 连接。
必需的端口和 IP 地址
您的网络配置必须允许源 SQL Server 实例与目标 Cloud SQL for SQL Server 实例之间通过以下两个 TCP 端口进行流量传输:
| 端口 | 方向 | 用途 |
|---|---|---|
SQL Server 数据库端口(默认值为 1433) |
从 Cloud SQL for SQL Server 目标实例到 SQL Server 源实例 | 由目标 Cloud SQL for SQL Server 实例上的链接服务器使用,用于在源实例上运行预检验证、证书交换和 DAG 编排查询。 |
数据库镜像 (DBM) 端口(默认值为 5022) |
源 SQL Server 实例与目标 Cloud SQL for SQL Server 实例之间双向 | 由来源和目标可用性组使用,用于在FULL_DUMP期间流式传输初始完整加载、在CDC期间流式传输持续的数据库更改,以及在FAILBACK期间流式传输反向复制。 |
在稍后配置链接服务器和连接配置文件时,您需要提供两个专用 IP 地址:
SOURCE_HOST_IP_ADDRESS(在链接服务器@datasrc参数和来源连接配置文件--host标志中使用)是来源 SQL Server 主机的专用 IP 地址(或可用性组监听器 IP 地址,如果为多副本来源可用性组配置了该地址,则首选该地址,以便在来源可用性组发生故障切换时可以恢复迁移),可从目标 Cloud SQL for SQL Server 实例访问。DESTINATION_HOST_IP_ADDRESS(在目标连接配置文件--host标志中使用)是目标 Cloud SQL for SQL Server 实例的专用 IP 地址(或其 Private Service Connect 端点 IP 地址),可从源 SQL Server 主机访问。
配置专用网络方法
为您在目标 Cloud SQL for SQL Server 实例上启用的网络方法(专用服务访问通道或 Private Service Connect)完成网络路由配置:
专用服务访问通道
专用服务访问通道会将您的虚拟私有云网络与 Google 代管式服务提供方虚拟私有云网络(托管 Cloud SQL for SQL Server 目标实例)对等互连:
- 验证您的虚拟私有云网络是否具有已分配的内部 IPv4 地址范围,并且为目标 Cloud SQL for SQL Server 实例启用了专用连接(与
servicenetworking-googleapis-com的虚拟私有云对等互连)。如需查看相关说明,请参阅为 Cloud SQL for SQL Server 配置专用 IP。 - 根据源 SQL Server 主机的托管位置,配置到该主机的路由:
- 如果源实例在同一虚拟私有云网络中的 Compute Engine 虚拟机上运行,则无需进行额外的路由。虚拟机和 Cloud SQL for SQL Server 实例可以通过虚拟私有云对等互连连接直接访问彼此的专用 IP 地址。
- 如果您的源实例在本地、其他云服务商或其他虚拟私有云网络中运行,请完成以下步骤,以便跨传递性对等互连边界交换路由:
- 使用 Cloud VPN 或 Cloud Interconnect 将外部网络连接到 Virtual Private Cloud 网络。如需查看相关说明,请参阅从外部来源访问 Cloud SQL 实例。
- 在 Cloud Router 中,将 Cloud SQL for SQL Server 分配的 IP 地址范围通告给源网络。如需了解相关说明,请参阅通告自定义 IP 范围。
- 更新虚拟私有云网络中的
servicenetworking-googleapis-com对等互连连接,以启用导出自定义路由,以便 Cloud SQL for SQL Server 实例了解指向源网络的路由。如需查看相关说明,请参阅更新对等互连连接。
- 记录迁移的专用 IP 地址:
- 使用源 SQL Server 主机的内部 IP 地址作为
SOURCE_HOST_IP_ADDRESS。 - 使用分配给目标 Cloud SQL for SQL Server 实例的专用 IP 地址(显示在实例概览页面上)作为
DESTINATION_HOST_IP_ADDRESS。
- 使用源 SQL Server 主机的内部 IP 地址作为
Private Service Connect
如果您使用 Private Service Connect 而不是专用服务访问通道,则必须同时配置入站 Private Service Connect 端点(以便源实例可以通过端口 5022 连接到 Cloud SQL for SQL Server)和出站 Private Service Connect 接口(以便 Cloud SQL for SQL Server 可以通过端口 1433 和 5022 发起到源实例的链接服务器和 DAG 连接):
- 验证目标 Cloud SQL for SQL Server 实例是否已启用 Private Service Connect(不使用专用 IP),并指定了允许的使用方项目。如需查看相关说明,请参阅配置 Private Service Connect。
- 如需允许从源 SQL Server 主机到目标 Cloud SQL for SQL Server 实例的入站连接,请在 Virtual Private Cloud 子网中预留内部 IP 地址,并创建一个以 Cloud SQL for SQL Server 实例的服务连接为目标的 Private Service Connect 端点(转发规则)。如需查看相关说明,请参阅创建 Private Service Connect 端点。
- 如需允许从 Cloud SQL for SQL Server 目标实例到 SQL Server 源主机的出站连接(链接服务器和出站 DAG 连接需要),请在可路由到源主机的子网中创建虚拟私有云网络连接,并在 Cloud SQL for SQL Server 目标实例上配置 Private Service Connect 出站连接。如需查看相关说明,请参阅创建和管理网络连接以及配置 Private Service Connect 出站连接。
- 记录迁移的专用 IP 地址:
- 使用源 SQL Server 主机的专用 IP 地址作为
SOURCE_HOST_IP_ADDRESS。 - 将虚拟私有云网络中 Private Service Connect 端点(转发规则)的内部 IP 地址用作
DESTINATION_HOST_IP_ADDRESS。
- 使用源 SQL Server 主机的专用 IP 地址作为
配置虚拟私有云和来源主机防火墙规则
- 在 Virtual Private Cloud 网络中,创建入站和出站防火墙规则,以允许源 SQL Server IP 地址 (
SOURCE_HOST_IP_ADDRESS) 与目标 Cloud SQL for SQL Server IP 范围(或 Private Service Connect 端点和网络连接子网)之间在数据库端口(默认值为1433)和数据库镜像端口(默认值为5022)上进行 TCP 流量传输。如需详细了解如何创建防火墙规则,请参阅创建防火墙规则。 - 在源 SQL Server 机器上,验证以下网络和主机防火墙设置:
- 在 SQL Server 配置管理器(或 Linux 上的
mssql-conf)中启用了 TCP/IP,并且实例监听静态 TCP 端口(默认为1433)。 - 操作系统防火墙(例如 Windows Defender 防火墙或 Linux
iptables或firewalld)允许在数据库端口(默认1433)和数据库镜像端口(默认5022)上建立入站 TCP 连接,并允许在端口5022上建立到DESTINATION_HOST_IP_ADDRESS的出站 TCP 连接。
- 在 SQL Server 配置管理器(或 Linux 上的
通过 Cloud SQL Connectivity Tests 验证可达性
在配置链接服务器之前,我们建议您在 Google Cloud 控制台中,从 Cloud SQL for SQL Server 实例的连接 > Connectivity Tests标签页运行三项连接测试。如需了解如何运行连接测试,请参阅管理 Connectivity Tests:
- 如需测试端口
1433上的出站链接服务器连接性,请将来源设置为当前 Cloud SQL 实例,将目标设置为SOURCE_HOST_IP_ADDRESS,并将目标端口设置为1433(或自定义数据库端口)。 - 如需测试端口
5022上的出站数据库镜像连接,请将来源设置为当前 Cloud SQL 实例,将目标设置为SOURCE_HOST_IP_ADDRESS,并将目标端口设置为5022(或自定义DBM端口)。 - 如需测试端口
5022上的入站数据库镜像连接性,请将来源设置为SOURCE_HOST_IP_ADDRESS,将目的地设置为当前 Cloud SQL 实例(如果您使用 Private Service Connect,则设置为DESTINATION_HOST_IP_ADDRESS),并将目标端口设置为5022(或您的自定义DBM端口)。
在 Cloud SQL for SQL Server 目标实例上创建并验证链接服务器
建立网络连接后,连接到 Cloud SQL for SQL Server 目标实例,并创建指向 SQL Server 源实例的链接服务器:
- 使用 SQL 客户端连接到 Cloud SQL 实例。您可以使用以下方法:
sqlcmd客户端。 您可以使用此方法连接到实例专用 IP,但可能需要创建 Compute Engine 虚拟机。gcloud sql connect命令。此命令仅适用于启用了公共 IP 地址的 Cloud SQL 实例。
- 以
sqlserver用户身份登录,并针对目标 Cloud SQL for SQL Server 版本运行以下 T-SQL 命令,以创建指向源 SQL Server 实例的链接服务器,将@locallogin = N'sqlserver'映射到源迁移登录名,启用rpc out,并使用OPENQUERY测试连接(如需详细了解 Cloud SQL 上的链接服务器选项,请参阅管理链接服务器):Cloud SQL for SQL Server 2017、2019 和 2022
USE [master]; GO EXEC master.dbo.sp_addlinkedserver @server = N'LINKED_SERVER_NAME', @srvproduct = N'', @provider = N'SQLNCLI', @datasrc = N'SOURCE_HOST_IP_ADDRESS,SOURCE_PORT_NUMBER'; GO EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LINKED_SERVER_NAME', @useself = N'False', @locallogin = N'sqlserver', @rmtuser = N'SOURCE_USERNAME', @rmtpassword = N'SOURCE_PASSWORD'; GO EXEC master.dbo.sp_serveroption @server = N'LINKED_SERVER_NAME', @optname = N'rpc out', @optvalue = N'TRUE'; GO SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT @@VERSION AS SourceServerVersion'); GO
Cloud SQL for SQL Server 2025
USE [master]; GO EXEC master.dbo.sp_addlinkedserver @server = N'LINKED_SERVER_NAME', @srvproduct = N'', @provider = N'MSOLEDBSQL19', @datasrc = N'SOURCE_HOST_IP_ADDRESS,SOURCE_PORT_NUMBER', @provstr = N'Encrypt=Optional;TrustServerCertificate=Yes;Authentication=SqlPassword;UID=Placeholder;'; GO EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LINKED_SERVER_NAME', @useself = N'False', @locallogin = N'sqlserver', @rmtuser = N'SOURCE_USERNAME', @rmtpassword = N'SOURCE_PASSWORD'; GO EXEC master.dbo.sp_serveroption @server = N'LINKED_SERVER_NAME', @optname = N'rpc out', @optvalue = N'TRUE'; GO SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT @@VERSION AS SourceServerVersion'); GO
替换以下内容:
LINKED_SERVER_NAME替换为 Cloud SQL for SQL Server 上的链接服务器的名称(例如source_sql_linked_server)。SOURCE_HOST_IP_ADDRESS替换为源 SQL Server 实例的专用 IP 地址(如果为多副本源可用性组配置了可用性组监听器 IP 地址,则替换为该地址)。- 将
SOURCE_PORT_NUMBER替换为源 SQL Server 数据库引擎接受连接的端口号(默认值为1433)。 SOURCE_USERNAME替换为您在创建专用 Database Migration Service 登录名和权限中在源实例上创建的专用 SQL 登录名。- 将
SOURCE_PASSWORD替换为SOURCE_USERNAME登录密码。
创建连接配置文件并运行迁移作业
使用 Google Cloud CLI 创建来源和目标连接配置文件、创建持续 DAG 迁移作业、验证迁移配置并启动迁移作业:
-
创建来源连接配置文件。
运行gcloud database-migration connection-profiles create sqlserver命令(点击展开):gcloud database-migration connection-profiles create sqlserver此示例使用可选的
--no-async标志,以便同步执行所有操作。这意味着某些命令可能需要一段时间才能完成。您可以跳过--no-async标志,以异步方式运行命令。如果这样做,您需要使用gcloud database-migration operations describe命令来验证操作是否成功。gcloud database-migration connection-profiles create sqlserver SOURCE_CONNECTION_PROFILE_ID \ --no-async \ --display-name=SOURCE_CONNECTION_PROFILE_NAME \ --region=REGION \ --role=SOURCE \ --host=SOURCE_HOST_IP_ADDRESS \ --port=SOURCE_PORT_NUMBER \ --dbm-port=SOURCE_DBM_PORT_NUMBER \ --username=SOURCE_USERNAME \ --password=SOURCE_PASSWORD
替换以下内容:
SOURCE_CONNECTION_PROFILE_ID替换为来源连接配置文件的机器可读标识符(例如sqlserver-dag-source-profile)。SOURCE_CONNECTION_PROFILE_NAME替换为来源连接配置文件的直观易懂的名称。此值显示在 Google Cloud 控制台的 Database Migration Service 中。- 将
REGION替换为您要在其中保存连接配置文件的区域的标识符(例如us-central1)。 SOURCE_HOST_IP_ADDRESS替换为源 SQL Server 实例的专用 IP 地址(如果为多副本源可用性组配置了可用性组监听器 IP 地址,则替换为该地址)。- 将
SOURCE_PORT_NUMBER替换为源 SQL Server 数据库引擎接受连接的端口号(默认值为1433)。 - 将
SOURCE_DBM_PORT_NUMBER替换为源数据库镜像端点的 TCP 端口号(默认值为5022)。 SOURCE_USERNAME替换为您在创建专用 Database Migration Service 登录名和权限中在源实例上创建的专用 SQL 登录名。- 将
SOURCE_PASSWORD替换为SOURCE_USERNAME登录密码。
-
创建目标连接配置文件。
运行gcloud database-migration connection-profiles create sqlserver命令(点击展开):gcloud database-migration connection-profiles create sqlserver此示例使用可选的
--no-async标志,以便同步执行所有操作。这意味着某些命令可能需要一段时间才能完成。您可以跳过--no-async标志,以异步方式运行命令。如果这样做,您需要使用gcloud database-migration operations describe命令来验证操作是否成功。gcloud database-migration connection-profiles create sqlserver DESTINATION_CONNECTION_PROFILE_ID \ --no-async \ --display-name=DESTINATION_CONNECTION_PROFILE_NAME \ --region=REGION \ --role=DESTINATION \ --cloudsql-instance=CLOUDSQL_INSTANCE_ID \ --host=DESTINATION_HOST_IP_ADDRESS \ --port=DESTINATION_PORT_NUMBER \ --dbm-port=DESTINATION_DBM_PORT_NUMBER \ --username=sqlserver \ --password=CLOUD_SQL_DB_USER_PASSWORD
替换以下内容:
DESTINATION_CONNECTION_PROFILE_ID替换为目标连接配置文件的机器可读标识符(例如sqlserver-dag-dest-profile)。- 将
DESTINATION_CONNECTION_PROFILE_NAME替换为目标连接配置文件的直观易懂的名称。此值显示在 Google Cloud 控制台的 Database Migration Service 中。 - 将
REGION替换为您要在其中保存连接配置文件的区域的标识符。 CLOUDSQL_INSTANCE_ID替换为 Cloud SQL for SQL Server 目标实例的名称。DESTINATION_HOST_IP_ADDRESS替换为目标 Cloud SQL for SQL Server 实例的专用 IP 地址(或其 Private Service Connect 端点 IP 地址),该地址可从源 SQL Server 实例访问。DESTINATION_PORT_NUMBER替换为目标 Cloud SQL for SQL Server 实例的数据库端口号 (1433)。DESTINATION_DBM_PORT_NUMBER替换为目标 Cloud SQL for SQL Server 实例 (5022) 的数据库镜像端口号。CLOUD_SQL_DB_USER_PASSWORD替换为目标 Cloud SQL for SQL Server 实例上sqlserver用户的密码(--username必须设置为sqlserver)。
-
创建持续 DAG 迁移作业。
运行gcloud database-migration migration-jobs create命令(点击展开):gcloud database-migration migration-jobs create此示例使用可选的
--no-async标志,以便同步执行所有操作。这意味着某些命令可能需要一段时间才能完成。您可以跳过--no-async标志,以异步方式运行命令。如果这样做,您需要使用gcloud database-migration operations describe命令来验证操作是否成功。gcloud database-migration migration-jobs create MIGRATION_JOB_ID \ --no-async \ --display-name=MIGRATION_JOB_NAME \ --region=REGION \ --type=CONTINUOUS \ --source=SOURCE_CONNECTION_PROFILE_ID \ --destination=DESTINATION_CONNECTION_PROFILE_ID \ --sqlserver-dag-source-ag=SOURCE_AVAILABILITY_GROUP_NAME \ --sqlserver-dag-linked-server=LINKED_SERVER_NAME
替换以下内容:
- 将
MIGRATION_JOB_ID替换为迁移作业的机器可读标识符(例如sqlserver-dag-job)。 - 将
MIGRATION_JOB_NAME替换为迁移作业的人类可读名称。此值会显示在 Google Cloud 控制台中。 - 将
REGION替换为您要在其中创建迁移作业的区域的标识符。 - 将
SOURCE_CONNECTION_PROFILE_ID替换为来源连接配置文件的标识符。 - 将
DESTINATION_CONNECTION_PROFILE_ID替换为目标连接配置文件的标识符。 SOURCE_AVAILABILITY_GROUP_NAME替换为源 SQL Server 实例上的可用性组的名称。- 将
LINKED_SERVER_NAME替换为您在在 Cloud SQL for SQL Server 目标实例上创建并验证链接服务器中为 Cloud SQL for SQL Server 目标实例配置的链接服务器的名称。
- 将
-
验证迁移作业配置。
在启动 DAG 迁移作业之前,您必须运行verify,以验证双向网络连接、链接服务器 RPC 访问权限、gcp_dms_db权限(如果使用最小权限)、源数据库所有者(验证没有数据库归sa所有)以及默认数据文件路径。运行gcloud database-migration migration-jobs verify命令(点击可展开):gcloud database-migration migration-jobs verifygcloud database-migration migration-jobs verify MIGRATION_JOB_ID \ --region=REGION
替换以下内容:
- 将
MIGRATION_JOB_ID替换为迁移作业的标识符。 - 将
REGION替换为保存迁移作业的区域的标识符。
您可以通过运行
gcloud database-migration operations describe命令来检查验证操作的状态。 - 将
-
启动迁移作业。
验证成功后,运行gcloud database-migration migration-jobs start命令(点击即可展开):gcloud database-migration migration-jobs startgcloud database-migration migration-jobs start MIGRATION_JOB_ID \ --region=REGION
替换以下内容:
- 将
MIGRATION_JOB_ID替换为迁移作业的标识符。 - 将
REGION替换为保存迁移作业的区域的标识符。
- 将
监控和验证迁移
DAG 迁移作业运行时,您可以在 Google Cloud 控制台中监控其进度,在CDC期间以只读模式查询目标数据库,并管理活跃复制。
在 Google Cloud 控制台中监控进度
您可以在 Google Cloud 控制台中的迁移作业详情页面上监控正在运行的 DAG 迁移作业,就像监控其他 Database Migration Service 迁移作业一样:
- 在迁移作业详情页面的数据库表中,查看可用性组中每个数据库的实时阶段(初始完整加载期间为
Full dump,持续复制期间为CDC,以及任何数据库级出错提示)和恢复延迟时间。 - 在监控标签页中,查看恢复延迟时间(
datamigration.googleapis.com/migration_job/max_replica_sec_lag,报告分布式可用性组复制延迟时间,以每个数据库的秒数为单位)图表。
如需详细了解监控指标和作业状态,请参阅迁移作业指标和迁移作业状态代码。
在 CDC 期间验证处于只读模式的已迁移数据库
与基于备份的迁移(目标数据库在升级前一直处于 RESTORING 状态)不同,分布式可用性组迁移允许您在目标 Cloud SQL for SQL Server 数据库进入 CDC 阶段后立即以只读模式查询这些数据库。
对于源实例上由 SQL 登录名拥有的每个数据库,Database Migration Service 会自动在目标 Cloud SQL for SQL Server 实例上创建一个登录名,该登录名带有 gcp_dms_ 前缀、一个 6 字符标识符和源所有者名称(例如 gcp_dms_a1b2c3_myowner)。如需在升级前使用该登录名查询数据库,请以 sqlserver 身份连接到目标 Cloud SQL for SQL Server 实例,在 sys.server_principals 中找到生成的登录名,然后重置其密码:
SELECT name FROM sys.server_principals WHERE name LIKE 'gcp_dms_%'; GO ALTER LOGIN [GENERATED_DMS_OWNER_LOGIN] WITH PASSWORD = 'NEW_OWNER_PASSWORD'; GO
替换以下内容:
- 将
GENERATED_DMS_OWNER_LOGIN替换为查询返回的生成的数据库所有者登录名。 NEW_OWNER_PASSWORD,其中包含用于登录的新密码。
如需详细了解如何验证迁移的对象和数据,请参阅验证迁移。
管理活跃的 DAG 迁移作业(可选)
当迁移作业在 CDC 阶段运行时,您可以执行以下管理操作:
- 通过运行
ALTER AVAILABILITY GROUP ... ADD DATABASE或ALTER AVAILABILITY GROUP ... REMOVE DATABASE,在源 SQL Server 实例上的源可用性组中添加或移除数据库。Database Migration Service 会在下一个轮询周期中自动检测到更改,并更新目标 Cloud SQL for SQL Server 实例。 - 通过运行
gcloud database-migration migration-jobs stop暂时停止数据复制。停止 DAG 迁移作业的操作只能在明确的短时间内使用,因为在复制停止期间,更新会继续在事务日志中累积,并可能导致事务日志磁盘填满。在停止状态下,您可以运行gcloud database-migration migration-jobs resume以恢复数据复制,也可以运行gcloud database-migration migration-jobs delete以完成迁移并执行必要的清理。 - 通过运行
gcloud database-migration migration-jobs restart重启失败的迁移作业。重启 DAG 迁移作业会删除目标 Cloud SQL for SQL Server 实例上已迁移的数据库,重新创建分布式可用性组,并通过网络重新运行初始完整加载。
提升、故障切换或完成迁移
当您准备好将应用切换到 Cloud SQL for SQL Server 时,请提升迁移作业。在 DAG 迁移中,提升作业会将 Cloud SQL for SQL Server 切换为读写主实例,并将迁移作业转换为 FAILBACK 阶段(在 Google Cloud CLI 和 API 响应中为 PHASE_FAILBACK),同时启用反向复制,将数据复制回源 SQL Server 实例:
- 停止应用对源 SQL Server 数据库的写入,并在 Google Cloud 控制台中检查恢复延迟时间指标,以确认复制延迟时间已达到零。
-
提升迁移作业以切换到 Cloud SQL。
运行gcloud database-migration migration-jobs promote命令(点击展开):gcloud database-migration migration-jobs promotegcloud database-migration migration-jobs promote MIGRATION_JOB_ID \ --region=REGION
替换以下内容:
- 将
MIGRATION_JOB_ID替换为迁移作业的标识符。 - 将
REGION替换为保存迁移作业的区域的标识符。
在提升期间,Database Migration Service 会执行以下操作:
- 将分布式可用性组设置为同步提交,在所有源数据库上发出
CHECKPOINT,等待所有事务同步且不丢失数据,然后反转可用性组角色,使目标 Cloud SQL for SQL Server 实例成为读/写主要实例,而原始源 SQL Server 实例成为次要实例。 - 将迁移作业保持在
Running状态,并将子状态转换为FAILBACK阶段(在 Google Cloud CLI 和 API 响应中为PHASE_FAILBACK),从而持续将新的写入操作从目标 Cloud SQL for SQL Server 复制回源 SQL Server 实例。
提升完成后,将应用连接到新的 Cloud SQL for SQL Server 实例。
- 将
-
(可选)故障切换回源 SQL Server 实例。
如果您在迁移作业处于FAILBACK阶段时将应用切换到 Cloud SQL for SQL Server 后遇到问题,可以停止在 Cloud SQL for SQL Server 上写入应用,并运行带有--failback标志的gcloud database-migration migration-jobs promote命令,以零数据丢失的方式还原割接(点击展开):gcloud database-migration migration-jobs promote --failbackgcloud database-migration migration-jobs promote MIGRATION_JOB_ID \ --region=REGION \ --failback
替换以下内容:
- 将
MIGRATION_JOB_ID替换为迁移作业的标识符。 - 将
REGION替换为保存迁移作业的区域的标识符。
在
FAILBACK阶段运行带有--failback标志的promote会同步写入 Cloud SQL for SQL Server 的所有更改,再次切换复制方向,使原始来源 SQL Server 可用性组成为读/写主要,Cloud SQL for SQL Server 成为次要,并将迁移作业返回到CDC阶段。请注意,--failback仅在迁移作业处于FAILBACK阶段时有效;在FAILBACK阶段运行不带--failback的promote(或在CDC阶段传递--failback)会导致验证失败并出现FAILED_PRECONDITION错误,并使迁移作业保持运行状态。 - 将
-
(可选)在删除迁移作业之前停止数据复制。
如果您想在永久删除迁移作业之前停止数据复制,请运行gcloud database-migration migration-jobs stop命令(点击展开):gcloud database-migration migration-jobs stopgcloud database-migration migration-jobs stop MIGRATION_JOB_ID \ --region=REGION
替换以下内容:
- 将
MIGRATION_JOB_ID替换为迁移作业的标识符。 - 将
REGION替换为保存迁移作业的区域的标识符。
- 将
-
完成迁移并删除迁移作业。
验证应用在新的 Cloud SQL for SQL Server 目标实例上完全正常运行,并且您不再需要反向复制到源 SQL Server 实例后,请删除迁移作业(从Running或Stopped状态),以完成迁移并执行必要的清理。运行gcloud database-migration migration-jobs delete命令(点击可展开):gcloud database-migration migration-jobs delete此命令会返回一个交互式确认提示,需要您输入内容才能完成。 您可以使用 可选的
--quiet标志跳过确认提示。gcloud database-migration migration-jobs delete MIGRATION_JOB_ID \ --region=REGION
替换以下内容:
- 将
MIGRATION_JOB_ID替换为迁移作业的标识符。 - 将
REGION替换为保存迁移作业的区域的标识符。
删除迁移作业会完成迁移,停止所有活跃的反向复制,删除两个实例上的分布式可用性组和数据库镜像证书,并允许您启用在 DAG 复制期间受限的 Cloud SQL for SQL Server 功能(例如时间点恢复 [PITR] 或读取副本)。
删除迁移作业后,您可以选择停用或移除目标 Cloud SQL for SQL Server 实例上的
cloud sql enable dag support数据库标志,删除 Cloud SQL for SQL Server 实例 (EXEC master.dbo.sp_dropserver @server = N'LINKED_SERVER_NAME', @droplogins = 'droplogins';) 上的链接服务器,以及移除源 SQL Server 实例上的gcp_dms_db辅助数据库和迁移登录名。 - 将