使用批量操作处理亿级对象

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

面对大规模标签管理、权限调整、数据解冻等场景,传统方式需要基于 OSS SDK 编写批量操作程序并管理任务执行状态。批量操作提供托管解决方案,单作业可处理 100 亿对象,无需编码即可完成标签管理、ACL 修改、数据解冻等操作。

适用范围

批量操作功能目前处于邀测阶段,仅在华东1(杭州)和华北6(乌兰察布)地域开放。如需使用,请联系技术支持申请开通。

操作概览

  1. 创建RAM角色:允许 OSS 服务读取清单文件、执行批量操作并生成报告文件。

  2. 准备输入清单:通过存储空间清单文件(manifest.json)、前缀(Prefix)或 CSV 清单文件(manifest.csv)指定待处理的对象范围。

  3. 创建作业:配置具体操作(标签、权限、解冻等)并提交作业。

  4. 作业管理与运维:监控作业状态,确认待执行的作业,查看执行报告,必要时调整优先级或取消作业。

步骤一:创建RAM角色

  1. 前往 RAM 控制台,创建角色。选择信任的实体类型为云服务,信任主体名称选择对象存储

  2. 为该角色创建并附加一个自定义权限策略。策略内容如下,将 your-bucket 替换为实际的 Bucket 名称。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "oss:GetBucketInfo",
            "oss:ListObjects",
            "oss:GetObject",
            "oss:GetObjectTagging",
            "oss:PutObjectTagging",
            "oss:DeleteObjectTagging",
            "oss:PutObjectAcl",
            "oss:RestoreObject",
            "oss:PutObject"
          ],
          "Resource": [
            "acs:oss:*:*:your-bucket",
            "acs:oss:*:*:your-bucket/*"
          ]
        }
      ]
    }

    权限说明

    • 必需权限

      • oss:GetBucketInfo - 获取存储空间信息

    • 输入清单相关权限

      • oss:ListObjects - 使用前缀生成方式时需要

      • oss:GetObject - 使用存储空间清单文件或 CSV 清单文件时需要

    • 批量操作相关权限

      • oss:GetObjectTagging - 批量替换标签时需要(读取现有标签)

      • oss:PutObjectTagging - 批量添加标签或批量替换标签时需要

      • oss:DeleteObjectTagging - 批量删除标签时需要

      • oss:PutObjectAcl - 批量修改权限时需要

      • oss:RestoreObject - 批量解冻归档对象时需要

    • 报告输出权限

      • oss:PutObject - 上传批量操作报告文件时需要

  3. 记录下该角色的 ARN(例如 acs:ram::<your-account-uid>:role/BatchRole),后续步骤将用到。

步骤二:准备输入清单

批量操作需要指定要处理哪些对象。根据场景不同,可以选择以下三种方式:

  • 存储空间清单文件:适合大规模、定期重复的批量操作

  • 前缀:处理某个目录下的所有对象

  • CSV 清单文件:待处理对象列表的 CSV 文件

存储空间清单文件

使用存储空间清单自动生成的清单文件。

<Manifest>
    <Location>
        <ETag>495B279A99C2BA72A66CA1E23B5FEA13</ETag>
        <Bucket>my-bucket</Bucket>
        <Object>inventory-reports/my-bucket/daily-inventory/2025-10-29T12-49Z/manifest.json</Object>
    </Location>
    <Spec>
        <Format>OSS_InventoryReport_CSV_20250611</Format>
    </Spec>
</Manifest>

配置说明

  • ETag:使用 manifest.json 文件的 ETag 值

  • FormatOSS_InventoryReport_CSV_20250611

前缀

根据前缀自动生成对象列表。

<KeyPrefixManifestGenerator>
    <SourceBucket>my-bucket</SourceBucket>
    <Prefix>documents/2024/</Prefix>
</KeyPrefixManifestGenerator>

CSV 清单文件

通过 CSV 文件精确列出对象。CSV 清单文件必须上传到 OSS,并且与批量作业在相同地域。

<Manifest>
    <Location>
        <Bucket>my-bucket</Bucket>
        <Object>manifest.csv</Object>
        <ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
    </Location>
    <Spec>
        <Format>OSS_BatchOperations_CSV_20250611</Format>
        <Fields>Bucket,Key</Fields>
    </Spec>
</Manifest>

配置说明

  • ETag:使用 manifest.csv 的 ETag 值

  • Fields:明确 CSV 文件的列定义

    • 未开启版本控制:Bucket,Key

    • 开启版本控制:Bucket,Key,VersionId

  • FormatOSS_BatchOperations_CSV_20250611

CSV 文件格式要求

  • 文件编码:必须使用 UTF-8 编码

  • 字段分隔符:使用英文逗号(,)分隔

  • Object Key 编码:必须经过 URL 编码(例如:documents%2Freport1.pdf

  • 文件大小限制:单个文件不超过 10TB

  • 不支持注释:CSV 文件中不能包含注释行

CSV 文件示例

  • 未开启版本控制

    my-bucket,documents%2Freport1.pdf
    my-bucket,documents%2Freport2.pdf
    my-bucket,images%2Fphoto1.jpg
  • 开启版本控制

    my-bucket,important%2Fdata.json,3/L4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY+MTRCxf3vjVBH40Nr8X8gdRQBpUMLUo
    my-bucket,config%2Fsettings.xml,null

步骤三:创建作业

批量替换标签

替换操作会删除对象原有的所有标签。单个对象最多支持10个标签,所有标签键值的总长度不能超过1KB,标签键不能重复且区分大小写。

警告

如果有配置生命周期规则,且生命周期规则依赖批量替换标签的结果时,务必要检查批量替换标签的最终执行结果,一个作业执行完后,无论作业是执行中、完成、失败、暂停、还是取消状态,均有可能部分Object完成标签替换,部分Object标签替换失败,使用时请查询结果的成功数、失败数等信息,确保标签替换结果符合预期。

ossutil2.0

ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.com

存储空间清单文件

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <PutObjectTagging>
            <TagSet>
                <Tag><Key>Environment</Key><Value>Production</Value></Tag>
                <Tag><Key>Team</Key><Value>DataOps</Value></Tag>
            </TagSet>
        </PutObjectTagging>
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>put-tag-inventory-job-001</ClientRequestToken>
    <Manifest>
        <Location>
            <ETag>495B279A99C2BA72A66CA1E23B5FEA13</ETag>
            <Bucket>my-bucket</Bucket>
            <Object>inventory-reports/my-bucket/daily-inventory/2025-10-29T12-49Z/manifest.json</Object>
        </Location>
        <Spec>
            <Format>OSS_InventoryReport_CSV_20250611</Format>
        </Spec>
    </Manifest>
    <Description>Batch replace tags using Inventory manifest</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

前缀

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <PutObjectTagging>
            <TagSet>
                <Tag><Key>Environment</Key><Value>Production</Value></Tag>
                <Tag><Key>Team</Key><Value>DataOps</Value></Tag>
            </TagSet>
        </PutObjectTagging>
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>put-tag-job-001</ClientRequestToken>
    <KeyPrefixManifestGenerator>
        <SourceBucket>my-bucket</SourceBucket>
        <Prefix>documents/2024/</Prefix>
    </KeyPrefixManifestGenerator>
    <Description>Batch replace tags for documents</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

CSV 清单文件

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <PutObjectTagging>
            <TagSet>
                <Tag><Key>Environment</Key><Value>Production</Value></Tag>
                <Tag><Key>Team</Key><Value>DataOps</Value></Tag>
            </TagSet>
        </PutObjectTagging>
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>put-tag-job-001</ClientRequestToken>
    <Manifest>
        <Location>
            <ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
            <Bucket>my-bucket</Bucket>
            <Object>manifest.csv</Object>
        </Location>
        <Spec>
            <Fields>Bucket,Key</Fields>
            <Format>OSS_BatchOperations_CSV_20250611</Format>
        </Spec>
    </Manifest>
    <Description>Batch replace tags for specified objects</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

返回示例

<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
  <JobId>ODRiZWQ5Njc5ZTE0NDE5NTlmNjJmZDlkMTk2ODI2NDU=</JobId>
</CreateJobResult>

作业创建后会进入 Suspended(暂停)状态,查看作业状态确认配置无误后,再手动确认待执行作业

API

调用CreateJob接口创建批量作业,在XML配置的<Operation>节点中指定<PutObjectTagging>操作类型,通过<TagSet>定义新的标签集合来完全替换对象现有标签。

批量添加标签

批量添加标签操作会在对象现有标签基础上添加新标签,保留原有的所有标签,适用于标签补充场景。由于这是非原子性操作,在高并发场景下可能存在标签丢失的风险,建议避免与其他标签操作并发执行,确保数据一致性。

警告

如果有配置生命周期规则,且生命周期规则依赖批量添加标签的结果时,务必要检查批量添加标签的最终执行结果,一个作业执行完后,无论作业是执行中、完成、失败、暂停、还是取消状态,均有可能部分Object完成打标,部分Object打标失败,使用时请查询结果的成功数、失败数等信息,确保打标结果符合预期。

ossutil2.0

ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.com

存储空间清单文件

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <AddObjectTagging>
            <TagSet>
                <Tag><Key>Department</Key><Value>Engineering</Value></Tag>
                <Tag><Key>Project</Key><Value>BatchOps</Value></Tag>
            </TagSet>
        </AddObjectTagging>
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>add-tag-inventory-job-001</ClientRequestToken>
    <Manifest>
        <Location>
            <ETag>495B279A99C2BA72A66CA1E23B5FEA13</ETag>
            <Bucket>my-bucket</Bucket>
            <Object>inventory-reports/my-bucket/daily-inventory/2025-10-29T12-49Z/manifest.json</Object>
        </Location>
        <Spec>
            <Format>OSS_InventoryReport_CSV_20250611</Format>
        </Spec>
    </Manifest>
    <Description>Batch add tags using Inventory manifest</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

前缀

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <AddObjectTagging>
            <TagSet>
                <Tag><Key>Department</Key><Value>Engineering</Value></Tag>
                <Tag><Key>Project</Key><Value>BatchOps</Value></Tag>
            </TagSet>
        </AddObjectTagging>
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>add-tag-job-001</ClientRequestToken>
    <KeyPrefixManifestGenerator>
        <SourceBucket>my-bucket</SourceBucket>
        <Prefix>documents/2024/</Prefix>
    </KeyPrefixManifestGenerator>
    <Description>Batch add tags to documents</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

CSV 清单文件

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <AddObjectTagging>
            <TagSet>
                <Tag><Key>Department</Key><Value>Engineering</Value></Tag>
                <Tag><Key>Project</Key><Value>BatchOps</Value></Tag>
            </TagSet>
        </AddObjectTagging>
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>add-tag-job-001</ClientRequestToken>
    <Manifest>
        <Location>
            <ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
            <Bucket>my-bucket</Bucket>
            <Object>manifest.csv</Object>
        </Location>
        <Spec>
            <Fields>Bucket,Key</Fields>
            <Format>OSS_BatchOperations_CSV_20250611</Format>
        </Spec>
    </Manifest>
    <Description>Batch add tags to specified objects</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

返回示例

<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
  <JobId>Nzg5ZjE3ZTU5OGMxNDZjZDk0YjJiODMzZDZiZjA0ZmU=</JobId>
</CreateJobResult>

作业创建后会进入 Suspended(暂停)状态,查看作业状态确认配置无误后,再手动确认待执行作业

API

调用CreateJob接口创建批量作业,在XML配置的<Operation>节点中指定<AddObjectTagging>操作类型,通过<TagSet>定义新增的标签,系统会在保留现有标签的基础上添加新标签。

批量删除标签

批量删除标签操作会删除指定对象的所有标签,删除后对象的标签数量将变为0,适用于标签清理场景。

警告
  • 此操作是不可逆的,一旦执行就无法恢复被删除的标签,建议在生产环境执行前先在测试环境进行验证,确保不会影响业务逻辑。

  • 如果有配置生命周期规则,且生命周期规则依赖批量删除标签的结果时,务必要检查批量删除标签的最终执行结果,一个作业执行完后,无论作业是执行中、完成、失败、暂停、还是取消状态,均有可能部分Object完成标签删除,部分Object标签删除失败,使用时请查询结果的成功数、失败数等信息,确保标签删除结果符合预期。

ossutil2.0

ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.com

存储空间清单文件

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <DeleteObjectTagging />
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>delete-tag-inventory-job-001</ClientRequestToken>
    <Manifest>
        <Location>
            <ETag>495B279A99C2BA72A66CA1E23B5FEA13</ETag>
            <Bucket>my-bucket</Bucket>
            <Object>inventory-reports/my-bucket/daily-inventory/2025-10-29T12-49Z/manifest.json</Object>
        </Location>
        <Spec>
            <Format>OSS_InventoryReport_CSV_20250611</Format>
        </Spec>
    </Manifest>
    <Description>Batch delete tags using Inventory manifest</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

前缀

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <DeleteObjectTagging />
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>delete-tag-job-001</ClientRequestToken>
    <KeyPrefixManifestGenerator>
        <SourceBucket>my-bucket</SourceBucket>
        <Prefix>documents/2024/</Prefix>
    </KeyPrefixManifestGenerator>
    <Description>Batch delete tags for documents</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

CSV 清单文件

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <DeleteObjectTagging />
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>delete-tag-job-001</ClientRequestToken>
    <Manifest>
        <Location>
            <ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
            <Bucket>my-bucket</Bucket>
            <Object>manifest.csv</Object>
        </Location>
        <Spec>
            <Fields>Bucket,Key</Fields>
            <Format>OSS_BatchOperations_CSV_20250611</Format>
        </Spec>
    </Manifest>
    <Description>Batch delete tags for specified objects</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

返回示例

<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
  <JobId>NTVlYmQ4ZmQyOTM0NDJmY2E2NmNjYTUwNjU1ZGRkMGM=</JobId>
</CreateJobResult>

作业创建后会进入 Suspended(暂停)状态,查看作业状态确认配置无误后,再手动确认待执行作业

API

调用CreateJob接口创建批量作业,在XML配置的<Operation>节点中指定<DeleteObjectTagging/>操作类型(无需额外参数),系统会删除指定对象的所有标签。

批量修改权限

批量权限修改支持四种ACL类型:private(仅所有者可读写)、public-read(所有人可读仅所有者可写)、public-read-write(所有人可读写)和default(继承Bucket权限设置)。权限修改后会立即生效,直接影响对象的访问权限,请根据业务需求谨慎选择合适的权限类型。

ossutil2.0

ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.com

存储空间清单文件

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <PutObjectAcl>
            <ObjectAcl>public-read</ObjectAcl>
        </PutObjectAcl>
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>acl-inventory-job-001</ClientRequestToken>
    <Manifest>
        <Location>
            <ETag>495B279A99C2BA72A66CA1E23B5FEA13</ETag>
            <Bucket>my-bucket</Bucket>
            <Object>inventory-reports/my-bucket/daily-inventory/2025-10-29T12-49Z/manifest.json</Object>
        </Location>
        <Spec>
            <Format>OSS_InventoryReport_CSV_20250611</Format>
        </Spec>
    </Manifest>
    <Description>Batch change ACL using Inventory manifest</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

前缀

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <PutObjectAcl>
            <ObjectAcl>public-read</ObjectAcl>
        </PutObjectAcl>
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>acl-job-001</ClientRequestToken>
    <KeyPrefixManifestGenerator>
        <SourceBucket>my-bucket</SourceBucket>
        <Prefix>documents/2024/</Prefix>
    </KeyPrefixManifestGenerator>
    <Description>Batch change ACL to public-read for documents</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

CSV 清单文件

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <PutObjectAcl>
            <ObjectAcl>public-read</ObjectAcl>
        </PutObjectAcl>
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>acl-job-001</ClientRequestToken>
    <Manifest>
        <Location>
            <ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
            <Bucket>my-bucket</Bucket>
            <Object>manifest.csv</Object>
        </Location>
        <Spec>
            <Fields>Bucket,Key</Fields>
            <Format>OSS_BatchOperations_CSV_20250611</Format>
        </Spec>
    </Manifest>
    <Description>Batch change ACL to public-read for specified objects</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

返回示例

<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
  <JobId>YWNsR29iMTIzNDU2Nzg5MA==</JobId>
</CreateJobResult>

作业创建后会进入 Suspended(暂停)状态,查看作业状态确认配置无误后,再手动确认待执行作业

API

调用CreateJob接口创建批量作业,在XML配置的<Operation>节点中指定<PutObjectAcl>操作类型,通过<ObjectAcl>参数设置目标权限(private/public-read/public-read-write/default)。

批量数据解冻

批量解冻操作支持Archive、ColdArchive、DeepColdArchive三种归档存储类型的对象。Archive类型的对象解冻通常在1小时内完成,可保持1-7天的可访问状态。ColdArchive类型支持Standard模式(2-5小时完成)和Bulk模式(5-12小时完成)两种解冻速度。DeepColdArchive类型仅支持Standard模式,需要48小时内完成解冻。解冻天数可设置为1-365天范围内的任意值。

重要

如果操作的对象的存储类型和解冻模式或解冻天数不匹配,对应操作将会失败。

ossutil2.0

ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.com

存储空间清单文件

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <RestoreObject>
            <Days>7</Days>
            <Tier>Standard</Tier>
        </RestoreObject>
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>restore-inventory-job-001</ClientRequestToken>
    <Manifest>
        <Location>
            <ETag>495B279A99C2BA72A66CA1E23B5FEA13</ETag>
            <Bucket>my-bucket</Bucket>
            <Object>inventory-reports/my-bucket/daily-inventory/2025-10-29T12-49Z/manifest.json</Object>
        </Location>
        <Spec>
            <Format>OSS_InventoryReport_CSV_20250611</Format>
        </Spec>
    </Manifest>
    <Description>Batch restore using Inventory manifest for 7 days</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

前缀

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <RestoreObject>
            <Days>7</Days>
            <Tier>Standard</Tier>
        </RestoreObject>
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>restore-job-001</ClientRequestToken>
    <KeyPrefixManifestGenerator>
        <SourceBucket>my-bucket</SourceBucket>
        <Prefix>archive/2024/</Prefix>
    </KeyPrefixManifestGenerator>
    <Description>Batch restore archive objects for 7 days</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

CSV 清单文件

<CreateJobRequest>
    <ConfirmationRequired>true</ConfirmationRequired>
    <Operation>
        <RestoreObject>
            <Days>7</Days>
            <Tier>Standard</Tier>
        </RestoreObject>
    </Operation>
    <Report>
        <Bucket>my-bucket</Bucket>
        <Enabled>true</Enabled>
        <Prefix>batch-reports/</Prefix>
        <ReportScope>AllTasks</ReportScope>
    </Report>
    <ClientRequestToken>restore-job-001</ClientRequestToken>
    <Manifest>
        <Location>
            <ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
            <Bucket>my-bucket</Bucket>
            <Object>manifest.csv</Object>
        </Location>
        <Spec>
            <Fields>Bucket,Key</Fields>
            <Format>OSS_BatchOperations_CSV_20250611</Format>
        </Spec>
    </Manifest>
    <Description>Batch restore specified archive objects for 7 days</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>

返回示例

<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
  <JobId>cmVzdG9yZUpvYjEyMzQ1Njc4OTA=</JobId>
</CreateJobResult>

作业创建后会进入 Suspended(暂停)状态,查看作业状态确认配置无误后,再手动确认待执行作业

API

调用CreateJob接口创建批量作业,在XML配置的<Operation>节点中指定<RestoreObject>操作类型,通过<Days>设置解冻天数(1-365)和<Tier>设置解冻模式(Standard/Bulk)。

步骤四:作业管理与运维

查看作业状态

创建作业后,通过查询作业详细信息监控和确认作业状态。查看作业详情可以获取指定作业的完整状态信息,包括执行进度、配置参数等。

重要

作业状态为Complete并不代表所有对象都处理成功,仍需要查看详细报告来确认最终结果。

ossutil2.0

ossutil api invoke-operation --op-name describe-job --method GET --parameters batchJob --parameters batchJobId=<JobId> --endpoint oss-cn-hangzhou.aliyuncs.com

返回示例

<?xml version="1.0" encoding="UTF-8"?>
<DescribeJobResult>
  <Job>
    <ConfirmationRequired>true</ConfirmationRequired>
    <CreationTime>1761723644</CreationTime>
    <FailureReasons>
      <JobFailure />
    </FailureReasons>
    <JobId>M2E0ODMyNmJjYmYzNGY0ZThiYjMyMmI1ZDE1YWE0OGE=</JobId>
    <Operation>
      <PutObjectTagging>
        <TagSet>
          <Tag>
            <Key>Environment</Key>
            <Value>Production</Value>
          </Tag>
          <Tag>
            <Key>Team</Key>
            <Value>DataOps</Value>
          </Tag>
        </TagSet>
      </PutObjectTagging>
    </Operation>
    <Report>
      <Enabled>true</Enabled>
      <Bucket>my-bucket</Bucket>
      <Prefix>batch-reports/</Prefix>
      <ReportScope>AllTasks</ReportScope>
    </Report>
    <Manifest>
      <Location>
        <ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
        <Bucket>my-bucket</Bucket>
        <Object>manifest.csv</Object>
      </Location>
      <Spec>
        <Format>OSS_BatchOperations_CSV_20250611</Format>
        <Fields>Bucket,Key</Fields>
      </Spec>
    </Manifest>
    <Description>Test task for Suspended status</Description>
    <Priority>10</Priority>
    <RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
    <ProgressSummary>
      <NumberOfTasksFailed>0</NumberOfTasksFailed>
      <NumberOfTasksSucceeded>0</NumberOfTasksSucceeded>
      <TotalNumberOfTasks>3</TotalNumberOfTasks>
      <Timers>
        <ElapsedTimeInActiveSeconds>-1</ElapsedTimeInActiveSeconds>
      </Timers>
    </ProgressSummary>
    <Status>Suspended</Status>
    <TerminationDate>-1</TerminationDate>
  </Job>
</DescribeJobResult>

状态说明

  • ConfirmationRequired: true - 设置为需要确认

  • Status: Suspended - 作业已暂停,等待用户确认

  • TotalNumberOfTasks: 3 - 预计将处理 3 个对象

  • NumberOfTasksSucceeded: 0 - 尚未开始执行

  • ElapsedTimeInActiveSeconds: -1 - 尚未开始执行,因此执行时间为 -1

API

通过DescribeJob接口获取指定作业的详细信息,包括执行状态、进度统计、配置参数和错误信息。

确认待执行作业

Suspended状态转为Ready状态,作业进入执行队列。超过14天未确认将自动转为Failed。

ossutil2.0

ossutil api invoke-operation --op-name update-job-status --method POST --parameters batchJob --parameters batchJobId=<JobId> --parameters requestedJobStatus=Ready --endpoint oss-cn-hangzhou.aliyuncs.com

返回示例

<?xml version="1.0" encoding="UTF-8"?>
<UpdateJobStatusResult>
  <JobId>NGFhNmFmZDRlNTcxNDE2OGFhY2FjYWQyNDcxYjc3YzM=</JobId>
  <Status>Ready</Status>
</UpdateJobStatusResult>

API

通过UpdateJobStatus接口确认作业执行,将作业从Suspended状态转换为Ready状态,开始排队执行。

批量查询作业列表

查看所有作业。批量查询功能支持按作业状态和创建时间范围筛选作业列表,可以设置返回数量限制并支持分页查询,方便管理大量作业。查询结果默认按照创建时间倒序排列,最新创建的作业会显示在前面。

ossutil2.0

ossutil api invoke-operation --op-name list-jobs --method GET --parameters batchJob --parameters maxKeys=100 --endpoint oss-cn-hangzhou.aliyuncs.com

返回示例

<?xml version="1.0" encoding="UTF-8"?>
<ListJobsResult>
  <Jobs>
    <Job>
      <JobId>OTE5ZGU1NWMxNjkyNGFkMjhkYTNmOGEzNTU2YmJiOWE=</JobId>
      <Status>Complete</Status>
      <CreationTime>1761666548</CreationTime>
    </Job>
  </Jobs>
</ListJobsResult>

API

通过ListJobs接口查询账号下的批量作业列表,支持按状态、时间范围筛选和分页查询,便于作业管理和监控。

调整作业优先级

优先级范围0-2147483647,数值越大优先级越高。高优先级作业可抢占低优先级作业资源。作业优先级不能保证绝对的作业执行顺序,OSS 只能尽力给高优先级作业倾斜更多资源。

ossutil2.0

ossutil api invoke-operation --op-name update-job-priority --method POST --parameters batchJob --parameters batchJobId=<JobId> --parameters priority=1000 --endpoint oss-cn-hangzhou.aliyuncs.com

返回示例

<?xml version="1.0" encoding="UTF-8"?>
<UpdateJobPriorityResult>
  <JobId>OTE5ZGU1NWMxNjkyNGFkMjhkYTNmOGEzNTU2YmJiOWE=</JobId>
  <Priority>1000</Priority>
</UpdateJobPriorityResult>

API

通过UpdateJobPriority接口调整作业的执行优先级,实现资源调度和紧急作业处理,高优先级作业可抢占资源。

取消作业

终止正在执行或等待执行的作业。已处理的对象无法回滚。

ossutil2.0

ossutil api invoke-operation --op-name update-job-status --method POST --parameters batchJob --parameters batchJobId=<JobId> --parameters requestedJobStatus=Cancelled --endpoint oss-cn-hangzhou.aliyuncs.com

返回示例

<?xml version="1.0" encoding="UTF-8"?>
<UpdateJobStatusResult>
  <JobId>OTE5ZGU1NWMxNjkyNGFkMjhkYTNmOGEzNTU2YmJiOWE=</JobId>
  <Status>Cancelled</Status>
</UpdateJobStatusResult>

API

通过UpdateJobStatus接口将作业状态设置为Cancelled,停止作业执行并释放资源。

故障排查

常见失败原因
  • AccessDenied:IAM角色权限不足,需检查权限配置

  • InvalidManifest:清单文件格式错误或ETag不匹配

  • InvalidArgument:操作参数不符合要求(如标签格式、ACL类型)

  • NoSuchBucket:目标Bucket不存在或无访问权限

  • TooManyRequests:并发作业超限,等待其他作业完成

故障诊断步骤
  1. 检查作业状态:DescribeJob 获取详细错误信息

  2. 下载执行报告:查看具体失败对象和错误码

  3. 验证权限配置:确认IAM角色具备所需权限

  4. 检查输入数据:验证清单文件格式和对象存在性

作业状态说明

状态

说明

注意事项

下一步操作

New

作业刚创建,正在初始化

-

等待进入 Preparing 状态

Preparing

正在解析清单文件和验证配置

-

自动进入 Suspended 或 Active

Suspended

待用户确认执行

超过14天未确认将自动转为 Failed 状态

调用 update-job-status 确认

Ready

准备就绪,等待执行

-

等待调度器分配资源

Active

正在执行中

-

监控进度,等待完成

Paused

被高优先级作业抢占而暂停

可能有部分对象已处理成功

等待恢复执行

Completing

任务即将完成,正在生成报告

-

等待进入 Complete 状态

Complete

执行完成

仅表示作业完成,不代表所有对象都成功处理,需查看执行报告确认详情

查看报告文件分析结果

Cancelling

正在取消中

可能有部分对象在取消前已处理成功

等待进入 Cancelled 状态

Cancelled

已取消

可能有部分对象在取消前已处理成功

查看报告了解已处理的对象

Failing

正在失败中

可能有部分对象在失败前已处理成功

等待进入 Failed 状态

Failed

执行失败

可能有部分对象在失败前已处理成功

查看失败原因,修复后重新创建作业

应用于生产环境

最佳实践

  • 作业规划策略:将单作业对象数控制在1亿以内确保执行稳定性,大规模数据拆分为多个作业降低单点风险,设置合理的作业优先级避免重要作业被阻塞,预估执行时间合理安排维护窗口。多作业并发操作同一批对象时执行顺序不确定,建议避免并发操作同一对象。

  • 性能优化措施:合理组织清单文件结构避免单文件过大影响解析速度,充分利用独立QPS配额的优势不影响业务API调用,同时运行作业数控制在3个以内避免资源竞争。

  • 错误处理机制:启用详细报告(ReportScope=AllTasks)获取完整执行结果用于问题定位。

  • 结果确认要点:一个作业执行完后,无论作业是执行中、完成、失败、暂停、还是取消状态,均有可能部分Object完成指定操作,部分Object执行指定操作失败,使用时请查询结果的成功数、失败数等信息,确保执行指定操作的结果符合预期。

  • 失败处理建议:Complete状态仅表示作业完成,不代表所有对象成功处理,必须查看执行报告确认详情。针对失败任务分析失败原因并重试,部分失败的作业可基于失败报告创建重试作业,Cancelled、Paused、Failed状态作业可能已有部分对象处理成功需要核对。

资源调度机制

  • 独立QPS配额:使用独立1QPS配额,不占用业务QPS

  • 优先级调度:支持0-2147483647优先级,高优先级作业抢占低优先级作业资源

  • 并发控制:单账号最多6个并发作业,超出进入等待队列

容错策略

  • 权限验证:作业创建前验证源路径访问权限避免执行中断,确保IAM角色具有目标操作的完整权限链,定期轮换IAM角色AccessKey提升安全性。

  • 数据保护:执行批量删除或覆盖操作前创建数据快照或备份,为重要数据启用版本控制提供多版本保护,在测试环境验证操作逻辑确认无误后再在生产环境执行。

  • 监控告警:配置作业状态变更事件通知及时掌握执行情况,监控作业执行时间发现异常长时间运行作业,设置失败率阈值告警快速响应异常情况。

成本控制

  • 计费方式:采用按处理对象数量计费模式,1元/100万对象,无任务创建费用,仅按实际处理对象数量付费,相比逐个对象调用API可节省90%以上操作成本。

  • 优化建议:充分利用6个并发作业限额避免资源空闲,定期删除历史作业报告节省存储成本,及时清理测试作业避免不必要的费用支出。

配额与限制

项目

限制

单账号并发作业数

6

单账号排队作业数

1万个/地域

单作业最大对象数

100亿个

清单文件最大大小

10TB

单账号日处理对象数

8.6亿个/地域

作业历史保留期

90天或10万条

计费说明

OSS批量操作采用按量付费模式,按处理对象数量计费1元/100万对象,不收取作业创建和管理费用,不产生额外数据传输费用。

重要

对文件进行操作会产生 OSS标准 API 费用收取。例如:打标操作,会收取 PUT类型请求费用。

计费示例

  • 批量标签操作500万对象:500万 ÷ 100万 × 1元 = 5

  • 大规模数据处理50亿对象:50亿 ÷ 100万 × 1元 = 5,000

费用优化建议:合并相关批量操作到单个作业减少管理开销,使用精确前缀或清单文件避免处理不必要对象,非紧急批量操作安排在业务低峰期执行。

常见问题

作业提交后长时间处于Preparing状态?

可能原因包括:

  • 清单文件过大,解析时间较长

  • 前缀扫描涉及对象数量过多

  • 系统负载较高,处理队列繁忙

建议:将大作业拆分为多个小作业,或使用预生成的清单文件。

部分对象处理失败如何处理?

处理步骤:

  1. 下载作业执行报告,分析失败原因

  2. 根据失败对象列表创建新的重试作业

  3. 检查权限配置是否正确,确保IAM角色具有完整权限

如何取消正在执行的作业?

使用以下命令:

POST /?batchJobStatus&batchJobId=<JobId>&requestedJobStatus=Cancelled&statusUpdateReason=用户主动取消 HTTP/1.1
Host: oss-cn-hangzhou.aliyuncs.com
Authorization: <签名信息>

提示权限不足错误?

检查权限配置:

  1. 确保RAM用户具有oss:CreateBatchJob权限

  2. 检查IAM角色是否包含操作所需具体权限

  3. 验证跨桶操作时目标桶权限设置

IAM角色配置要求?

IAM角色必须包含:

  • OSS资源读写权限

  • 批量操作API调用权限

  • 报告存储空间写入权限

信任策略示例:

{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "Service": ["oss.aliyuncs.com"]
      }
    }
  ]
}

如何提高批量操作执行速度?

优化建议:

  1. 合理组织清单文件,避免过大单文件

  2. 避免业务高峰期执行大型作业

  3. 分配作业优先级,确保重要作业优先执行

  4. 单作业对象数不要过多,避免作业运行时间过长,建议控制在1亿以内

  5. 避免将大作业拆分成过多小作业(比如:100 万对象拆成 1000 个作业),减少任务调度消耗的时间

作业执行时间比预期长?

可能原因:

  • 对象分布不均,某些分片处理时间较长

  • 源对象或目标对象存在热点,影响处理速度

  • 同时运行作业过多,资源竞争激烈

建议调整作业调度策略或降低并发作业数量。