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

適用於: Azure SQL Database

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

概觀

資料庫複本是源資料庫的交易一致性快照集,從開始複製要求的時間點開始。 您可以為複本選取相同的伺服器或不同的伺服器。 此外,您也可以選擇保留源資料庫的備份冗余、服務層級和計算大小,或在相同或不同的服務層級中使用不同的備份儲存體冗余和/或計算大小。 複製完成之後,複本會變成功能完整的獨立資料庫。 複製的資料庫中的登入、使用者和許可權,會獨立于源資料庫之外管理。 此複本會使用異地複寫技術來建立。 一旦完成複本植入,異地複寫連結就會自動終止。 使用異地複寫的所有需求都適用於資料庫複製作業。 如需詳細資訊,請參閱 主動式異地複寫總覽

注意

Azure SQL Database 可設定的備份儲存體在巴西南部的公開預覽版本中,現已正式推出,且僅適用于東南亞 Azure 區域。 在預覽中,如果源資料庫是以本機冗余或區域冗余備份儲存體複本建立,則不支援將資料庫複製到不同 Azure 區域中的伺服器。

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

針對 Azure SQL 超大規模,目標資料庫會決定複製會是快速複製或資料複製的大小。

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

資料複製的大小:當目標資料庫位於與來源不同的區域,或資料庫備份儲存體冗余 (本機、區域、目標的地理) 與源資料庫不同時,複製作業會是資料作業的大小。 複製時間不會與大小直接成正比,因為頁面伺服器 blob 會以平行方式複製。

資料庫複本中的登入

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

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

不論目標伺服器為何,所有資料庫使用者、其權限及其安全性識別碼 (SID) 都會複製到資料庫複本。 使用自主 資料庫使用者 進行資料存取,可確保複製的資料庫具有相同的使用者認證,如此一來,在複製完成之後,您就可以使用相同的認證立即存取它。

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

使用 Azure 入口網站複製

若要使用 Azure 入口網站來複製資料庫,請開啟資料庫頁面,然後按一下 [複製]。

資料庫複本

使用 PowerShell 或 Azure CLI 複製

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

針對 PowerShell,請使用 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"

資料庫複本是非同步作業,但會在接受要求之後立即建立目標資料庫。 如果您需要在仍在進行時取消複製作業,請使用 >set-azsqldatabase Cmdlet 卸載 目標資料庫。

如需完整的 PowerShell 腳本範例,請參閱 將資料庫複製到新的伺服器

使用 Transact-sql 複製 SQL

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

開始複製源資料庫與 建立資料庫 .。。作為語句的副本 。 T SQL 語句會繼續執行,直到資料庫複製作業完成為止。

注意

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

當來源和/或目的地伺服器設定了 私人端點 ,且 公用網路存取遭到拒絕時,不支援資料庫複製。 如果私人端點已設定但允許公用網路存取,則支援從公用 IP 位址連線到目的地伺服器時,起始資料庫複製。 複製作業完成後,就可以拒絕公用存取。

重要

使用 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 可以是單一或集區資料庫。 支援在不同的層集區之間進行複製,但某些跨層複本將不會成功。 例如,您可以將單一或彈性標準 db 複製到一般用途集區,但無法將標準彈性 db 複製到高階集區。

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

複製到不同的伺服器

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

此命令會將 server1 上的 Database1 複製到 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 之用戶端 IP 的輸入連線 .。。作為命令的複本。 若要判斷目前連接的來源 IP 位址,請執行 SELECT client_net_address FROM sys.dm_exec_connections WHERE session_id = @@SPID;

複製到不同的訂用帳戶

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

--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;

注意

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

提示

使用 T SQL 的資料庫複製支援從不同 Azure 租使用者中的訂用帳戶複製資料庫。 只有使用 SQL authentication 登入來登入目標伺服器時,才支援此功能。 當Azure Active Directory auth 處於作用中狀態時,不支援在不同 Azure 租使用者中的邏輯伺服器上建立資料庫複本, (在來源或目標邏輯伺服器上啟用) 。

監視複製作業的進度

藉由查詢 sys. 資料庫sys.dm_database_copiessys.dm_operation_status 視圖,來監視複製程式。 正在進行複製時,新資料庫之 sys. 資料庫檢視的 state_desc 資料行會設定為 [ 複製]。

  • 如果複製失敗,新資料庫之 sys. 資料庫檢視的 [ state_desc ] 資料行會設定為 [ 可疑]。 在新的資料庫上執行 DROP 陳述式,稍後再試一次。
  • 如果複製成功,新資料庫之 sys. 資料庫檢視的 state_desc 資料行會設定為 ONLINE。 複製已完成且新資料庫是一般資料庫,能夠與來源資料庫分開進行變更。

注意

如果您決定在進行複製時予以取消,請在新資料庫上執行 DROP DATABASE 陳述式。

重要

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

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

若要建立資料庫複本,您必須具備下列角色

  • 訂用帳戶擁有者,或是

  • SQL Server 參與者角色或

  • 具有下列許可權的來源和目標資料庫上的自訂角色:

    Microsoft .Sql/servers/database/read Microsoft .Sql/servers/資料庫/write

若要取消資料庫複製,您必須具備下列角色

  • 訂用帳戶擁有者,或是

  • SQL Server 參與者角色或

  • 具有下列許可權的來源和目標資料庫上的自訂角色:

    Microsoft .Sql/servers/database/read Microsoft .Sql/servers/資料庫/write

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

Microsoft .Resources/訂用帳戶/資源/讀取 Microsoft .Resources/訂用帳戶/資源/寫入 Microsoft .Resources/部署/讀取 Microsoft .resources/部署/撰寫 Microsoft .Resources/部署/operationstatuses/read

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

Microsoft .Resources/訂用帳戶/resourcegroups/部署/作業/讀取 Microsoft .Resources/訂用帳戶/resourcegroups/部署/operationstatuses/read

解析登入

在目標伺服器上的新資料庫上線之後,請使用 ALTER USER 語句,將新資料庫中的使用者重新對應至目標伺服器上的登入。 若要解析被遺棄的使用者,請參閱 被遺棄使用者疑難排解。 另請參閱如何在嚴重損壞修復之後管理 Azure SQL Database 安全性

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

若要瞭解如何在將資料庫複製到不同的伺服器時管理使用者與登入,請參閱如何在嚴重損壞修復之後管理 Azure SQL Database 的安全性

資料庫複製錯誤

在 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 資料庫複製因內部錯誤而失敗。 請卸除目標資料庫並稍後再試一次。

下一步