你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

复制 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 租户中复制数据库时,如果使用在两个逻辑服务器上均具有足够访问权限的身份验证登录名来启动复制命令,则源和目标逻辑服务器的授权过程将简化。 在两个逻辑服务器上所需的最低访问级别是成为 数据库中 dbmanager 角色的成员。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 数据库复制由于内部错误而失败。 请删除目标数据库,并重试。