使用分散式可用性群組,從自行管理的 SQL Server 遷移

本指南說明如何使用資料庫遷移服務中的分散式可用性群組 (DAG),透過私人網路連線,將資料庫從自行管理的 SQL Server Enterprise Edition 執行個體,遷移至 SQL Server 適用的 Cloud SQL Enterprise Edition。

透過 DAG 遷移,資料庫遷移服務會直接在來源可用性群組和目的地 SQL Server 適用的 Cloud SQL 可用性群組之間的網路,串流初始完整載入 (稱為 FULL_DUMP 階段) 和持續交易記錄複製 (稱為變更資料擷取 - CDC - 階段)。如要進一步瞭解 DAG 遷移作業的架構、必要條件和限制,請參閱「關於分散式可用性群組 (DAG) 遷移作業」。如要使用儲存在 Cloud Storage 的備份檔案進行遷移,請參閱「將 SQL Server 資料庫遷移至 SQL Server 適用的 Cloud SQL」。

如要執行分散式可用性群組遷移作業,請完成下列高階工作:

  1. 建立並準備目的地 SQL Server 適用的 Cloud SQL 執行個體。
  2. 準備來源 SQL Server 執行個體和可用性群組。
  3. 建立雙向私人網路連線,並設定連結伺服器。
  4. 建立連線設定檔並執行遷移工作。
  5. 監控及驗證遷移作業。
  6. 升級、容錯回復或完成遷移作業。

費用

如要將相同系統的資料庫遷移至 Cloud SQL,不必支付額外費用即可使用資料庫遷移服務。不過,標準 Cloud SQL 和網路定價仍適用。如要估算用量費用,請使用 Pricing Calculator。

事前準備

  1. 確認來源和目的地資料庫符合分散式可用性群組遷移作業的所有必要條件和限制 (包括執行 Enterprise Edition、將資料檔案儲存在預設資料目錄中,以及不使用 sa 做為資料庫擁有者)。請參閱「關於分散式可用性群組 (DAG) 遷移」。
  2. 選擇遷移作業的 Google Cloud 區域。資料庫遷移服務是完全區域性的產品,與遷移作業相關的所有實體 (來源和目的地連線設定檔、遷移工作,以及目的地 SQL Server 適用的 Cloud SQL 執行個體) 都必須位於相同區域。
  3. 在 Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案。

    前往專案選取器

  4. 啟用資料庫遷移服務、Compute Engine 和 Cloud SQL Admin API。

    啟用 API

必要的角色

請確認Google Cloud 專案已授予下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理存取權」。

建立並準備目的地 SQL Server 適用的 Cloud SQL 執行個體

在這個步驟中,您會建立目的地 SQL Server 適用的 Cloud SQL Enterprise Edition 執行個體,並啟用連結伺服器所需的資料庫旗標。

  1. 建立目的地 SQL Server 適用的 Cloud SQL 執行個體。如需詳細的建立操作說明,請參閱「建立 SQL Server 適用的 Cloud SQL 執行個體」。請確認執行個體符合下列分散式可用性群組遷移作業規定:
    • 選取「Enterprise Edition」 (2017、2019、2022 或 2025 版)。
    • 設定私人網路,以便與您打算連線來源 SQL Server 執行個體和目的地 SQL Server 適用的 Cloud SQL 執行個體的方式保持一致。如果您打算透過虛擬私有雲對接連線至執行個體,請啟用 私人服務存取權;如果您打算使用傳入 Private Service Connect 端點和傳出 Private Service Connect 網路連結連線至執行個體,請使用 Private Service Connect。

      請勿在同一個目的地 SQL Server 適用的 Cloud SQL 執行個體上,同時啟用私人服務存取權和 Private Service Connect。如果兩者皆啟用,SQL Server 適用的 Cloud SQL 不支援連結伺服器。如需完整的網路設定詳細資料,請參閱「建立雙向私人網路連線」。

    • 請保持停用時間點復原 (PITR),且在完成並刪除 DAG 遷移工作前,不要新增唯讀副本。
    • 如果任何來源資料庫是由 Windows Active Directory 登入帳戶擁有,請在遷移前將來源資料庫擁有者變更為 SQL 登入帳戶,或將目的地 SQL Server 適用的 Cloud SQL 執行個體加入 Active Directory,這樣資料庫遷移服務就能在遷移工作啟動時,自動在目的地執行個體上建立對應的 Windows 登入帳戶。如需操作說明,請參閱「設定 SQL Server 適用的 Cloud SQL 適用的 Managed Microsoft AD」。
  2. 在目的地 SQL Server 適用的 Cloud SQL 執行個體上,啟用 cloudsql enable linked servers 資料庫旗標 (設為 on)。如需設定旗標的操作說明,請參閱「管理連結的伺服器」和「設定資料庫旗標」。

    在本指南後續步驟中,您需要在目的地 SQL Server 適用的 Cloud SQL 執行個體上建立及驗證連結伺服器,屆時就會用到這個旗標。

準備來源 SQL Server 執行個體

在這個步驟中,您將在來源 SQL Server 執行個體上啟用 Always On 可用性群組、建立資料庫鏡像端點和憑證、為資料庫遷移服務建立專屬 SQL 登入資訊,以及準備來源可用性群組。

啟用 Always On 可用性群組

確認來源 SQL Server 執行個體已啟用 Always On 可用性群組功能:

建立資料庫鏡像端點和憑證

在 SQL Server 中,分散式可用性群組會透過 TCP DATABASE_MIRRORING (DBM) 端點 (預設通訊埠 5022),在執行個體之間串流資料和交易記錄。由於自行管理的 SQL Server 執行個體和目的地 SQL Server 適用的 Cloud SQL 執行個體是獨立執行個體,因此需要憑證式相互驗證和 AES 加密,才能透過 DBM 端點建立信任關係。

您只需要建立憑證,並將其繫結至來源 SQL Server 執行個體上的 DATABASE_MIRRORING 端點。您不必手動匯出憑證檔案,也不必在目的地 SQL Server 適用的 Cloud SQL 執行個體上建立憑證:

  • 啟動遷移工作時,資料庫遷移服務會自動在目的地 SQL Server 適用的 Cloud SQL 執行個體上,設定 DATABASE_MIRRORING 端點和憑證,並使用連結的伺服器在兩個執行個體之間交換公開金鑰。
  • 完成轉換後,如果您刪除遷移工作,資料庫遷移服務會自動從兩個執行個體中移除匯入的憑證。

如果來源 SQL Server 執行個體尚未具備以憑證驗證的 DATABASE_MIRRORING 端點,請建立一個:

  1. 透過 SQL 用戶端 (例如 sqlcmd 公用程式) 連線至來源執行個體。
  2. 執行下列 T-SQL 指令,建立資料庫主要金鑰、憑證和 DATABASE_MIRRORING 端點,監聽您選擇的 DBM 通訊埠 (預設為 5022):
    USE [master];
    GO
    
    IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
    BEGIN
        CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MASTER_KEY_PASSWORD';
    END
    GO
    
    CREATE CERTIFICATE [SOURCE_CERT_NAME]
        WITH SUBJECT = 'AlwaysOn AG Certificate',
        EXPIRY_DATE = 'CERT_EXPIRY_DATE';
    GO
    
    CREATE ENDPOINT [HADR_ENDPOINT_NAME]
        STATE = STARTED
        AS TCP (LISTENER_PORT = SOURCE_DBM_PORT_NUMBER)
        FOR DATABASE_MIRRORING (
            ROLE = ALL,
            AUTHENTICATION = CERTIFICATE [SOURCE_CERT_NAME],
            ENCRYPTION = REQUIRED ALGORITHM AES
        );
    GO

    更改下列內容:

    • MASTER_KEY_PASSWORD,並使用密碼加密資料庫主金鑰。
    • SOURCE_CERT_NAME:來源資料庫鏡像憑證的名稱 (例如 dbmCertificate)。
    • CERT_EXPIRY_DATE:憑證的到期日,格式為 YYYYMMDD。
    • HADR_ENDPOINT_NAME 替換為資料庫鏡像端點的名稱。
    • SOURCE_DBM_PORT_NUMBER 替換為資料庫鏡像流量的 TCP 通訊埠編號 (預設為 5022)。

建立專屬資料庫遷移服務登入資訊和權限

資料庫遷移服務會使用您在來源連線設定檔中提供的專用 SQL 登入資訊,透過連結的伺服器連線至來源 SQL Server 執行個體。如要設定這項登入功能,您可以授予 sysadmin 伺服器角色,或使用 gcp_dms_db 輔助資料庫設定最小權限:

授予 sysadmin 角色

如果安全性政策允許將 sysadmin 伺服器角色授予遷移登入,請執行下列 T-SQL 指令:

USE [master];
GO
CREATE LOGIN [SOURCE_USERNAME] WITH PASSWORD = 'SOURCE_PASSWORD';
CREATE USER [SOURCE_USER] FOR LOGIN [SOURCE_USERNAME];
ALTER SERVER ROLE [sysadmin] ADD MEMBER [SOURCE_USERNAME];
GRANT CONNECT ON ENDPOINT::[HADR_ENDPOINT_NAME] TO [SOURCE_USERNAME];
GO

更改下列內容:

  • SOURCE_USERNAME 替換為資料庫遷移服務用來連線至來源執行個體的 SQL 登入名稱 (例如 cloud_dms_login)。
  • SOURCE_PASSWORD,並使用 SOURCE_USERNAME 登入密碼。
  • SOURCE_USER:對應至 SOURCE_USERNAME 的資料庫使用者名稱 (例如 cloud_dms_user)。
  • 將 HADR_ENDPOINT_NAME 替換為資料庫鏡像端點的名稱 (例如 Hadr_endpoint)。

最小權限 (gcp_dms_db)

如果安全性政策禁止將 sysadmin 授予遷移登入資訊,請建立專屬的 gcp_dms_db 輔助資料庫 (由 sa 擁有,並具備 TRUSTWORTHY ON),建立三個資料庫遷移服務包裝函式預存程序,並將精細權限授予遷移登入資訊:

USE [master];
GO

CREATE DATABASE [gcp_dms_db];
GO

ALTER AUTHORIZATION ON DATABASE::[gcp_dms_db] TO [sa];
ALTER DATABASE [gcp_dms_db] SET TRUSTWORTHY ON;
GO

USE [gcp_dms_db];
GO

CREATE OR ALTER PROCEDURE dbo.gcp_dms_set_dag_commit_mode
    @dag_name NVARCHAR(128),
    @source_ag NVARCHAR(128),
    @dest_ag NVARCHAR(128),
    @commit_mode NVARCHAR(30)
WITH EXECUTE AS 'dbo'
AS
BEGIN
    SET NOCOUNT ON;
    IF @commit_mode NOT IN ('SYNCHRONOUS_COMMIT', 'ASYNCHRONOUS_COMMIT')
    BEGIN
        RAISERROR('Invalid commit mode. Must be SYNCHRONOUS_COMMIT or ASYNCHRONOUS_COMMIT.', 16, 1);
        RETURN;
    END
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = N'USE master; ALTER AVAILABILITY GROUP ' + QUOTENAME(@dag_name) +
               N' MODIFY AVAILABILITY GROUP ON ' +
               QUOTENAME(@source_ag, '''') + N' WITH (AVAILABILITY_MODE = ' + @commit_mode + N'), ' +
               QUOTENAME(@dest_ag, '''') + N' WITH (AVAILABILITY_MODE = ' + @commit_mode + N');';
    EXECUTE sp_executesql @sql;
END;
GO

CREATE OR ALTER PROCEDURE dbo.gcp_dms_set_dag_secondary
    @dag_name NVARCHAR(128)
WITH EXECUTE AS 'dbo'
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = N'USE master; ALTER AVAILABILITY GROUP ' + QUOTENAME(@dag_name) + N' SET (ROLE = SECONDARY);';
    EXECUTE sp_executesql @sql;
END;
GO

CREATE OR ALTER PROCEDURE dbo.gcp_dms_failover_dag
    @dag_name NVARCHAR(128)
WITH EXECUTE AS 'dbo'
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = N'USE master; ALTER AVAILABILITY GROUP ' + QUOTENAME(@dag_name) + N' FORCE_FAILOVER_ALLOW_DATA_LOSS;';
    EXECUTE sp_executesql @sql;
END;
GO

USE [master];
GO

CREATE LOGIN [SOURCE_USERNAME] WITH PASSWORD = 'SOURCE_PASSWORD';
CREATE USER [SOURCE_USER] FOR LOGIN [SOURCE_USERNAME];
GRANT VIEW SERVER STATE TO [SOURCE_USERNAME];
-- Note: Run GRANT VIEW SERVER PERFORMANCE STATE on SQL Server 2022 and later:
GRANT VIEW SERVER PERFORMANCE STATE TO [SOURCE_USERNAME];
GRANT VIEW ANY DEFINITION TO [SOURCE_USERNAME];
GRANT ALTER ANY AVAILABILITY GROUP TO [SOURCE_USERNAME];
GRANT CONNECT ON ENDPOINT::[HADR_ENDPOINT_NAME] TO [SOURCE_USERNAME];
GRANT CREATE CERTIFICATE TO [SOURCE_USER];
GO

USE [gcp_dms_db];
GO

CREATE USER [SOURCE_USER] FOR LOGIN [SOURCE_USERNAME];
GRANT EXECUTE ON dbo.gcp_dms_set_dag_commit_mode TO [SOURCE_USER];
GRANT EXECUTE ON dbo.gcp_dms_set_dag_secondary TO [SOURCE_USER];
GRANT EXECUTE ON dbo.gcp_dms_failover_dag TO [SOURCE_USER];
GO

-- Repeat the following block for EACH user database in your source Availability Group:
USE [DATABASE_NAME];
GO

CREATE USER [SOURCE_USER] FOR LOGIN [SOURCE_USERNAME];
ALTER ROLE [db_backupoperator] ADD MEMBER [SOURCE_USER];
GO

更改下列內容:

  • SOURCE_USERNAME 替換為資料庫遷移服務用來連線至來源執行個體的 SQL 登入名稱 (例如 cloud_dms_login)。
  • SOURCE_PASSWORD,並使用 SOURCE_USERNAME 登入密碼。
  • SOURCE_USER:對應至 SOURCE_USERNAME 的資料庫使用者名稱 (例如 cloud_dms_user)。
  • 將 HADR_ENDPOINT_NAME 替換為資料庫鏡像端點的名稱 (例如 Hadr_endpoint)。
  • DATABASE_NAME 替換成可用性群組中各來源資料庫的名稱。資料庫遷移服務預檢驗證時,必須在每個遷移的資料庫上授予 db_backupoperator,並在升級期間使用 CHECKPOINT 清除交易記錄。

準備來源資料庫和可用性群組

您可以從現有的 Always On 可用性群組遷移資料庫,也可以建立新的獨立可用性群組 (CLUSTER_TYPE = NONE)。繼續操作前,請確認符合下列需求條件:

  • 可用性群組中的每個資料庫都使用 FULL 復原模式,不屬於 sa,並將資料檔案 (.mdf 和 .ndf) 儲存在預設資料目錄中。
  • 如果重複使用現有的可用性群組,請確認資料庫鏡像端點已在通訊埠 5022 (或所選 DBM 通訊埠) 設定,且副本已啟用 SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL),這樣在升級作業翻轉 DAG 角色後,次要資料庫仍可透過標準連線字串讀取,且遷移登入資訊具有 CONNECT ON ENDPOINT。如果來源可用性群組有多個副本,且已設定可用性群組接聽程式,請在設定連結伺服器和來源連線設定檔時,使用接聽程式 IP 位址做為 <var>SOURCE_HOST_IP_ADDRESS</var>,這樣一來,如果來源可用性群組發生容錯移轉,遷移作業就能繼續進行。

如要準備資料庫並建立新的獨立可用性群組 (CLUSTER_TYPE = NONE),請執行下列 T-SQL 指令:

USE [master];
GO

ALTER DATABASE [DATABASE_NAME] SET RECOVERY FULL;
GO

-- If the database is owned by 'sa', change the owner to another login:
ALTER AUTHORIZATION ON DATABASE::[DATABASE_NAME] TO [DB_OWNER_LOGIN];
GO

-- Initialize the local SQL Server transaction log chain for the Availability Group:
BACKUP DATABASE [DATABASE_NAME] TO DISK = 'NUL';
GO

CREATE AVAILABILITY GROUP [SOURCE_AVAILABILITY_GROUP_NAME] WITH (CLUSTER_TYPE = NONE)
    FOR REPLICA ON N'SOURCE_SERVER_NAME' WITH (
        ENDPOINT_URL = N'TCP://localhost:SOURCE_DBM_PORT_NUMBER',
        FAILOVER_MODE = MANUAL,
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        SEEDING_MODE = MANUAL,
        PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE),
        SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
    );
GO

ALTER AVAILABILITY GROUP [SOURCE_AVAILABILITY_GROUP_NAME] ADD DATABASE [DATABASE_NAME];
GO

更改下列內容:

  • DATABASE_NAME:要加入可用性群組的資料庫名稱。
  • DB_OWNER_LOGIN,並使用非 sa 登入帳戶來擁有資料庫。
  • SOURCE_AVAILABILITY_GROUP_NAME 替換為來源可用性群組的名稱 (例如 source_ag)。
  • SOURCE_SERVER_NAME:來源 SQL Server 執行個體的伺服器名稱 (與 SELECT @@SERVERNAME 傳回的值相符)。
  • SOURCE_DBM_PORT_NUMBER 替換為資料庫鏡像端點的 TCP 通訊埠編號 (預設為 5022)。

建立雙向私人網路連線

如果是 DAG 遷移,資料庫遷移服務會透過內部 Google Cloud API 與目的地 SQL Server 適用的 Cloud SQL 執行個體通訊,透過目的地 SQL Server 適用的 Cloud SQL 執行個體上的連結伺服器,在來源 SQL Server 執行個體上執行自動化調度管理查詢,並透過私人網路直接在兩個執行個體之間串流資料。這項遷移作業需要您透過虛擬私有雲網路,在來源 SQL Server 主機和目的地 SQL Server 適用的 Cloud SQL 執行個體之間,直接建立雙向私人 IP 連線。不支援來源和目的地執行個體之間的公開 IP 連線。

必要通訊埠和 IP 位址

網路設定必須允許來源 SQL Server 執行個體和目的地 SQL Server 適用的 Cloud SQL 執行個體之間,透過下列兩個 TCP 通訊埠傳輸流量:

通訊埠 方向 目的
SQL Server 資料庫通訊埠 (預設為 1433) 從目的地 SQL Server 適用的 Cloud SQL 執行個體到來源 SQL Server 執行個體 目的地 SQL Server 適用的 Cloud SQL 執行個體上的連結伺服器會使用這個帳戶,在來源執行個體上執行預檢驗證、憑證交換和 DAG 自動化調度管理查詢。
資料庫鏡像 (DBM) 通訊埠 (預設為 5022) 來源 SQL Server 執行個體和目的地 SQL Server 適用的 Cloud SQL 執行個體之間雙向 來源和目的地可用性群組會使用這個端點,在FULL_DUMP期間串流初始完整載入作業、在CDC期間串流持續進行的資料庫變更,以及在FAILBACK期間串流反向複製作業。

稍後在本指南中設定連結伺服器和連線設定檔時,您需要提供兩個私人 IP 位址:

  • SOURCE_HOST_IP_ADDRESS (用於連結的伺服器 @datasrc 參數和來源連線設定檔 --host 旗標) 是來源 SQL Server 主機的私人 IP 位址 (或可用性群組監聽器 IP 位址,如果已為多副本來源可用性群組設定,則建議使用,以便在來源可用性群組發生容錯移轉時,繼續執行遷移作業),可從目的地 SQL Server 適用的 Cloud SQL 執行個體連線。
  • DESTINATION_HOST_IP_ADDRESS (用於目的地連線設定檔 --host 旗標) 是目的地 SQL Server 適用的 Cloud SQL 執行個體的私人 IP 位址 (或其 Private Service Connect 端點 IP 位址),可從來源 SQL Server 主機連線。

設定私人網路方法

針對目的地 SQL Server 適用的 Cloud SQL 執行個體,完成已啟用網路方法的網路轉送設定 (私人服務存取權或 Private Service Connect):

私人服務存取

私人服務存取權會將您的虛擬私有雲網路,與 Google 代管的服務生產者虛擬私有雲網路對接,後者託管了目的地 SQL Server 適用的 Cloud SQL 執行個體:

  1. 確認虛擬私有雲網路已分配內部 IPv4 位址範圍,且目的地 SQL Server 適用的 Cloud SQL 執行個體已啟用私人連線 (虛擬私有雲對等互連至 servicenetworking-googleapis-com)。如需操作說明,請參閱「設定 SQL Server 適用的 Cloud SQL 私人 IP」。
  2. 根據來源 SQL Server 主機的託管位置,設定轉送至該主機:
    • 如果來源執行個體在同一個虛擬私有雲網路中的 Compute Engine 虛擬機器上執行,則不需要額外轉送。虛擬機器和 SQL Server 適用的 Cloud SQL 執行個體,可直接透過虛擬私有雲對接連線,連至彼此的私人 IP 位址。
    • 如果來源執行個體在地端部署、其他雲端服務供應商或其他虛擬私有雲網路中運作,請完成下列步驟,以便透過轉送對接邊界交換路由:
      1. 使用 Cloud VPN 或 Cloud Interconnect,將外部網路連線至虛擬私有雲網路。如需操作說明,請參閱「從外部來源存取 Cloud SQL 執行個體」。
      2. 在 Cloud Router 中,將 SQL Server 適用的 Cloud SQL 分配 IP 位址範圍 advertise 至來源網路。如需操作說明,請參閱「advertise 自訂 IP 範圍」。
      3. 更新虛擬私有雲網路中的 servicenetworking-googleapis-com 對接連線,啟用「Export custom routes」(匯出自訂路徑),讓 SQL Server 適用的 Cloud SQL 執行個體瞭解來源網路的路徑。如需操作說明,請參閱「更新對接連線」。
  3. 記下遷移作業的私人 IP 位址:
    • 使用來源 SQL Server 主機的內部 IP 位址做為 SOURCE_HOST_IP_ADDRESS。
    • 使用指派給目的地 SQL Server 適用的 Cloud SQL 執行個體的私人 IP 位址 (顯示在執行個體的「Overview」(總覽) 頁面) 做為 DESTINATION_HOST_IP_ADDRESS。

Private Service Connect

如果您使用 Private Service Connect,而非私人服務存取權,則必須設定傳入 Private Service Connect 端點 (讓來源執行個體能透過通訊埠 5022 連線至 SQL Server 適用的 Cloud SQL),以及傳出 Private Service Connect 介面 (讓 SQL Server 適用的 Cloud SQL 能透過通訊埠 1433 和 5022,對來源執行個體啟動連結伺服器和 DAG 連線):

  1. 確認目的地 SQL Server 適用的 Cloud SQL 執行個體已啟用 Private Service Connect (不含私人 IP),並指定允許的用戶專案。如需操作說明,請參閱「設定 Private Service Connect」。
  2. 如要允許從來源 SQL Server 主機連入目的地 SQL Server 適用的 Cloud SQL 執行個體,請在虛擬私有雲子網路中預留內部 IP 位址,並建立 Private Service Connect 端點 (轉送規則),指定 SQL Server 適用的 Cloud SQL 執行個體服務連結。如需操作說明,請參閱「建立 Private Service Connect 端點」。
  3. 如要允許從目的地 SQL Server 適用的 Cloud SQL 執行個體,傳送連出連線至來源 SQL Server 主機 (連結伺服器和連出 DAG 連線必須設定),請在可轉送至來源主機的子網路中,建立虛擬私有雲網路連結,並在目的地 SQL Server 適用的 Cloud SQL 執行個體,設定 Private Service Connect 連出連線。如需操作說明,請參閱「建立及管理網路連結」和「設定 Private Service Connect 傳出連線」。
  4. 記錄遷移作業的私人 IP 位址:
    • 使用來源 SQL Server 主機的私人 IP 位址做為 SOURCE_HOST_IP_ADDRESS。
    • 使用虛擬私有雲網路中 Private Service Connect 端點 (轉送規則) 的內部 IP 位址做為 DESTINATION_HOST_IP_ADDRESS。

設定虛擬私有雲和來源主機防火牆規則

  1. 在虛擬私有雲網路中,建立輸入和輸出防火牆規則,允許來源 SQL Server IP 位址 (SOURCE_HOST_IP_ADDRESS) 和目的地 SQL Server 適用的 Cloud SQL IP 範圍 (或 Private Service Connect 端點和網路連結子網路) 之間的 TCP 流量,在資料庫通訊埠 (預設為 1433) 和資料庫鏡像通訊埠 (預設為 5022) 之間傳輸。如要進一步瞭解如何建立防火牆規則,請參閱「建立防火牆規則」。
  2. 在來源 SQL Server 機器上,確認下列網路和主機防火牆設定:
    • 在 SQL Server 組態管理員 (或 Linux 上的 mssql-conf) 中啟用 TCP/IP,且執行個體會監聽靜態 TCP 通訊埠 (預設為 1433)。
    • 作業系統防火牆 (例如 Windows Defender 防火牆或 Linux iptables 或 firewalld) 允許資料庫通訊埠 (預設為 1433) 和資料庫鏡像通訊埠 (預設為 5022) 上的傳入 TCP 連線,以及透過通訊埠 5022 傳出至 DESTINATION_HOST_IP_ADDRESS 的 TCP 連線。

透過 Cloud SQL Connectivity Tests 驗證可連性

設定連結伺服器前,建議您在 Google Cloud 控制台,前往 SQL Server 適用的 Cloud SQL 執行個體的「連線」>「連線能力測試」分頁,執行三項連線能力測試。如需執行連線能力測試的操作說明,請參閱「管理連線能力測試」:

  1. 如要測試通訊埠 1433 上的連結伺服器外連連線,請將「Source」(來源) 設為「Current Cloud SQL instance」(目前的 Cloud SQL 執行個體),「Destination」(目的地) 設為 SOURCE_HOST_IP_ADDRESS,「Destination port」(目的地通訊埠) 設為 1433 (或自訂資料庫通訊埠)。
  2. 如要測試通訊埠 5022 的傳出資料庫鏡像連線,請將「Source」(來源) 設為「Current Cloud SQL instance」(目前的 Cloud SQL 執行個體)、「Destination」(目的地) 設為 SOURCE_HOST_IP_ADDRESS,並將「Destination port」(目的地通訊埠) 設為 5022 (或自訂 DBM 通訊埠)。
  3. 如要測試通訊埠 5022 的傳入資料庫鏡像連線能力,請將「Source」(來源) 設為 SOURCE_HOST_IP_ADDRESS,「Destination」(目的地) 設為「Current Cloud SQL instance」(目前的 Cloud SQL 執行個體) (如果使用 Private Service Connect,則為 DESTINATION_HOST_IP_ADDRESS),並將「Destination port」(目的地通訊埠) 設為 5022 (或自訂 DBM 通訊埠)。

在目的地 SQL Server 適用的 Cloud SQL 執行個體上,建立並驗證連結伺服器

網路連線設定完成後,請連線至目的地 Cloud SQL for SQL Server 執行個體,並建立指向來源 SQL Server 執行個體的連結伺服器:

  1. 透過 SQL 用戶端連線至 Cloud SQL 執行個體。您可以使用下列方法:
    • sqlcmd 用戶端。 您可以使用這個方法連線至執行個體私人 IP,但可能需要建立 Compute Engine 虛擬機器。
    • gcloud sql connect 指令。這項指令僅適用於已啟用公開 IP 位址的 Cloud SQL 執行個體。
  2. 以 sqlserver 使用者身分登入,並針對目的地 SQL Server 適用的 Cloud SQL 版本執行下列 T-SQL 指令,建立指向來源 SQL Server 執行個體的連結伺服器、將 @locallogin = N'sqlserver' 對應至來源遷移登入資訊、啟用 rpc out,以及使用 OPENQUERY 測試連線 (如要進一步瞭解 Cloud SQL 的連結伺服器選項,請參閱「管理連結伺服器」):

    SQL Server 2017、2019 和 2022 適用的 Cloud SQL

    USE [master];
    GO
    
    EXEC master.dbo.sp_addlinkedserver
        @server = N'LINKED_SERVER_NAME',
        @srvproduct = N'',
        @provider = N'SQLNCLI',
        @datasrc = N'SOURCE_HOST_IP_ADDRESS,SOURCE_PORT_NUMBER';
    GO
    
    EXEC master.dbo.sp_addlinkedsrvlogin
        @rmtsrvname = N'LINKED_SERVER_NAME',
        @useself = N'False',
        @locallogin = N'sqlserver',
        @rmtuser = N'SOURCE_USERNAME',
        @rmtpassword = N'SOURCE_PASSWORD';
    GO
    
    EXEC master.dbo.sp_serveroption
        @server = N'LINKED_SERVER_NAME',
        @optname = N'rpc out',
        @optvalue = N'TRUE';
    GO
    
    SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT @@VERSION AS SourceServerVersion');
    GO

    SQL Server 適用的 Cloud SQL 2025

    USE [master];
    GO
    
    EXEC master.dbo.sp_addlinkedserver
        @server = N'LINKED_SERVER_NAME',
        @srvproduct = N'',
        @provider = N'MSOLEDBSQL19',
        @datasrc = N'SOURCE_HOST_IP_ADDRESS,SOURCE_PORT_NUMBER',
        @provstr = N'Encrypt=Optional;TrustServerCertificate=Yes;Authentication=SqlPassword;UID=Placeholder;';
    GO
    
    EXEC master.dbo.sp_addlinkedsrvlogin
        @rmtsrvname = N'LINKED_SERVER_NAME',
        @useself = N'False',
        @locallogin = N'sqlserver',
        @rmtuser = N'SOURCE_USERNAME',
        @rmtpassword = N'SOURCE_PASSWORD';
    GO
    
    EXEC master.dbo.sp_serveroption
        @server = N'LINKED_SERVER_NAME',
        @optname = N'rpc out',
        @optvalue = N'TRUE';
    GO
    
    SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT @@VERSION AS SourceServerVersion');
    GO

    更改下列內容:

    • LINKED_SERVER_NAME:SQL Server 適用的 Cloud SQL 連結伺服器名稱,例如 source_sql_linked_server。
    • SOURCE_HOST_IP_ADDRESS:來源 SQL Server 執行個體的私人 IP 位址 (如果已為多副本來源可用性群組設定可用性群組監聽器 IP 位址,則為該位址)。
    • SOURCE_PORT_NUMBER:來源 SQL Server 資料庫引擎接受連線的通訊埠編號 (預設為 1433)。
    • SOURCE_USERNAME:您在來源執行個體中建立的專用 SQL 登入名稱,請參閱「建立專用資料庫遷移服務登入資訊和權限」。
    • SOURCE_PASSWORD,並使用 SOURCE_USERNAME 登入密碼。

建立連線設定檔並執行遷移工作

使用 Google Cloud CLI 建立來源和目的地連線設定檔、建立連續 DAG 遷移工作、驗證遷移設定,以及啟動遷移工作:

  1. 建立來源連線設定檔。
    執行 gcloud database-migration connection-profiles create sqlserver 指令 (點選即可展開):

    gcloud database-migration connection-profiles create sqlserver

    這個範例使用選用的 --no-async 旗標,因此所有作業都會同步執行。這表示某些指令可能需要一段時間才能完成。您可以略過 --no-async 旗標,以非同步方式執行指令。如果使用,則需要使用 gcloud database-migration operations describe 指令,確認作業是否成功。

    gcloud database-migration connection-profiles create sqlserver SOURCE_CONNECTION_PROFILE_ID \
        --no-async \
        --display-name=SOURCE_CONNECTION_PROFILE_NAME \
        --region=REGION \
        --role=SOURCE \
        --host=SOURCE_HOST_IP_ADDRESS \
        --port=SOURCE_PORT_NUMBER \
        --dbm-port=SOURCE_DBM_PORT_NUMBER \
        --username=SOURCE_USERNAME \
        --password=SOURCE_PASSWORD

    更改下列內容:

    • SOURCE_CONNECTION_PROFILE_ID,並為來源連線設定檔提供機器可讀的 ID (例如 sqlserver-dag-source-profile)。
    • SOURCE_CONNECTION_PROFILE_NAME 替換為來源連線設定檔的人類可讀名稱。這個值會顯示在 Google Cloud 控制台的資料庫遷移服務中。
    • REGION:要儲存連線設定檔的區域 ID (例如 us-central1)。
    • SOURCE_HOST_IP_ADDRESS:來源 SQL Server 執行個體的私人 IP 位址 (如果已為多副本來源可用性群組設定可用性群組監聽器 IP 位址,則為該位址)。
    • SOURCE_PORT_NUMBER:來源 SQL Server 資料庫引擎接受連線的通訊埠編號 (預設為 1433)。
    • SOURCE_DBM_PORT_NUMBER 替換為來源資料庫鏡像端點的 TCP 通訊埠編號 (預設為 5022)。
    • SOURCE_USERNAME:您在來源執行個體中建立的專用 SQL 登入名稱,請參閱「建立專用資料庫遷移服務登入資訊和權限」。
    • SOURCE_PASSWORD,並使用 SOURCE_USERNAME 登入密碼。
  2. 建立目的地連線設定檔。
    執行 gcloud database-migration connection-profiles create sqlserver 指令 (點選即可展開):

    gcloud database-migration connection-profiles create sqlserver

    這個範例使用選用的 --no-async 旗標,因此所有作業都會同步執行。這表示某些指令可能需要一段時間才能完成。您可以略過 --no-async 旗標,以非同步方式執行指令。如果使用,則需要使用 gcloud database-migration operations describe 指令,確認作業是否成功。

    gcloud database-migration connection-profiles create sqlserver DESTINATION_CONNECTION_PROFILE_ID \
        --no-async \
        --display-name=DESTINATION_CONNECTION_PROFILE_NAME \
        --region=REGION \
        --role=DESTINATION \
        --cloudsql-instance=CLOUDSQL_INSTANCE_ID \
        --host=DESTINATION_HOST_IP_ADDRESS \
        --port=DESTINATION_PORT_NUMBER \
        --dbm-port=DESTINATION_DBM_PORT_NUMBER \
        --username=sqlserver \
        --password=CLOUD_SQL_DB_USER_PASSWORD

    更改下列內容:

    • DESTINATION_CONNECTION_PROFILE_ID 替換為目的地連線設定檔的機器可讀 ID (例如 sqlserver-dag-dest-profile)。
    • DESTINATION_CONNECTION_PROFILE_NAME 替換成目的地連線設定檔的人類可讀名稱。這個值會顯示在 Google Cloud 控制台的資料庫遷移服務中。
    • 將 REGION 替換為要儲存連線設定檔的區域 ID。
    • CLOUDSQL_INSTANCE_ID:目的地 SQL Server 適用的 Cloud SQL 執行個體名稱。
    • DESTINATION_HOST_IP_ADDRESS:目的地 SQL Server 適用的 Cloud SQL 執行個體的私人 IP 位址 (或其 Private Service Connect 端點 IP 位址),可從來源 SQL Server 執行個體連線。
    • DESTINATION_PORT_NUMBER 替換為目的地 SQL Server 適用的 Cloud SQL 執行個體的資料庫通訊埠編號 (1433)。
    • DESTINATION_DBM_PORT_NUMBER 替換為目的地 SQL Server 適用的 Cloud SQL 執行個體的資料庫鏡像通訊埠編號 (5022)。
    • CLOUD_SQL_DB_USER_PASSWORD:目的地 SQL Server 適用的 Cloud SQL 執行個體上 sqlserver 使用者的密碼 (--username 必須設為 sqlserver)。
  3. 建立連續 DAG 遷移工作。
    執行 gcloud database-migration migration-jobs create 指令 (點選即可展開):

    gcloud database-migration migration-jobs create

    這個範例使用選用的 --no-async 旗標,因此所有作業都會同步執行。這表示某些指令可能需要一段時間才能完成。您可以略過 --no-async 旗標,以非同步方式執行指令。如果使用,則需要使用 gcloud database-migration operations describe 指令,確認作業是否成功。

    gcloud database-migration migration-jobs create MIGRATION_JOB_ID \
        --no-async \
        --display-name=MIGRATION_JOB_NAME \
        --region=REGION \
        --type=CONTINUOUS \
        --source=SOURCE_CONNECTION_PROFILE_ID \
        --destination=DESTINATION_CONNECTION_PROFILE_ID \
        --sqlserver-dag-source-ag=SOURCE_AVAILABILITY_GROUP_NAME \
        --sqlserver-dag-linked-server=LINKED_SERVER_NAME

    更改下列內容:

    • MIGRATION_JOB_ID:遷移工作的機器可讀 ID,例如 sqlserver-dag-job。
    • MIGRATION_JOB_NAME:遷移工作的人類可讀名稱。這個值會顯示在 Google Cloud 控制台中。
    • REGION:要建立遷移工作的區域 ID。
    • 將 SOURCE_CONNECTION_PROFILE_ID 替換為來源連線設定檔的 ID。
    • 將 DESTINATION_CONNECTION_PROFILE_ID 替換為目的地連線設定檔的 ID。
    • SOURCE_AVAILABILITY_GROUP_NAME 替換為來源 SQL Server 執行個體上的可用性群組名稱。
    • LINKED_SERVER_NAME:您在目的地 SQL Server 適用的 Cloud SQL 執行個體上設定的連結伺服器名稱,請參閱「在目的地 SQL Server 適用的 Cloud SQL 執行個體上建立及驗證連結伺服器」。
  4. 驗證遷移工作設定。
    開始 DAG 遷移工作前,請務必執行 verify,驗證雙向網路連線、連結伺服器 RPC 存取權、gcp_dms_db 權限 (如果使用最小權限)、來源資料庫擁有者 (確認沒有資料庫由 sa 擁有),以及預設資料檔案路徑。執行 gcloud database-migration migration-jobs verify 指令 (點選即可展開):

    gcloud database-migration migration-jobs verify

    gcloud database-migration migration-jobs verify MIGRATION_JOB_ID \
        --region=REGION

    更改下列內容:

    • 將 MIGRATION_JOB_ID 替換為遷移工作的 ID。
    • REGION:儲存遷移工作的區域 ID。

    您可以執行 gcloud database-migration operations describe 指令,查看驗證作業的狀態。

  5. 啟動遷移工作。
    驗證成功後,請執行 gcloud database-migration migration-jobs start 指令 (點選即可展開):

    gcloud database-migration migration-jobs start

    gcloud database-migration migration-jobs start MIGRATION_JOB_ID \
        --region=REGION

    更改下列內容:

    • 將 MIGRATION_JOB_ID 替換為遷移工作的 ID。
    • REGION:儲存遷移工作的區域 ID。

監控及驗證遷移作業

DAG 遷移工作執行期間,您可以在 Google Cloud 控制台監控進度、在CDC期間以唯讀模式查詢目的地資料庫,以及管理進行中的複製作業。

在 Google Cloud 控制台中監控進度

您可以在 Google Cloud 控制台的「Migration job details」(遷移工作詳細資料) 頁面中,監控執行中的 DAG 遷移工作,就像其他資料庫遷移服務遷移工作一樣:

  • 在遷移工作詳細資料頁面的「資料庫」表格中,查看可用性群組中各資料庫的即時階段 (初始完整載入期間為 Full dump,持續複製期間為 CDC,以及任何資料庫層級錯誤訊息) 和「還原延遲時間」。
  • 在「Monitoring」(監控) 分頁中,查看「Restore lag」(還原延遲) (datamigration.googleapis.com/migration_job/max_replica_sec_lag,以秒為單位回報每個資料庫的分散式可用性群組複製延遲時間) 圖表。

如要進一步瞭解監控指標和工作狀態,請參閱「遷移工作指標」和「遷移工作狀態碼」。

在 CDC 期間,以唯讀模式驗證已遷移的資料庫

與備份式遷移作業不同 (目的地資料庫在升級前會維持在 RESTORING 狀態),分散式可用性群組遷移作業可讓您在目的地 SQL Server 適用的 Cloud SQL 資料庫進入 CDC 階段後,立即以唯讀模式查詢。

對於來源執行個體上 SQL 登入資訊擁有的每個資料庫,資料庫遷移服務會自動在目的地 SQL Server 適用的 Cloud SQL 執行個體上建立登入資訊,其前置字串為 gcp_dms_、6 個字元的 ID 和來源擁有者名稱 (例如 gcp_dms_a1b2c3_myowner)。如要在升級前使用該登入資訊查詢資料庫,請以 sqlserver 身分連線至目的地 SQL Server 適用的 Cloud SQL 執行個體,在 sys.server_principals 中找到產生的登入名稱,然後重設密碼:

SELECT name FROM sys.server_principals WHERE name LIKE 'gcp_dms_%';
GO
ALTER LOGIN [GENERATED_DMS_OWNER_LOGIN] WITH PASSWORD = 'NEW_OWNER_PASSWORD';
GO

更改下列內容:

  • GENERATED_DMS_OWNER_LOGIN 替換為查詢傳回的資料庫擁有者登入名稱。
  • NEW_OWNER_PASSWORD,並使用新密碼登入。

如要進一步瞭解如何驗證遷移的物件和資料,請參閱「驗證遷移作業」。

管理進行中的 DAG 遷移工作 (選用)

遷移工作在 CDC 階段執行時,您可以執行下列管理作業:

  • 執行 ALTER AVAILABILITY GROUP ... ADD DATABASE 或 ALTER AVAILABILITY GROUP ... REMOVE DATABASE,在來源 SQL Server 執行個體的來源可用性群組中新增或移除資料庫。資料庫遷移服務會在下一個輪詢週期自動偵測變更,並更新目的地 SQL Server 適用的 Cloud SQL 執行個體。
  • 執行 gcloud database-migration migration-jobs stop,暫時停止資料複製作業。停止 DAG 遷移工作時,應只在定義的短時間內進行,因為在複製作業停止期間,更新會繼續累積在交易記錄中,可能導致交易記錄磁碟填滿。在停止狀態下,您可以執行 gcloud database-migration migration-jobs resume 繼續複製資料,或執行 gcloud database-migration migration-jobs delete 完成遷移並執行必要的清理作業。
  • 執行 gcloud database-migration migration-jobs restart,重新啟動失敗的遷移工作。重新啟動 DAG 遷移工作,會刪除目的地 SQL Server 適用的 Cloud SQL 執行個體中已遷移的資料庫、重新建立分散式可用性群組,並透過網路重新執行初始完整載入作業。

升級、容錯回復或完成遷移

準備好將應用程式切換至 SQL Server 適用的 Cloud SQL 時,請升級遷移工作。在 DAG 遷移作業中,升級工作會將 SQL Server 適用的 Cloud SQL 切換為讀寫主要執行個體,並將遷移工作轉換為 FAILBACK 階段 (在 Google Cloud CLI 和 API 回應中為 PHASE_FAILBACK),同時啟用反向複製功能,將資料複製回來源 SQL Server 執行個體:

  1. 停止應用程式寫入來源 SQL Server 資料庫,並在 Google Cloud 控制台中查看「Restore lag」(還原延遲時間) 指標,確認複製延遲時間已降至零。
  2. 升級遷移工作,切換至 Cloud SQL。
    執行 gcloud database-migration migration-jobs promote 指令 (點選即可展開):

    gcloud database-migration migration-jobs promote

    gcloud database-migration migration-jobs promote MIGRATION_JOB_ID \
        --region=REGION

    更改下列內容:

    • 將 MIGRATION_JOB_ID 替換為遷移工作的 ID。
    • REGION:儲存遷移工作的區域 ID。

    在升級期間,資料庫遷移服務會執行下列動作:

    • 將分散式可用性群組設為同步提交、在所有來源資料庫上發出 CHECKPOINT、等待所有交易同步處理,確保資料不會遺失,並反轉可用性群組角色,讓目的地 SQL Server 適用的 Cloud SQL 執行個體成為可讀寫的主要執行個體,原始來源 SQL Server 執行個體則成為次要執行個體。
    • 將遷移工作保持在 Running 狀態,並將子狀態轉換為 FAILBACK 階段 (Google Cloud CLI 和 API 回應中的 PHASE_FAILBACK),持續將目的地 SQL Server 適用的 Cloud SQL 中的新寫入內容,複製回來源 SQL Server 執行個體。

    升級完成後,請將應用程式連線至新的 SQL Server 適用的 Cloud SQL 執行個體。

  3. (選用) 容錯回復至來源 SQL Server 執行個體。
    如果將應用程式切換至 SQL Server 適用的 Cloud SQL 後,在遷移工作的FAILBACK階段遇到問題,可以停止在 SQL Server 適用的 Cloud SQL 寫入應用程式,並執行 gcloud database-migration migration-jobs promote 指令搭配 --failback 旗標,還原轉換作業,且不會遺失任何資料 (點選展開):

    gcloud database-migration migration-jobs promote --failback

    gcloud database-migration migration-jobs promote MIGRATION_JOB_ID \
        --region=REGION \
        --failback

    更改下列內容:

    • 將 MIGRATION_JOB_ID 替換為遷移工作的 ID。
    • REGION:儲存遷移工作的區域 ID。

    在 FAILBACK 階段執行 promote 並加上 --failback 旗標,即可同步處理寫入 SQL Server 適用的 Cloud SQL 的所有變更、再次切換複製方向,讓原始來源 SQL Server 可用性群組成為可讀寫的主要群組,SQL Server 適用的 Cloud SQL 則成為次要群組,並將遷移工作傳回 CDC 階段。請注意,只有在遷移工作處於 FAILBACK 階段時,--failback 才有效;在 FAILBACK 階段執行 promote 但不使用 --failback (或在 CDC 階段傳遞 --failback),驗證會失敗並顯示 FAILED_PRECONDITION 錯誤,且遷移工作會繼續執行。

  4. (選用) 停止資料複製作業,再刪除遷移工作。
    如要在永久刪除遷移工作前停止資料複製作業,請執行 gcloud database-migration migration-jobs stop 指令 (點選即可展開):

    gcloud database-migration migration-jobs stop

    gcloud database-migration migration-jobs stop MIGRATION_JOB_ID \
        --region=REGION

    更改下列內容:

    • 將 MIGRATION_JOB_ID 替換為遷移工作的 ID。
    • REGION:儲存遷移工作的區域 ID。
  5. 完成遷移並刪除遷移工作。
    確認應用程式已完全改用新的 SQL Server 適用的 Cloud SQL 目的地執行個體,且不再需要反向複製到來源 SQL Server 執行個體後,請刪除遷移工作 (從 Running 或 Stopped 狀態),完成遷移並執行必要的清理作業。執行 gcloud database-migration migration-jobs delete 指令 (點選即可展開):

    gcloud database-migration migration-jobs delete

    這個指令會傳回互動式確認提示,您必須輸入內容才能完成。您可以使用 選用的 --quiet 旗標,略過確認提示。

    gcloud database-migration migration-jobs delete MIGRATION_JOB_ID \
        --region=REGION

    更改下列內容:

    • 將 MIGRATION_JOB_ID 替換為遷移工作的 ID。
    • REGION:儲存遷移工作的區域 ID。

    刪除遷移工作後,系統會完成遷移作業、停止所有進行中的反向複製作業、刪除兩個執行個體上的分散式可用性群組和資料庫鏡像憑證,並允許您啟用在 DAG 複製期間受限制的 SQL Server 適用的 Cloud SQL 功能 (例如時間點復原 (PITR) 或唯讀副本)。

    刪除遷移工作後,您可以視需要停用或移除目的地 SQL Server 適用的 Cloud SQL 執行個體上的 cloud sql enable dag support 資料庫旗標、捨棄 SQL Server 適用的 Cloud SQL 執行個體上的連結伺服器 (EXEC master.dbo.sp_dropserver @server = N'LINKED_SERVER_NAME', @droplogins = 'droplogins';),以及移除來源 SQL Server 執行個體上的 gcp_dms_db 輔助資料庫和遷移登入資訊。