复制 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 数据库安全性。 在复制到其他服务器操作成功后,但在重新映射其他用户之前,只有与数据库所有者关联的登录名或服务器管理员才能登录到复制的数据库。 若要在复制操作完成后解析登录名并建立数据访问权限,请参阅解析登录名。
使用 Azure 门户复制
要使用 Azure 门户复制数据库,请打开数据库页面,然后选择“复制”以打开“创建 SQL 数据库 - 复制数据库”页。 填写要将数据库复制到的目标服务器的值。
复制数据库
可以使用 PowerShell、Azure CLI 和 Transact-SQL (T-SQL) 复制数据库。
对于 PowerShell,请使用 New-AzSqlDatabaseCopy cmdlet。
重要
PowerShell Azure 资源管理器 (RM) 模块仍受 Azure SQL 数据库支持,但所有未来的开发都是针对 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 脚本,请参阅将数据库复制到新的服务器。
监视复制操作的进度
可以通过查询 sys.databases、sys.dm_database_copies 和 sys.dm_operation_status 视图来监视复制过程。 当复制正在进行时,新数据库的 sys.databases
视图的 state_desc
列被设置为 COPYING
。
- 如果复制失败,新数据库的
sys.databases
视图的state_desc
列将设置为SUSPECT
。 对新数据库执行 DROP 语句并稍后重试。 - 如果复制成功,新数据库的
sys.databases
视图的state_desc
列将设置为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 | 数据库复制由于内部错误而失败。 请删除目标数据库,并重试。 |