配置外部副本

本页面介绍如何设置 Cloud SQL 实例,以便发布到 Cloud SQL 外部或 Cloud SQL 内的订阅者。Cloud SQL for SQL Server 中的外部复制使用事务复制,其中 Cloud SQL 充当订阅者的发布者。

事务复制支持发布多种对象,如 Microsoft 文档所述。此外,在 Cloud SQL 中,此功能的限制类似于 Microsoft 文档所述的限制。

部分受支持的对象如下:

  • 存储过程
  • 视图
  • 索引视图
  • 用户定义的函数

尽管此页面上有发布过程的示例,但请参阅 Microsoft 文档中的发布数据和数据库对象了解详情。请考虑在发布过程中使用 SQL Server Management Studio (SSMS),因为您的可用选项在 SSMS 中可能更明显。

另请参阅关于 Cloud SQL 中的复制

实现事务复制

Cloud SQL 实例可以通过事务复制充当外部订阅者的发布者和分发者。

如需设置事务复制,您可以执行以下操作:

  • 使用 Cloud SQL 提供的存储过程。它们的前缀为:gcloudsql_transrepl_
  • 使用 Microsoft 提供的存储过程优化复制

限制和前提条件

在规划事务复制时,请查看本部分。

限制

使用高可用性 (HA) 的实例缺少一致的传出 IP 地址。如果这些实例利用公共 IP 连接,则无法作为发布者。因此,如果实例使用高可用性,则必须使用专用 IP 连接。

要定义文章,请参阅 Microsoft 文档中的定义文章,包括限制和局限。

Cloud SQL 提供的存储过程仅支持推送订阅。

前提条件

必须在 Cloud SQL 实例和订阅者实例之间设置双向网络连接。订阅者可以是外部订阅者,例如本地订阅者;也可以是 Cloud SQL 的内部订阅者。

对于使用公共 IP 的 Cloud SQL 实例,Cloud SQL 在其出站流量和入站流量路径上使用不同的 IP 地址。副本必须将主实例的传出 IP 地址列入许可名单,您可以使用 gcloud 命令检索该地址:

gcloud sql instances describe [PRIMARY_NAME] --format="default(ipAddresses)"

如需将 Cloud SQL 专用 IP 地址与本地实例搭配使用,您必须设置专用服务访问通道。这要求通过需要通告的自定义 IP 地址范围在 Cloud SQL VPC 与客户的 VPC 之间建立对等互连。

从本地连接时,本地防火墙必须允许入站和出站连接。具体而言,本地防火墙必须允许在端口 1433 上与用于特定 Google Cloud 服务(本例中为 Cloud SQL)的专用服务访问通道子网范围建立此类连接。对于创建的每个实例,请考虑允许子网范围,而不是特定 IP。

如需了解相关信息,请参阅以下内容:

权限和角色

封装的权限

Cloud SQL 提供的存储过程包括事务复制所需的权限。这些是封装容器存储过程,有时称为一个或多个 Microsoft 存储过程。如需了解 Microsoft 存储过程,请参阅 Microsoft 文档

所需角色

使用的账号(包括为日志读取器代理使用的账号)需要 db_owner 角色,例如 sqlserver 用户。如需了解必要信息,请查看复制代理安全模型

使用存储过程来发布、分发和订阅

本部分介绍设置事务复制的建议步骤。

sqlserver 用户已存储过程,用于设置 Cloud SQL 实例,让其充当发布者。如需了解参考信息,请参阅 Cloud SQL 存储过程

准备使用测试数据库来复制事务

在为生产数据库设置事务复制之前,您可以将实例设置为测试数据库对象的发布者。在本页面上,测试数据库称为 pub_demo 数据库。

使用 sqlserver 用户连接到您的 Cloud SQL 实例,并创建一个数据库以用于测试。例如:

Create Database pub_demo;
GO
USE pub_demo;
CREATE TABLE Employee(employeeId INT primary key);
INSERT INTO Employee([employeeId]) VALUES (1);
INSERT INTO Employee([employeeId]) VALUES (2);

-- Add procedure
CREATE OR ALTER PROCEDURE dbo.p_GetDate
AS
SELECT getdate()

-- Add view
CREATE OR ALTER VIEW dbo.v_GetDbs
AS
SELECT name from sys.databases

-- Function
CREATE OR ALTER FUNCTION dbo.fn_ListDbFiles(@id int)
RETURNS TABLE
AS
RETURN
(
select * from sys.master_files where database_id = @id
)

设置分发数据库

对于分发数据库,您可以使用 msdb.dbo.gcloudsql_transrepl_setup_distribution,它是以下 Microsoft 存储过程的封装容器存储过程:

例如:

EXEC msdb.dbo.gcloudsql_transrepl_setup_distribution @login='sqlserver', @password='<password>'

启用数据库以进行发布

要启用或停用数据库的发布选项,您可以使用 msdb.dbo.gcloudsql_transrepl_replicationdboption。此存储过程适用于使用 sp_replicationdboption 的发布者的发布选项。

例如:

EXEC msdb.dbo.gcloudsql_transrepl_replicationdboption @db='pub_demo', @value='true'

添加日志读取器代理

您可以为使用 sp_addlogreader_agent 的数据库设置日志读取器代理。

例如:

EXEC msdb.dbo.gcloudsql_transrepl_addlogreader_agent @db='pub_demo', @login='sqlserver', @password='<password>'

为数据库创建发布

您可以使用 msdb.dbo.gcloudsql_transrepl_addpublication 为您指定的数据库创建事务性发布。此存储过程会封装 sp_addpublication

例如:

EXEC msdb.dbo.gcloudsql_transrepl_addpublication @db='pub_demo', @publication='pub1'

为指定的发布创建快照代理

如需为发布者数据库创建快照代理,您可以使用 msdb.dbo.gcloudsql_transrepl_addpublication_snapshot,其中封装了 sp_addpublication_snapshot

例如:

EXEC msdb.dbo.gcloudsql_transrepl_addpublication_snapshot @db='pub_demo',  @publication='pub1', @login='sqlserver', @password='<password>'

创建文章并将其添加到发布中

您可以从发布者数据库创建文章,并将其添加到发布中。以 sqlserver 用户的身份使用 sp_addarticle

您还可以使用 SSMS 添加文章。如需了解详情,请参阅在发布中添加文章以及删除文章

例如:

USE pub_demo;
GO

EXEC sp_addarticle @publication = 'pub1',
                   @article = 'csql_dbo.employee',
                   @source_owner = 'dbo',
                   @source_object = 'Employee',
                   @description = N'cloudsql_article_table',
                   @schema_option = 0x000000000903409D,
                   @identityrangemanagementoption = N'manual',
                   @destination_table = 'Employee',
                   @destination_owner = 'dbo';

-- add function
use [pub_demo]
exec sp_addarticle  @publication = N'pub1',
                   @article = N'fn_ListDbFiles',
                   @source_owner = N'dbo',
                   @source_object = N'fn_ListDbFiles',
                   @type = N'func schema only',
                   @description = N'',
                   @creation_script = N'',
                   @pre_creation_cmd = N'drop',
                   @schema_option = 0x0000000008000001,
                   @destination_table = N'fn_ListDbFiles',
                   @destination_owner = N'dbo',
                   @status = 16

-- add procedure
use [pub_demo]
exec sp_addarticle  @publication = N'pub1',
                   @article = N'p_GetDate',
                   @source_owner = N'dbo',
                   @source_object = N'p_GetDate',
                   @type = N'proc schema only',
                   @description = N'',
                   @creation_script = N'',
                   @pre_creation_cmd = N'drop',
                   @schema_option = 0x0000000008000001,
                   @destination_table = N'p_GetDate',
                   @destination_owner = N'dbo',
                   @status = 16

-- add view
use [pub_demo]
exec sp_addarticle  @publication = N'pub1',
                   @article = N'v_GetDbs',
                   @source_owner = N'dbo',
                   @source_object = N'v_GetDbs',
                   @type = N'view schema only',
                   @description = N'',
                   @creation_script = N'',
                   @pre_creation_cmd = N'drop',
                   @schema_option = 0x0000000008000001,
                   @destination_table = N'v_GetDbs',
                   @destination_owner = N'dbo',
                   @status = 16

向发布添加订阅

在数据库中,您可以将订阅添加到发布中。以 sqlserver 用户身份,使用 sp_addsubscription 设置订阅者状态。

例如:

Use pub_demo;
GO
EXEC sp_addsubscription @publication ='pub1',
                        @subscriber = N'10.10.100.1,1433',
                        @destination_db = pub_demo,
                        @subscription_type = N'Push',
                        @sync_type = N'automatic',
                        @article = N'all',
                        @update_mode = N'read only',
                        @subscriber_type = 0

连接到订阅者并创建订阅数据库

您可以连接到订阅者并创建一个订阅数据库,供复制的数据填充。

例如:

 Create Database pub_demo

添加新的计划代理作业以同步推送订阅

您可以添加新的计划代理作业,以将推送订阅同步到发布。例如,在发布者数据库上,运行类似如下的命令。此命令使用 msdb.dbo.gcloudsql_transrepl_addpushsubscription_agent,这是 sp_addpushsubscription_agent 的封装容器过程:

EXEC msdb.dbo.gcloudsql_transrepl_addpushsubscription_agent
@db='pub_demo',
@publication = 'pub1',
@subscriber_db= 'pub_demo',
@subscriber_login='sqlserver',
@subscriber_password='<password>',
@subscriber='11.11.111.1,1433'

启动发布快照代理作业

您可以启动发布快照代理作业,如下所示:

USE pub_demo;
EXEC sp_startpublication_snapshot
@publication = 'pub1'

向账号授予使用复制监控的访问权限

使用 msdb.dbo.gcloudsql_transrepl_addmonitoraccess 来执行以下操作:

  • 提供对 SSMS 中的复制监控的访问权限
  • 查询分发数据库中的表

因此,此存储过程允许您在分发数据库的复制相关表(例如 MSrepl_errors 表)上使用 SELECT 语句:

EXEC msdb.dbo.gcloudsql_transrepl_addmonitoraccess
@login = 'sqlserver'

更改分布数据库属性

您可以更改 heartbeat_interval。使用 msdb.dbo.gcloudsql_transrepl_changedistributor_property 过程,该过程封装 sp_changedistributor_property

如需了解详情,请参阅 sp_changedistributor_property文档。如需详细了解 heartbeat_interval 值,另请参阅该文档。

例如:

EXEC msdb.dbo.gcloudsql_transrepl_changedistributor_property
@property = N'heartbeat_interval',
@value = 90

使用复制监控

右键点击 SSMS 中的复制节点,然后选择启动复制监控

如果您点击“代理”标签页,应该会看到类似于以下内容的视图:

“代理”标签页上的文件夹

使用存储过程移除复制

本部分介绍移除事务复制的建议步骤。

删除订阅

如需删除订阅者,请使用 sp_dropsubscription 存储过程。

以下是删除订阅的命令示例:

USE  pub_demo;
GO
EXEC sp_dropsubscription
          @publication = 'csql_pub_pub_demo',
          @article     = N'all',
          @subscriber  = N'11.11.111.1,1433'

删除订阅者

如需删除订阅者,请使用 msdb.dbo.gcloudsql_transrepl_dropsubscriber 存储过程:

EXEC msdb.dbo.gcloudsql_transrepl_dropsubscriber
 @subscriber  = N'11.11.111.1,1433'

删除发布

如需删除发布,请使用 msdb.dbo.gcloudsql_transrepl_droppublication 存储过程:

EXEC msdb.dbo.gcloudsql_transrepl_droppublication
  @db = 'pub_demo', @publication='pub1'

停用发布数据库

如需停用发布数据库,请使用 msdb.dbo.gcloudsql_transrepl_replicationdboption 存储过程:

EXEC msdb.dbo.gcloudsql_transrepl_replicationdboption
@db='pub_demo',
@value=N'false'

移除分发数据库

如需移除分发数据库,请使用 msdb.dbo.gcloudsql_transrepl_remove_distribution 存储过程:

EXEC msdb.dbo.gcloudsql_transrepl_remove_distribution

问题排查提示和步骤

从正确的数据库运行存储过程

您在运行 sp_addarticlesp_addsubscriptionsp_startpublication_snapshot 时,可能会遇到以下错误:

Only members of the sysadmin fixed server role or db_owner fixed database role can perform this operation.

此外,运行 sp_dropsubscription 时,您可能会遇到以下错误:

This database is not enabled for publication.

请注意,如果发生这些错误,您必须从这些存储过程所适用的数据库中运行它们。您可以使用以下语句确认它们从正确的数据库运行:

USE <database_name>;
GO
<Run stored proc>

副本

SQL 错误日志和其他位置会提供复制错误。您可以直接在分布数据库中查询某些表是否存在复制错误。例如:

select * from [cloudsql_distribution]..msrepl_errors
select * from [cloudsql_distribution]..MSreplication_monitordata

Microsoft 在此处提供了有关如何使用复制监视器查找错误的更多示例。例如,sqlserver 用户可能缺少对命令的访问权限。

复制代理作业

设置复制后,新的 SQL 代理作业在 SSMS 中不会显示给 sqlserver 用户。不过,您可以使用以下工具查看它们:

USE msdb
select * from dbo.sysjobs

复制监控中缺少发布者

您可以使用复制监控查看复制状态并排查复制问题。

例如,当您设置复制且发布者 Cloud SQL 实例使用 IP 地址时,SSMS 可能无法找到发布者。这是因为它不知道主机名和 IP 地址之间的映射。

复制监控包含空的“发布”标签页:

“发布”标签页中没有任何行

如需解决此问题,您可以使用 SQL Server 配置管理器在发布者的 SQL Server 主机名和用于从 SSMS 进行连接的 IP 地址之间创建别名

  1. 启动 SQL Server 配置管理器。

    SQL Server 配置管理器

  2. 找到别名节点并将其选中。

    已选择别名节点

  3. 右键点击别名下的框,以创建新别名。相同的过程也适用于 32 位别名和 64 位别名:

    “别名”下的下拉框

  4. 使用以下查询检索发布者实例的实际主机名:

    针对发布者实例的实际主机名的查询

  5. 在别名窗口中,输入以下字段,然后选择确定

    别名:提供第 4 步的查询中的服务器名称。

    端口号:提供端口 1433。

    协议:将值保留为默认的 TCP/IP。

    服务器:提供发布者实例的 IP 地址。

    别名、服务器等的值。

  6. 使用新别名连接,并启动复制监控:

    “连接到服务器”对话框

发布信息应类似于以下内容:

复制监控现在在“发布”标签页中显示一行

如需详细了解如何排查复制问题,请参阅“问题排查工具:查找 SQL Server 事务复制错误”

估算复制所需的文章大小

将 Cloud SQL 实例用作发布者时,需要生成文章的初始快照,才能开始复制。此快照存储在本地。根据文章的数量、大小和数据类型,存储需求可能会增多。sp_spaceused 存储过程仅提供文章所需的磁盘可用空间的粗略估计值。

快照包含存储架构和数据的文件。

后续步骤