本頁面說明如何設定 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 連線,就無法成為發布端。因此,如果執行個體使用 HA,就必須使用私人 IP 連線。
- 如要定義文章,請參閱 Microsoft 說明文件中的「定義文章」,瞭解限制和限制。
- Cloud SQL 提供的預存程序僅支援推播訂閱。
- 您無法在已設定複製功能的執行個體上設定外部複製功能。
事前準備
您必須在 Cloud SQL 執行個體和訂閱者執行個體之間設定雙向網路連線。訂閱者可以是外部訂閱者,例如內部訂閱者,也可以是 Cloud SQL 內部的訂閱者。
對於使用公開 IP 的 Cloud SQL 執行個體,Cloud SQL 會在傳出和傳入路徑上使用不同的 IP 位址。副本必須將主要執行個體的傳出 IP 位址加入許可清單,您可以使用 gcloud
指令擷取該 IP 位址:
gcloud sql instances describe [PRIMARY_NAME] --format="default(ipAddresses)"
如要在內部部署的執行個體中使用 Cloud SQL 私人 IP,您必須設定私人服務存取權。這項作業需要在 Cloud SQL VPC 和客戶的 VPC 之間,透過需要通告的自訂 IP 範圍進行對等互連。
從內部部署環境連線時,內部部署防火牆必須允許傳入和傳出連線。具體來說,內部部署防火牆必須允許通訊埠 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
。使用會包裝 sp_changedistributor_property
的 msdb.dbo.gcloudsql_transrepl_changedistributor_property
程序。
詳情請參閱 sp_changedistributor_property
的說明文件。如要進一步瞭解 heartbeat_interval
值,請參閱該說明文件。
例如:
EXEC msdb.dbo.gcloudsql_transrepl_changedistributor_property
@property = N'heartbeat_interval',
@value = 90
使用複製監控工具
在 SSMS 中對複製節點按一下滑鼠右鍵,然後選擇「Launch Replication Monitor」。
按一下「Agents」(代理程式) 分頁後,畫面應會顯示類似下圖的畫面:
使用預存程序移除複本
本節將說明移除交易式複寫功能的建議步驟。
取消訂閱
如要取消訂閱,請使用 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
使用者可能沒有指令存取權。
複製代理程式工作
複製作業完成後,sqlserver
使用者就無法在 SSMS 中看到新的 SQL 代理程式工作。不過,您可以使用下列方式查看這些資料:
USE msdb
select * from dbo.sysjobs
複製監控器中缺少發布者
您可以使用複製監控器查看複製狀態,並排解複製問題。
舉例來說,如果您設定複寫作業,而發布端 Cloud SQL 執行個體使用 IP 位址,SSMS 可能無法找到發布端。這是因為它不知道主機名稱和 IP 位址之間的對應關係。
複本監控器包含空白的「Publications」分頁:
解決方法是,在 SQL Server 設定管理工具中,在發布者的 SQL Server 主機名稱和用於透過 SSMS 連線的 IP 位址之間建立別名:
啟動 SQL Server 組態管理工具。
找出「別名」節點並選取。
在「別名名稱」下方的方塊中按一下滑鼠右鍵,即可建立新的別名。32 位元別名和 64 位元別名適用相同的程序:
使用以下查詢,擷取發布者執行個體的實際主機名稱:
在別名視窗中輸入下列欄位,然後選取「OK」:
別名名稱:提供步驟 4 查詢中的伺服器名稱。
Port No.:提供 1433 通訊埠。
Protocol:將值保留為預設的 TCP/IP。
伺服器:提供發布者執行個體的 IP 位址。
使用新的別名連線,然後啟動複製監控工具:
發布資訊應類似於以下內容:
如要進一步瞭解如何排解複製問題,請參閱「疑難排解:找出 SQL Server 交易複製作業錯誤」。
預估複製所需的文章大小
當您使用 Cloud SQL 執行個體做為發布端時,必須先取得要產生的文章的初始快照,才能開始複製作業。這個快照會儲存在本機,視文章數量、大小和資料類型而定,儲存空間需求可能會增加。sp_spaceused
儲存程序只會提供文章所需磁碟空間的粗略估計值。
快照包含儲存結構定義和資料的檔案。
後續步驟
- 瞭解 Cloud SQL 中的複寫功能。