在 Azure SQL Database 中複製資料庫的交易一致性複本

適用於:Azure SQL Database

Azure SQL Database 提供數種方法,可在相同伺服器或不同伺服器上建立現有資料庫的複本。 您可以使用 Azure 入口網站、PowerShell、Azure CLI 或 Transact-SQL 來複製資料庫。

注意

Microsoft Entra 標識符 先前稱為 Azure Active Directory (Azure AD)。

概觀

資料庫複本是在起始複製要求之後某個時間點的來源資料庫交易一致性快照集。 您可以選取相同的伺服器或不同的伺服器的複本。 此外,您也可以選擇保留來源資料庫的備份備援和計算大小,或在相同的服務層級中使用不同的備份儲存體備援和/或計算大小。 有幾個例外狀況,標準服務層級中的資料庫可以複製到標準層或一般用途層,而 進階版 服務層級中的資料庫可以複製到 進階版 或 業務關鍵 層。 複製完成之後,複本會變成功能完整的獨立資料庫。 複製的資料庫中所含的登入、使用者和權限會與來源資料庫分開受到管理。 此複本是使用異地複寫技術建立的。 一旦完成複本植入,異地複寫連結就會自動終止。 使用異地複寫的所有需求都適用於資料庫複製作業。 如需詳細資訊,請參閱作用中異地複寫概觀

注意

Azure 入口網站、PowerShell 和 Azure CLI 不支援資料庫複製到不同的訂用帳戶。

適用於 Azure SQL 超大規模資料庫的資料庫複本

針對 Azure SQL 超大規模資料庫,目標資料庫會決定複本是快速複本,還是數據大小複本。

  • 快速複製:當複製在與來源相同的區域中完成時,會從 Blob 的快照集建立複本,不論資料庫大小為何,此複本都是快速作業。

  • 數據大小複製:當目標資料庫位於與來源不同的區域,或如果資料庫備份記憶體備援 (Local, Zonal, Geo) 與目標不同,則複製作業是數據大小作業。 複製時間不會與大小成正比,因為分頁伺服器 Blob 會以平行方式複製。

資料庫複本中的登入

當您將資料庫複製到相同的伺服器時,可以在這兩個資料庫上使用相同的登入。 您用來複製資料庫的安全性主體會變成新資料庫的資料庫擁有者。

當您將資料庫複製到不同的伺服器時,目標伺服器上起始複製作業的安全性主體會變成新資料庫的擁有者。

無論目標伺服器為何,所有資料庫使用者、許可權和安全性識別碼 (SID) 都會複製到資料庫複本。 使用自主資料庫使用者來進行資料存取,可確保所複製的資料庫具有相同的使用者認證,以便在複製完成時,您可以使用相同的認證立即加以存取。

如果您使用伺服器層級登入進行資料存取,並將資料庫複製到不同的伺服器,登入型存取可能會無法使用。 這可能會因為登入不存在於目標伺服器上,或因為這些密碼和安全性標識碼 (SID) 不同而發生。 如需將資料庫複製到不同伺服器時管理登入的詳細資訊,請參閱如何在災害復原后管理 Azure SQL 資料庫 安全性。 在不同伺服器的複製作業成功之後,且在重新對應其他使用者之前,只有與資料庫擁有者,或伺服器管理員相關聯的登入可以登入所複製的資料庫。 若要在複製作業完成之後,解析登入及建立資料存取,請參閱解析登入

使用 Azure 入口網站複製

若要使用 Azure 入口網站複製資料庫,請開啟資料庫的頁面,然後選擇 [複製] 以開啟 [建立 SQL Database - 複製資料庫] 頁面。 針對您要將資料庫複製至其中的目標伺服器,填入值。

Screenshot of Azure portal, showing Database copy option highlighted on the database overview page.

使用 PowerShell 或 Azure CLI 複製

若要複製資料庫,請使用下列範例。

針對 PowerShell,請使用 New-AzSqlDatabaseCopy Cmdlet。

重要

Azure SQL Database 仍然支援 PowerShell Azure Resource Manager (RM) 模組,但所有未來的開發都是針對 Az.Sql 模組。 AzureRM 模組在至少 2020 年 12 月之前都還會持續收到 Bug 修正。 Az 模組和 AzureRm 模組中命令的引數本質上完全相同。 如需其相容性的詳細資訊,請參閱新的 Azure PowerShell Az 模組簡介

New-AzSqlDatabaseCopy -ResourceGroupName "<resourceGroup>" -ServerName $sourceserver -DatabaseName "<databaseName>" `
    -CopyResourceGroupName "myResourceGroup" -CopyServerName $targetserver -CopyDatabaseName "CopyOfMySampleDatabase"

資料庫複製是非同步作業,但在接受要求後會立即建立目標資料庫。 如果您需要在複製作業仍進行時加以取消,請使用 Remove-AzSqlDatabase Cmdlet,卸除目標資料庫。

如需完整範例 PowerShell 指令碼,請參閱將資料庫複製到新伺服器

使用 Transact-SQL 複製

使用伺服器管理員登入或建立所要複製之資料庫的登入,來登入 master 資料庫。 若要讓資料庫複製成功,不是伺服器管理員的 登入必須是 dbmanager 角色的成員。 如需登入與連接到伺服器的詳細資訊,請參閱 管理登入

使用 CREATE DATABASE ... AS COPY OF 陳述式,開始複製來源資料庫。 T-SQL 陳述式會繼續執行,直到資料庫複製作業完成為止。

注意

終止 T-SQL 語句並不會終止資料庫複製作業。 若要終止作業,請卸除目標資料庫。

複製到相同的伺服器

使用伺服器管理員登入或建立所要複製之資料庫的登入,來登入 master 資料庫。 若要讓資料庫複製成功,不是伺服器管理員的 登入必須是 dbmanager 角色的成員。

此命令會 Database1 複製到同一部伺服器上名為 Database2 的新資料庫。 視資料庫大小而定,複製作業可能需要一些時間才能完成。

-- Execute on the master database to start copying
CREATE DATABASE Database2 AS COPY OF Database1;

複製到彈性集區

使用伺服器管理員登入或建立所要複製之資料庫的登入,來登入 master 資料庫。 若要讓資料庫複製成功,不是伺服器管理員的 登入必須是 dbmanager 角色的成員。

此命令會 Database1 複製到名為 pool1 的彈性集區中名為 Database2 的新資料庫。 視資料庫大小而定,複製作業可能需要一些時間才能完成。

Database1 可以是單一或集區資料庫。 支援在不同層集區之間複製,但某些跨層複製會失敗。 例如,您可以將單一或彈性標準資料庫複製到一般用途集區,但無法將標準彈性資料庫複製到進階集區。

-- Execute on the master database to start copying
CREATE DATABASE Database2
AS COPY OF Database1
(SERVICE_OBJECTIVE = ELASTIC_POOL( name = pool1 ));

複製到不同的伺服器

連線 至master要建立新資料庫的目標伺服器資料庫。 使用與來源伺服器中來源資料庫的資料庫擁有者相同的名稱和密碼登入。 目標伺服器上的登入也必須是 dbmanager 角色的成員,或是伺服器管理員登入。

此命令會將 Database1 server1 複製到 server2 上名為 Database2 的新資料庫。 視資料庫大小而定,複製作業可能需要一些時間才能完成。

-- Execute on the master database of the target server (server2) to start copying from Server1 to Server2
CREATE DATABASE Database2 AS COPY OF server1.Database1;

重要

這兩個伺服器的防火牆都必須設定為允許來自發出 T-SQL CREATE DATABASE ... AS COPY OF 命令的用戶端 IP 輸入連線。 若要判斷目前連線的來源IP位址,請執行 SELECT client_net_address FROM sys.dm_exec_connections WHERE session_id = @@SPID;

注意

透過私人端點連線到目的地伺服器時,不支援使用 T-SQL 的資料庫複製。 如果已設定私人端點,但允許公用網路存取,則使用SQL驗證從公用IP位址連線到目的地伺服器時,支援資料庫複製。 複製作業完成後,就可以拒絕公用存取。

同樣地,下列命令會在 Database1 server1 上複製到 server2 上名為 pool2 的彈性集區內名為 Database2 的新資料庫。

-- Execute on the master database of the target server (server2) to start copying from Server1 to Server2
CREATE DATABASE Database2 AS COPY OF server1.Database1 (SERVICE_OBJECTIVE = ELASTIC_POOL( name = pool2 ) );

複製到其他訂用帳戶

您可以使用 [將 SQL Database 複製到不同的伺服器] 區段中的步驟,使用 T-SQL 將您的資料庫複製到不同訂用帳戶中的伺服器。 確定您使用與來源資料庫的資料庫擁有者相同的名稱和密碼登入。 此外,登入必須是來源和目標伺服器上的 dbmanager 角色或伺服器管理員的成員

提示

在相同的 Microsoft Entra ID 租使用者中複製資料庫時,如果您使用驗證登入在兩部伺服器上都有足夠的存取權來起始複製命令,則會簡化來源和目的地伺服器上的授權。 最低必要存取層級是兩部伺服器上資料庫 dbmanager 角色master的成員資格。 例如,您可以使用 Microsoft Entra ID 登入,該登入是兩部伺服器上指定為伺服器管理員的群組成員。

--Step# 1
--Create login and user in the master database of the source server.

CREATE LOGIN loginname WITH PASSWORD = 'xxxxxxxxx'
GO
CREATE USER [loginname] FOR LOGIN [loginname] WITH DEFAULT_SCHEMA=[dbo];
GO
ALTER ROLE dbmanager ADD MEMBER loginname;
GO

--Step# 2
--Create the user in the source database and grant dbowner permission to the database.

CREATE USER [loginname] FOR LOGIN [loginname] WITH DEFAULT_SCHEMA=[dbo];
GO
ALTER ROLE db_owner ADD MEMBER loginname;
GO

--Step# 3
--Capture the SID of the user "loginname" from master database

SELECT [sid] FROM sysusers WHERE [name] = 'loginname';

--Step# 4
--Connect to Destination server.
--Create login and user in the master database, same as of the source server.

CREATE LOGIN loginname WITH PASSWORD = 'xxxxxxxxx', SID = [SID of loginname login on source server];
GO
CREATE USER [loginname] FOR LOGIN [loginname] WITH DEFAULT_SCHEMA=[dbo];
GO
ALTER ROLE dbmanager ADD MEMBER loginname;
GO

--Step# 5
--Execute the copy of database script from the destination server using the credentials created

CREATE DATABASE new_database_name
AS COPY OF source_server_name.source_database_name;

提示

使用 T-SQL 的資料庫複製支援從不同 Azure 租用戶中的訂用帳戶複製資料庫。 只有使用 SQL 驗證登入來登入目標伺服器時,才支援此功能。 在 來源或目標邏輯伺服器上啟用 Microsoft Entra 驗證時,不支援在不同的 Azure 租使用者中建立資料庫複本。

監視複製作業的進度

藉由查詢 sys.databasessys.dm_database_copiessys.dm_operation_status 檢視來監視複製程序。 複製進行時, state_desc 新資料庫檢視的數據 sys.databases 行會設定為 COPYING

  • 如果複製失敗,state_descsys.databases新資料庫的檢視資料列會設定為 SUSPECT。 在新的資料庫上執行 DROP 陳述式,稍後再試一次。
  • 勾選此資料state_descsys.databases列設定為 ONLINE。 複製已完成且新資料庫是一般資料庫,能夠與來源資料庫分開進行變更。

注意

如果您決定在進行中時取消複製,請在新的資料庫上執行 DROP DATABASE 語句。

重要

如果您需要使用比來源更小的服務目標來建立複本,目標資料庫可能沒有足夠的資源來完成植入程序,而可能導致複製作業失敗。 在此案例中,請使用異地還原要求在不同的伺服器及/或不同的區域中建立複本。 如需詳細資訊,請參閱使用資料庫備份復原 Azure SQL 資料庫。

管理資料庫複本的 Azure RBAC 角色和權限

若要建立資料庫複本,您必須在下列角色中:

  • 訂用帳戶擁有者,或是
  • 「SQL Server 參與者」角色,或
  • 來源伺服器上的自訂角色具有下列許可權:
    • Microsoft.Sql/servers/databases/read
    • Microsoft.Sql/servers/databases/write 和
  • 目標伺服器上的自訂角色具有下列權限:
    • Microsoft.Sql/servers/read
    • Microsoft.Sql/servers/databases/read
    • Microsoft.Sql/servers/databases/write

若要取消資料庫複本,您必須在下列角色中:

  • 訂用帳戶擁有者,或是
  • 「SQL Server 參與者」角色,或
  • 目標資料庫上具有下列許可權的自訂角色:
    • Microsoft.Sql/servers/databases/delete

若要使用 Azure 入口網站 管理資料庫複本,您也需要下列許可權:

  • Microsoft.Resources/subscriptions/resources/read
  • Microsoft.Resources/deployments/read
  • Microsoft.Resources/deployments/write
  • Microsoft.Resources/deployments/operationstatuses/read

如果您想要在入口網站的資源群組中查看部署下作業,跨多個資源提供者的作業,包括 SQL 作業,您需要下列額外的許可權:

  • Microsoft.Resources/subscriptions/resourcegroups/deployments/operations/read
  • Microsoft.Resources/subscriptions/resourcegroups/deployments/operationstatuses/read

解析登入

在新資料庫於目標伺服器上線之後,使用 ALTER USER 陳述式將使用者從新的資料庫重新對應至目標伺服器上的登入。 若要解析被遺棄的使用者,請參閱 被遺棄使用者疑難排解。 另請參閱如何管理災害復原後的 Azure SQL 資料庫安全性

新資料庫中的所有使用者都保有其在來源資料庫中原有的權限。 起始資料庫複本的使用者會變成新資料庫的資料庫擁有者。 複製成功之後,以及在重新對應其他使用者之前,只有資料庫擁有者可以登入新的資料庫。

若要了解將資料庫複製到不同的伺服器時如何管理使用者與登入,請參閱如何管理災害復原後的 Azure SQL 資料庫安全性

資料庫複製錯誤

在 Azure SQL Database 中複製資料庫時,可能會發生下列錯誤。 如需詳細資訊,請參閱 複製 Azure SQL Database

錯誤碼 嚴重性 描述
40635 16 IP 位址 '%.*ls' 的用戶端已暫時停用。
40637 16 建立資料庫副本目前已停用。
40561 16 資料庫複製失敗。 來源或目標資料庫不存在。
40562 16 資料庫複製失敗。 已經卸除來源資料庫。
40563 16 資料庫複製失敗。 已經卸除目標資料庫。
40564 16 資料庫複製因內部錯誤而失敗。 請卸除目標資料庫並再試一次。
40565 16 資料庫複製失敗。 不允許從相同來源進行超過 1 個並行資料庫複製。 請卸除目標資料庫並稍後再試一次。
40566 16 資料庫複製因內部錯誤而失敗。 請卸除目標資料庫並再試一次。
40567 16 資料庫複製因內部錯誤而失敗。 請卸除目標資料庫並再試一次。
40568 16 資料庫複製失敗。 來源資料庫已變成無法使用。 請卸除目標資料庫並再試一次。
40569 16 資料庫複製失敗。 目標資料庫已變成無法使用。 請卸除目標資料庫並再試一次。
40570 16 資料庫複製因內部錯誤而失敗。 請卸除目標資料庫並稍後再試一次。
40571 16 資料庫複製因內部錯誤而失敗。 請卸除目標資料庫並稍後再試一次。