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

在 Azure Cosmos DB 中创建和管理容器复制作业(预览版)

复制作业有助于在 Azure Cosmos DB 帐户中创建容器的副本。

本文介绍了如何使用 Azure CLI 命令创建、监视和管理复制作业。

先决条件

  • 可以使用门户 Cloud Shell 来运行容器复制命令。 或者,可以在本地运行命令;确保已在计算机上下载并安装 Azure CLI
  • 目前,仅这些区域支持容器复制。 请确保帐户的写入区域包含在此列表中。
  • 安装包含容器复制命令的 Azure Cosmos DB 预览版扩展。
    az extension add --name cosmosdb-preview
    

设置 shell 变量

首先,设置每个单独脚本所使用的所有变量。

$sourceSubId = "<source-subscription-id>" 
$destinationSubId = "<destination-subscription-id>" 
$sourceAccountRG = "<source-resource-group-name>"
$destinationAccountRG = "<destination-resource-group-name>"
$sourceAccount = "<cosmos-source-account-name>"
$destinationAccount = "<cosmos-destination-account-name>"
$jobName = ""
$sourceDatabase = ""
$sourceContainer = ""
$destinationDatabase = ""
$destinationContainer = ""

分配读取权限

注意

如果要在同一 Azure Cosmos DB 帐户中复制数据,则不需要执行此步骤。

将数据从一个帐户的容器复制到另一个帐户的容器时,需要向目标帐户的标识授予源容器的读取访问权限才能执行复制操作。 按照以下步骤将必要的读取权限分配给目标帐户。

使用系统托管标识

  1. 设置目标订阅上下文
    az account set --subscription $destinationSubId
    
  2. 在目标帐户上添加系统标识
    $identityOutput = az cosmosdb identity assign -n $destinationAccount -g $destinationAccountRG
    $principalId = ($identityOutput | ConvertFrom-Json).principalId
    
  3. 在目标帐户上设置默认标识
    az cosmosdb update -n $destinationAccount -g $destinationAccountRG --default-identity="SystemAssignedIdentity"
    
  4. 设置源订阅上下文
    az account set --subscription $sourceSubId
    
  5. 在源帐户上添加角色分配
    # Read-only access role
    $roleDefinitionId = "00000000-0000-0000-0000-000000000001" 
    az cosmosdb sql role assignment create --account-name $sourceAccount --resource-group $sourceAccountRG --role-definition-id $roleDefinitionId --scope "/" --principal-id $principalId
    
  6. 重置目标订阅上下文
    az account set --subscription $destinationSubId
    

使用用户分配的托管标识

  1. 分配用户分配的托管标识变量
    $userAssignedManagedIdentityResourceId = "<CompleteResourceIdOfUserAssignedManagedIdentity>"
    
  2. 设置目标订阅上下文
    az account set --subscription $destinationSubId
    
  3. 在目标帐户上添加用户分配的托管标识
    $identityOutput = az cosmosdb identity assign -n $destinationAccount -g $destinationAccountRG --identities $userAssignedManagedIdentityResourceId
    $principalId = ($identityOutput | ConvertFrom-Json).userAssignedIdentities.$userAssignedManagedIdentityResourceId.principalId
    
  4. 在目标帐户上设置默认标识
    az cosmosdb update -n $destinationAccount -g $destinationAccountRG --default-identity=UserAssignedIdentity=$userAssignedManagedIdentityResourceId
    
  5. 设置源订阅上下文
    az account set --subscription $sourceSubId
    
  6. 在源帐户上添加角色分配
    $roleDefinitionId = "00000000-0000-0000-0000-000000000001"  # Read-only access role
    az cosmosdb sql role assignment create --account-name $sourceAccount --resource-group $sourceAccountRG --role-definition-id $roleDefinitionId --scope "/" --principal-id $principalId
    
  7. 重置目标订阅上下文
    az account set --subscription $destinationSubId
    

创建复制作业

az cosmosdb copy create `
    --resource-group $destinationAccountRG `
    --job-name $jobName `
    --dest-account $destinationAccount `
    --src-account $sourceAccount `
    --dest-nosql database=$destinationDatabase container=$destinationContainer `
    --src-nosql database=$sourceDatabase container=$sourceContainer
    --mode Online

监视进度

使用以下命令监视进度。

az cosmosdb copy show `
    --resource-group $destinationAccountRG `
    --account-name $destinationAccount `
    --job-name $jobName
  1. 总计数 – 它表示源容器中任何给定时间的更改总数(文档总数 + 任何新更改)。
  2. 已处理的计数 – 它表示来自源容器的更改源的事件总数,这些事件已由复制作业处理。

完成复制作业

  1. 当处理计数大于或等于总计数时,请关闭源容器上的任何更新,并等待 5-10 分钟刷新剩余的任何更改。
  2. 运行完成 API 以完成复制作业和释放计算资源,这还会将剩余的更改(如果有)写入目标容器。
    az cosmosdb copy complete `
        --resource-group $destinationAccountRG `
        --account-name $destinationAccount `
        --job-name $jobName
  1. 根据需要更新客户端应用程序以开始使用新的(目标)容器。

设置 shell 变量

首先,设置每个单独脚本所使用的所有变量。

$destinationRG = "<destination-resource-group-name>"
$sourceAccount = "<cosmos-source-account-name>"
$destinationAccount = "<cosmos-destination-account-name>"
$jobName = ""
$sourceDatabase = ""
$sourceCollection = ""
$destinationDatabase = ""
$destinationCollection = ""

创建复制作业

创建作业以在 Azure Cosmos DB API for MongoDB 帐户中复制集合:

az cosmosdb copy create `
    --resource-group $destinationRG `
    --job-name $jobName `
    --dest-account $destinationAccount `
    --src-account $sourceAccount `
    --dest-mongo database=$destinationDatabase collection=$destinationCollection `
    --src-mongo database=$sourceDatabase collection=$sourceCollection 

注意

--job-name 对于帐户中的每个作业应是唯一的。

设置 shell 变量

首先,设置每个单独脚本所使用的所有变量。

$destinationRG = "<destination-resource-group-name>"
$sourceAccount = "<cosmos-source-account-name>"
$destinationAccount = "<cosmos-destination-account-name>"
$jobName = ""
$sourceKeySpace = ""
$sourceTable = ""
$destinationKeySpace = ""
$destinationTable = ""

创建复制作业

创建作业以在 Azure Cosmos DB for Apache Cassandra 帐户中复制表:

az cosmosdb copy create `
    --resource-group $destinationRG `
    --job-name $jobName `
    --dest-account $destinationAccount `
    --src-account $sourceAccount `
    --dest-cassandra keyspace=$destinationKeySpace table=$destinationTable `
    --src-cassandra keyspace=$sourceKeySpace table=$sourceTable 

注意

--job-name 对于帐户中的每个作业应是唯一的。

管理复制作业

监视更新作业的进度

查看复制作业的进度和状态:

az cosmosdb copy show `
    --resource-group $destinationAccountRG `
    --account-name $destinationAccount `
    --job-name $jobName

列出在帐户中创建的所有复制作业

若要列出在帐户中创建的所有复制作业:

az cosmosdb copy list `
    --resource-group $destinationAccountRG `
    --account-name $destinationAccount

暂停复制作业

若要暂停正在进行的复制作业,可以使用以下命令:

az cosmosdb copy pause `
    --resource-group $destinationAccountRG `
    --account-name $destinationAccount `
    --job-name $jobName

继续复制作业

若要继续正在进行的复制作业,可以使用以下命令:

az cosmosdb copy resume `
    --resource-group $destinationAccountRG `
    --account-name $destinationAccount `
    --job-name $jobName

取消复制作业

若要取消正在进行的复制作业,可以使用以下命令:

az cosmosdb copy cancel `
    --resource-group $destinationAccountRG `
    --account-name $destinationAccount `
    --job-name $jobName

获取对复制问题的支持

如果遇到与容器复制相关的问题,请从 Azure 门户提出新的支持请求。 将“问题类型”设置为“数据迁移”,并将“问题子类型”设置为“容器复制”。

后续步骤

  • 有关容器复制作业的详细信息,请参阅复制作业