設定外部備用資源

本頁說明如何設定 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_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 提供更多範例,說明如何使用 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 位址之間建立別名

  1. 啟動 SQL Server Configuration Manager。

    SQL Server 組態管理員

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

    選取「別名」節點

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

    別名名稱下方的下拉式方塊

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

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

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

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

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

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

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

    別名、伺服器等的值。

  6. 使用新別名連線,然後啟動複寫監視器:

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

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

「複製監控器」的「發布」分頁現在會顯示資料列

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

估算複製所需的文章大小

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

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

後續步驟