复制 Azure SQL 数据库中数据库的事务一致性副本

适用于:Azure SQL 数据库

通过 Azure SQL 数据库,可以以多种方式在相同 Azure SQL 数据库逻辑服务器或不同逻辑服务器上创建现有数据库的副本。 可以使用 Azure 门户、PowerShell、Azure CLI 或 Transact-SQL 复制数据库。

注意

Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。

概述

数据库副本是源数据库在发起复制请求时的某个时间点的事务一致快照。 可以为副本选择同一逻辑服务器或其他逻辑服务器。 此外,你还可以选择保留源数据库的备份冗余和计算大小,或在相同服务层中使用不同的备份存储冗余和/或计算大小。 还可以将“标准”服务层中的数据库复制到“标准”层或“常规用途”层,将“高级”服务层中的数据库复制到“高级”层或“业务关键”层。

复制完成后,新数据库是一个具有完整功能且独立于源数据库的数据库。 复制的数据库中的登录名、用户和权限独立于源数据库进行管理。 副本使用异地复制技术创建。 副本种子设定完成后,异地复制链接会自动终止。 使用异地复制的所有要求都适用于数据库复制操作。 有关详细信息,请参阅活动异地复制概述

注意

Azure 门户、PowerShell 和 Azure CLI 不支持将数据库复制到其他订阅。

超大规模数据库的数据库副本

对于“超大规模”服务层中的数据库,由目标数据库确定副本是快速副本还是数据大小副本:

  • 快速复制:当复制在与源的同一区域中完成时,会从 blob 快照创建复制,无论数据库大小如何,此复制都是一项快速操作。

  • 数据复制大小:如果目标数据库与源数据库位于不同的区域,或者目标数据库的数据库备份存储冗余(本地、区域、异地)与源数据库不同,则复制操作将是数据操作大小。 复制时间不会与大小成正比,因为页服务器 blob 是并行复制的。

数据库副本中的登录名

将某个数据库复制到同一逻辑服务器时,可以在这两个数据库上使用相同的登录名。 用于复制该数据库的安全主体将成为新数据库上的数据库所有者。

将数据库复制到其他逻辑服务器时,由目标逻辑服务器上的复制操作启动的安全主体将成为新数据库的所有者。

无论目标服务器如何,所有数据库用户、权限及安全标识符 (SID) 都会复制到数据库副本中。 使用包含的数据库用户进行数据访问可以确保复制的数据库具有相同的用户凭据,这样在复制完成后,你可以使用相同的凭据立即进行访问。

如果使用服务器级登录名进行数据访问并将数据库复制到其他服务器,则基于登录名的访问可能无法工作。 出现这种情况的原因可能是目标逻辑服务器上不存在登录名,或者密码和安全标识符 (SID) 不同。 有关如何在将数据库复制到其他服务器时管理登录名的详细信息,请参阅针对异地还原或故障转移配置和管理 Azure SQL 数据库的安全性。 在复制到其他逻辑服务器操作成功后,但在重新映射其他用户之前,只有与数据库所有者关联的登录名或服务器管理员才能登录到复制的数据库。 若要在复制操作完成后解析登录名并建立数据访问权限,请参阅解析登录名

复制数据库

可以使用 PowerShell、Azure CLI 和 Transact-SQL (T-SQL) 复制数据库。

要使用 Azure 门户复制数据库,请打开数据库页面,然后选择“复制”以打开“创建 SQL 数据库 - 复制数据库”页。 填写要将数据库复制到的目标逻辑服务器的值。

显示数据库概述页的 Azure 门户屏幕截图,其中突出显示了数据库“复制”选项。

使用 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 数据库复制到其他逻辑服务器部分中的步骤操作,使用 T-SQL 将数据库复制到其他订阅中的逻辑服务器。 确保所用登录名的名称和密码与源数据库的数据库所有者的名称和密码相同。 此外,登录名在源逻辑服务器和目标逻辑服务器上都必须是 dbmanager 角色的成员或者是服务器管理员。

提示

在同一个 Microsoft Entra ID 租户中复制数据库时,如果在源逻辑服务器和目标逻辑服务器上使用具有足够访问权限的身份验证登录名启动复制命令,则会简化这两台服务器上的授权。 必要的最低访问权限级别是两台逻辑服务器上 数据库中的 master 角色的成员身份。 例如,可使用指定为两台逻辑服务器上服务器管理员组成员的 Microsoft Entra ID 登录名。

在以下脚本中,要复制的登录名为 loginname

首先,连接到源逻辑服务器的 master 数据库。 在源 Azure SQL 数据库逻辑服务器的 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 of loginname login on source server> 替换为源逻辑服务器中的 SID。

--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_namesource_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 SQL 的 Microsoft Entra 身份验证不支持在不同的 Azure 租户中的逻辑服务器上创建数据库副本。

监视复制操作的进度

可以通过查询 sys.databasessys.dm_database_copiessys.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/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 数据库中复制数据库时,可能会发生以下错误。 有关详细信息,请参阅复制 Azure SQL 数据库中数据库的事务一致性副本

错误代码 严重性 说明
40635 16 IP 地址为“%.*ls”的客户端暂时禁用。
40637 16 创建数据库副本当前处于禁用状态。
40561 16 数据库复制失败。 源数据库或目标数据库不存在。
40562 16 数据库复制失败。 源数据库已删除。
40563 16 数据库复制失败。 目标数据库已删除。
40564 16 数据库复制由于内部错误而失败。 请删除目标数据库,并重试。
40565 16 数据库复制失败。 不允许来自同一源的多个并发数据库复制。 请删除目标数据库,并重试。
40566 16 数据库复制由于内部错误而失败。 请删除目标数据库,并重试。
40567 16 数据库复制由于内部错误而失败。 请删除目标数据库,并重试。
40568 16 数据库复制失败。 源数据库已变得不可用。 请删除目标数据库,并重试。
40569 16 数据库复制失败。 目标数据库已变得不可用。 请删除目标数据库,并重试。
40570 16 数据库复制由于内部错误而失败。 请删除目标数据库,并重试。
40571 16 数据库复制由于内部错误而失败。 请删除目标数据库,并重试。