本页面介绍如何设置 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。
如需了解相关信息,请参阅以下内容:
- 配置专用 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_addarticle
、sp_addsubscription
或 sp_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 地址之间创建别名:
启动 SQL Server 配置管理器。
找到别名节点并将其选中。
右键点击别名下的框,以创建新别名。相同的过程也适用于 32 位别名和 64 位别名:
使用以下查询检索发布者实例的实际主机名:
在别名窗口中,输入以下字段,然后选择确定:
别名:提供第 4 步的查询中的服务器名称。
端口号:提供端口 1433。
协议:将值保留为默认的 TCP/IP。
服务器:提供发布者实例的 IP 地址。
使用新别名连接,并启动复制监控:
发布信息应类似于以下内容:
如需详细了解如何排查复制问题,请参阅“问题排查工具:查找 SQL Server 事务复制错误”。
估算复制所需的文章大小
将 Cloud SQL 实例用作发布者时,需要生成文章的初始快照,才能开始复制。此快照存储在本地。根据文章的数量、大小和数据类型,存储需求可能会增多。sp_spaceused
存储过程仅提供文章所需的磁盘可用空间的粗略估计值。
快照包含存储架构和数据的文件。
后续步骤
- 了解 Cloud SQL 中的复制。