設定外部備用資源

本頁說明如何設定 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 連線。
  • 如果您使用 Private Service Connect,請務必在發布者執行個體上設定傳出連線。
  • 如要定義文章,請參閱 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 範圍進行對等互連。

如要搭配使用 Cloud SQL 和 Private Service Connect,請參閱「設定 Private Service Connect」。使用 Private Service Connect 時,請務必在發布者執行個體上設定輸出連線,允許與訂閱者通訊。

從地端連線時,地端防火牆必須允許傳入和傳出連線。具體來說,內部部署防火牆必須允許通訊埠 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_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 位址之間的對應關係。

「複寫監控器」包含空白的「出版品」分頁:

「出版品」分頁中沒有任何列

如要解決這個問題,您可以在 SQL Server Configuration Manager 中,於發布者的 SQL Server 主機名稱和用來從 SSMS 連線的 IP 位址之間建立別名:

  1. 啟動 SQL Server Configuration Manager。

    SQL Server 組態管理員

  2. 找到並選取「別名」節點。

    選取「別名」節點

  3. 在「別名」下方的方塊上按一下滑鼠右鍵,即可建立新別名。32 位元別名和 64 位元別名都適用相同程序:

    「別名」下方的下拉式方塊

  4. 使用下列查詢,擷取發布者執行個體的實際主機名稱:

    查詢發布商執行個體的實際主機名稱

  5. 在別名視窗中,輸入下列欄位,然後選取「確定」:

    別名:提供步驟 4 中查詢的伺服器名稱。

    通訊埠編號:提供通訊埠 1433。

    通訊協定:保留預設值 TCP/IP。

    伺服器:提供發布商執行個體的 IP 位址。

    別名、伺服器等的值。

  6. 使用新別名連線,然後啟動「Replication Monitor」:

    「連線至伺服器」對話方塊

發布資訊應與下列內容類似:

「Replication Monitor」的「Publications」分頁現在會顯示資料列

如要進一步瞭解如何排解複製問題,請參閱「疑難排解工具:找出 SQL Server 交易式複寫的錯誤」。

估算複製所需的文章大小

使用 Cloud SQL 執行個體做為發布者時,必須先產生要複製的文章的初始快照,才能開始複製。這項快照會儲存在本機。視文章數量、大小和資料類型而定,儲存空間需求可能會增加。儲存程序 sp_spaceused 只能提供文章所需磁碟空間的概略估計值。

快照包含儲存結構定義和資料的檔案。

後續步驟