本頁說明如何設定 Cloud SQL 執行個體,以便發布至 Cloud SQL 外部或內部的訂閱者。SQL Server 適用的 Cloud SQL 外部複製功能會使用交易式複製,其中 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,您必須設定私人服務存取權。這需要在 Cloud SQL 虛擬私有雲和客戶的虛擬私有雲之間,透過需要通告的自訂 IP 範圍進行對等互連。
從內部部署環境連線時,內部部署防火牆必須允許傳入和傳出連線。具體來說,內部部署防火牆必須允許通訊埠 1433 上的這類連線,連至用於特定 Google Cloud 服務 (在本例中為 Cloud SQL) 的私人服務存取子網路範圍。建議允許子網路範圍,而非為每個建立的執行個體指定 IP。
如需相關資訊,請參閱下列說明:
權限與角色
以下各節將說明權限和角色。
封裝權限
Cloud SQL 提供的預存程序包含交易式複寫所需的權限。這些是包裝函式預存程序,有時會呼叫一或多個 Microsoft 預存程序。如要瞭解 Microsoft 預存程序,請參閱 Microsoft 說明文件。
必要角色
使用的帳戶 (包括記錄讀取代理程式) 需要db_owner
角色,就像sqlserver
使用者一樣。如需必要資訊,請參閱「Replication Agent Security Model」。
使用預存程序發布、散布及訂閱
本節包含設定交易式複寫的建議步驟。
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 提供更多範例,說明如何使用 Replication Monitor 查詢錯誤。舉例來說,sqlserver
使用者可能無法存取指令。
複寫代理程式工作
設定複製功能後,sqlserver
使用者不會在 SSMS 中看到新的 SQL 代理程式作業。不過,您可以使用下列方式查看這些檔案:
USE msdb
select * from dbo.sysjobs
複寫監控器中缺少發布者
您可以使用複製監控器查看複製狀態,並排解複製問題。
舉例來說,當您設定複寫時,如果發布者 Cloud SQL 執行個體使用 IP 位址,SSMS 可能就找不到發布者。這是因為該伺服器不知道主機名稱與 IP 位址之間的對應關係。
「複寫監視器」包含空白的「發布」分頁:
如要解決這個問題,您可以在 SQL Server Configuration Manager 中,於發布者的 SQL Server 主機名稱和用於從 SSMS 連線的 IP 位址之間建立別名:
啟動 SQL Server Configuration Manager。
找到並選取「別名」節點。
在「別名」下方的方塊上按一下滑鼠右鍵,即可建立新別名。32 位元別名和 64 位元別名都適用相同程序:
使用下列查詢,擷取發布者執行個體的實際主機名稱:
在別名視窗中,輸入下列欄位,然後選取「確定」:
別名:提供步驟 4 中查詢的伺服器名稱。
通訊埠編號:提供通訊埠 1433。
通訊協定:保留預設值 TCP/IP。
伺服器:提供發布商執行個體的 IP 位址。
使用新別名連線,然後啟動複寫監視器:
發布資訊應類似於下列內容:
如要進一步瞭解如何排解複製問題,請參閱「疑難排解工具:找出 SQL Server 交易式複寫的錯誤」。
估算複製所需的文章大小
使用 Cloud SQL 執行個體做為發布者時,必須先產生文章的初始快照,才能開始複製。這項快照會儲存在本機。視文章數量、大小和資料類型而定,儲存空間需求可能會增加。sp_spaceused
儲存程序只會提供文章所需磁碟空間的概略估計值。
快照包含儲存結構定義和資料的檔案。
後續步驟
- 瞭解 Cloud SQL 中的複製功能。