適用於:Azure SQL 資料庫
Azure SQL Database 提供數種方法,可在相同的 Azure SQL Database 邏輯伺服器或不同的邏輯伺服器上建立現有 資料庫複本。 您可以使用 Azure 入口網站、PowerShell、Azure CLI 或 Transact-SQL 來拷貝資料庫。
注意
Microsoft Entra ID 先前稱為 Azure Active Directory (Azure AD)。
概觀
資料庫複本是在起始複製要求時的來源資料庫交易一致性快照。 您可以針對複本選取相同的邏輯伺服器或不同的邏輯伺服器。 此外,您也可以選擇保留來源資料庫的備份備援和計算大小,或在相同的服務層級中使用不同的備份儲存體備援和/或計算大小。 另外,還可能將標準服務層級中的資料庫複製到標準或一般用途層,以及將進階服務層級中的資料庫複製到進階版或商務關鍵層。
複製完成後,新資料庫是一個具有完整功能且獨立於來源資料庫的資料庫。 複製的資料庫中所含的登入、使用者和權限會與來源資料庫分開受到管理。 此複本是使用異地複寫技術建立的。 一旦完成複本植入,異地複寫連結就會自動終止。 使用異地複寫的所有需求都適用於資料庫複製作業。 如需詳細資訊,請參閱作用中異地複寫概觀。
注意
Azure 入口網站、PowerShell 和 Azure CLI 不支援將資料庫拷貝到不同的訂用帳戶。
超大規模資料庫的資料庫複本
若是 超大規模資料庫服務層級中的資料庫,目標資料庫會決定複本是快速複本或資料大小複本:
快速複本:當拷貝在與來源相同的區域中完成時,將會從 Blob 的快照集建立複本,而不論資料庫大小為何,此複本都是快速操作。
資料大小複本:當目標資料庫位於與來源不同的區域,或資料庫備份儲存體備援 (本機、區域和異地) 與來源資料庫不同時,拷貝作業會是資料大小的作業。 拷貝時間不與大小直接成正比,因為頁面伺服器 Blob 以平行方式拷貝。
資料庫複本中的登入
當您將資料庫複製到相同的邏輯伺服器時,可以在這兩個資料庫上使用相同的登入。 您用來複製資料庫的安全性主體會變成新資料庫的資料庫擁有者。
當您將資料庫複製到不同的邏輯伺服器時,在目標邏輯伺服器上起始複製作業的安全性主體會成為新資料庫的擁有者。
不論目標伺服器為何,所有資料庫使用者、其權限及其安全性識別碼 (SID) 都會拷貝到資料庫複本。 使用自主資料庫使用者來進行資料存取,可確保所複製的資料庫具有相同的使用者認證,以便在複製完成時,您可以使用相同的認證立即加以存取。
如果您使用伺服器層級登入進行資料存取,並將資料庫複製到不同的伺服器,登入型存取可能會無法使用。 這可能會因為登入不存在於目標邏輯伺服器上,或因為這些密碼和安全性標識碼 (SID) 不同而發生。 如需在將資料庫複製到不同伺服器時管理登入的詳細資訊,請參閱 配置和管理 Azure SQL Database 的異地還原或故障移轉安全性。 在將複製操作成功至不同的邏輯伺服器後,並在重新映射其他使用者之前,只有與資料庫擁有者相關的登錄或伺服器管理員可以登入到複製的資料庫。 若要在複製作業完成之後,解析登入及建立資料存取,請參閱解析登入。
複製資料庫
您可以使用 PowerShell、Azure CLI 和 Transact-SQL (T-SQL) 來複製資料庫。
若要使用 Azure 入口網站複製資料庫,請開啟資料庫的頁面,然後選擇 [複製] 以開啟 [建立 SQL Database - 複製資料庫] 頁面。 填入您要複製資料庫的目標邏輯伺服器值。
使用 Transact-SQL 複製資料庫
使用伺服器管理員的登入資訊,或使用創建您要複製的資料庫時所用的登入資訊,登入 master 資料庫。 若要成功拷貝資料庫,非伺服器管理員的登入必須是 dbmanager 角色的成員。 如需登入和連線至邏輯伺服器的詳細資訊,請參閱 授權資料庫存取。
使用 CREATE DATABASE ... AS COPY OF 陳述式,開始複製來源資料庫。 T-SQL 陳述式會繼續執行,直到資料庫複製作業完成為止。
本節提供下列作業的 Transact-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 複製到 Database2上名為 server2 的新資料庫。 視資料庫大小而定,複製作業可能需要一些時間才能完成。
-- Execute on the master database of the target logical 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 上的 Database2 複製到名為 pool2的彈性集區內名為 server2 的新資料庫。
-- Execute on the master database of the target logical 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 租戶中複製資料庫時,如果您使用擁有在來源和目的地邏輯伺服器上足夠存取權的驗證登入來啟動複製命令,則授權過程將被簡化。 最低必要存取層級是兩個邏輯伺服器上 資料庫中 master 角色的成員資格。 例如,您可以使用 Microsoft Entra ID 的登入帳號,該登入帳號屬於一個在兩個邏輯伺服器上被指定為伺服器管理員的群組成員。
在下列程式碼中,要複製的登入名稱是 loginname。
首先,連接到來源邏輯伺服器的 master 資料庫。 在來源 Azure SQL Database 邏輯伺服器的 master 資料庫中建立登入和使用者。
--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
連接到來源用戶資料庫。 接下來,在來源用戶資料庫中,在源資料庫中建立使用者,並將它新增至資料庫中的 dbowner 資料庫角色。
--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
接下來,從來源邏輯伺服器的 loginname 資料庫,尋找使用者 master 的安全性標識碼 (SID)。
--Step# 3
--Capture the SID of the user "loginname" from master database
SELECT [sid] FROM sysusers WHERE [name] = 'loginname';
在新的或目的地邏輯伺服器的 master 資料庫上執行下一個腳本。 首先,在目的地邏輯伺服器的 master 資料庫中建立登入和使用者,並將它新增至 dbmanager 伺服器角色。 提供 <strong password>,並以來源邏輯伺服器的 SID 取代 <SID of loginname login on source server>。
--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 = '<strong password>', 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
在目的地邏輯伺服器的 master 資料庫中,建立新的資料庫。 以所需的名稱取代 new_database_name。 請將 source_server_name 和 source_database_name 替換為來源的名稱。
--Step# 5
--Execute the copy of database script from the destination logical server using the credentials created
CREATE DATABASE new_database_name
AS COPY OF source_server_name.source_database_name;
提示
只有在使用 T-SQL 和 SQL 驗證登入來登入目標邏輯伺服器時,才支援從不同 Azure 租使用者中的訂用帳戶複製資料庫。 不支援在不同 Azure 租使用者的邏輯伺服器上建立資料庫複本,Microsoft Azure SQL的 Entra 驗證。
監視複製作業的進度
藉由查詢 sys.databases、sys.dm_database_copies 和 sys.dm_operation_status 檢視來監視複製程序。 拷貝過程中,新資料庫之 state_desc 檢視的 sys.databases 資料行會設定為 COPYING。
- 如果拷貝失敗,新資料庫之
state_desc檢視的sys.databases資料行會設定為SUSPECT。 在新的資料庫上執行 DROP 陳述式,稍後再試一次。 - 如果拷貝成功,新資料庫之
state_desc檢視的sys.databases資料行會設定為ONLINE。 複製已完成且新資料庫是一般資料庫,能夠與來源資料庫分開進行變更。
注意
如果決定取消正在進行的拷貝,請在新資料庫上執行 DROP DATABASE 陳述式。
重要
如果您需要使用比來源更小的服務目標來建立複本,目標資料庫可能沒有足夠的資源來完成植入程序,而可能導致複製作業失敗。 在此案例中,使用地理還原請求在不同的邏輯伺服器和/或不同區域中建立一個複本。 如需詳細資訊,請參閱使用資料庫備份來復原 Azure SQL 資料庫。
權限
若要建立資料庫複本,必須具備下列角色:
- 訂用帳戶擁有者,或是
- 「SQL Server 參與者」角色,或
- 來源邏輯伺服器上的自定義角色具有下列許可權:
Microsoft.Sql/servers/databases/read-
Microsoft.Sql/servers/databases/write和
- 目標邏輯伺服器上的自訂角色具有下列許可權:
Microsoft.Sql/servers/readMicrosoft.Sql/servers/databases/readMicrosoft.Sql/servers/databases/write
若要取消資料庫拷貝,必須具備下列角色:
- 訂用帳戶擁有者,或是
- 「SQL Server 參與者」角色,或
- 目標資料庫上具有下列權限的自訂角色:
Microsoft.Sql/servers/databases/delete
若要使用 Azure 入口網站管理資料庫拷貝,也需要下列權限:
Microsoft.Resources/subscriptions/resources/readMicrosoft.Resources/deployments/readMicrosoft.Resources/deployments/writeMicrosoft.Resources/deployments/operationstatuses/read
如果想要在入口網站的資源群組中查看部署底下的作業、跨多個資源提供者的作業 (包括 SQL 作業),您將需要下列額外的權限:
Microsoft.Resources/subscriptions/resourcegroups/deployments/operations/readMicrosoft.Resources/subscriptions/resourcegroups/deployments/operationstatuses/read
解析登入
當新資料庫在目標邏輯伺服器上上線後,請使用 ALTER USER 語句,將新資料庫中的使用者重新映射到目標邏輯伺服器上的登入。 若要解析被遺棄的使用者,請參閱 被遺棄使用者疑難排解。 另請參閱 設定及管理 Azure SQL Database 的異地還原或故障轉移安全性。
新資料庫中的所有使用者都保有其在來源資料庫中原有的權限。 起始資料庫複本的使用者會變成新資料庫的資料庫擁有者。 拷貝成功之後,重新對應其他使用者之前,只有資料庫擁有者可以登入新的資料庫。
若要瞭解如何在將資料庫複製到不同的邏輯伺服器時管理使用者和登入,請參閱 設定及管理異地還原或故障轉移的 Azure SQL Database 安全性。
資料庫複製錯誤
在 Azure SQL 資料庫中複製資料庫時,可能會發生下列錯誤。 如需更多資訊,請參閱 如何在 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 | 資料庫複製因內部錯誤而失敗。 請卸除目標資料庫並稍後再試一次。 |