設定外部備用資源

本頁面說明如何設定 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_propertymsdb.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」(代理程式) 分頁後,畫面應會顯示類似下圖的畫面:

「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_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 提供更多範例,說明如何使用複製監控器查詢錯誤。例如,sqlserver 使用者可能沒有指令存取權。

複製代理程式工作

複製作業完成後,sqlserver 使用者就無法在 SSMS 中看到新的 SQL 代理程式工作。不過,您可以使用下列方式查看這些資料:

USE msdb
select * from dbo.sysjobs

複製監控器中缺少發布者

您可以使用複製監控器查看複製狀態,並排解複製問題。

舉例來說,如果您設定複寫作業,而發布端 Cloud SQL 執行個體使用 IP 位址,SSMS 可能無法找到發布端。這是因為它不知道主機名稱和 IP 位址之間的對應關係。

複本監控器包含空白的「Publications」分頁:

「Publications」分頁中沒有任何資料列

解決方法是,在 SQL Server 設定管理工具中,在發布者的 SQL Server 主機名稱和用於透過 SSMS 連線的 IP 位址之間建立別名

  1. 啟動 SQL Server 組態管理工具。

    SQL Server 組態管理員

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

    已選取別名節點

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

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

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

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

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

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

    Port No.:提供 1433 通訊埠。

    Protocol:將值保留為預設的 TCP/IP。

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

    別名名稱、伺服器等值。

  6. 使用新的別名連線,然後啟動複製監控工具:

    「Connect to Server」對話方塊

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

複製監控器現在會在「發布」分頁中顯示一列

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

預估複製所需的文章大小

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

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

後續步驟