删除存储空间以停止计费

重要

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

当存储空间(Bucket)不再需要或希望停止计费时,应删除该Bucket。由于OSS的费用主要来源于Bucket内部资源,而删除Bucket前系统强制要求清空所有内部资源,因此删除Bucket是确保您不会遗漏任何计费资源而产生意外费用的最可靠方式。请注意,删除后数据无法恢复,且Bucket名称释放后存在被他人占用的风险。若要完全停用整个OSS服务,则需删除您账号下的所有Bucket。

image

删除前必读

关键风险提醒

风险类型

说明

预防措施

数据不可恢复

删除后所有数据永久丢失

重要数据必须提前备份

名称占用风险

删除后4-8小时内名称可能被他人占用

如需保留名称,建议清空Bucket内容而非删除Bucket

业务中断风险

正在使用的应用可能受影响

确认无业务依赖后在操作

同步删除风险

Bucket 配置了增/删/改同步的跨/同区域复制规则,目标Bucket也会同步删除文件

检查复制配置,确认影响范围

安全检查清单

在执行删除前,请确认以下事项:

  • 数据备份:重要数据已完成备份并验证可用性

  • 业务确认:确认没有应用或服务正在使用此Bucket

  • 权限验证:确认当前用户具有删除权限

  • 团队通知:已通知相关团队成员此删除操作

  • 时间选择:选择合适的维护时间窗口执行

检查必须删除的资源

如果Bucket中残留文件碎片接入点加速器RTMP推流地址等一种或多种必须删除的资源没有清理,在删除 Bucket 时将出现“存储空间不为空”的报错。建议使用 OSS 控制台删除向导,自动扫描并列出所有待清理项。

  1. 登录OSS管理控制台

  2. 单击Bucket 列表,然后单击目标Bucket名称。

  3. 下滑左侧导航栏至底部,单击删除Bucket

  4. 删除Bucket页面,可以看到检测出的待清理项。

    image

清理必须删除的资源

根据系统检测出的资源类型进行清理。文件量较大时,推荐使用生命周期规则自动处理。

清理文件

文件资源的状态列提示已开启 HDFS 功能,请先清理HDFS 文件。若已开启版本控制,OSS文件列表会同时显示当前版本与历史版本,因此执行全选删除时会一并删除所有版本文件。

OSS文件

使用OSS控制台

  1. 删除Bucket页面的清空任务区域,找到文件资源项,单击前往删除

  2. 选中所有Object,单击下方的彻底删除

  3. 在弹出的对话框中,单击确定

使用ossutil

删除该bucket下所有文件(包括当前版本和历史版本)

ossutil rm oss://examplebucket/ -r

更多示例,请参见rm(删除)

HDFS文件

通过OSS控制台的方式

  1. 文件资源的状态列单击立即暂停,停止HDFS后台任务。

  2. 单击前往删除,进入HDFS页签。

  3. 逐个单击彻底删除,直至清空所有HDFS文件。

通过HDFS Shell命令的方式

hdfs dfs -rm -r -skipTrash oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/*

更多信息,请参见通过HDFS Shell命令执行OSS-HDFS服务快速入门常见操作。

清理碎片

使用OSS控制台

  1. 删除Bucket页面的清空任务区域,找到碎片资源项,单击前往删除

  2. 文件列表页面,单击碎片管理

  3. 碎片管理(Multipart)面板,单击删除所有

  4. 在弹出的对话框中,单击确定

使用ossutil

删除未完成或未取消上传的所有分片碎片。

ossutil rm oss://examplebucket -m -r -f

更多信息,请参见rm(删除)

清理接入点

  1. 删除Bucket页面的清空任务区域,找到接入点资源项,单击前往删除

  2. 逐个单击删除接入点

  3. 按指引删除对应访问策略。

  4. 删除访问策略后,回到接入点列表。按页面引导输入接入点名称,单击确定完成删除。

清理加速器

请注意,删除加速器仅会清除加速器内缓存的数据,存储在OSS桶中的数据不会受到影响。

  1. 删除Bucket页面的清空任务区域,找到加速器资源项,单击前往删除

  2. OSS加速器列表操作列单击删除按钮。

  3. 按页面引导输入加速器名称,单击确定完成删除。

    image

清理RTMP推流地址

BucketLiveChannel查看和删除暂不支持通过工具和控制台操作,可以使用接口或者是SDK来实现操作,请参见DeleteLiveChannel,删除指定的LiveChannel。示例代码如下:

import java.util.List;
import com.alibaba.fastjson.JSON;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CreateLiveChannelRequest;
import com.aliyun.oss.model.CreateLiveChannelResult;
import com.aliyun.oss.model.ListLiveChannelsRequest;
import com.aliyun.oss.model.LiveChannelGenericRequest;
import com.aliyun.oss.model.LiveChannelListing;
import com.aliyun.oss.model.LiveChannelStatus;
import com.aliyun.oss.model.LiveChannelTarget;
import com.aliyun.oss.model.LiveChannel;
import com.aliyun.oss.common.auth.*;

public class DeleteLiveChannel {
    private static String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    
private static final/**
     * 通过环境变量获取访问凭证
     */private static final EnvironmentVariableCredentialsProvider CREDENTIALS_PROVIDER = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

    private static String bucketName = "bucktname";
    
    public static void createLiveChannel() {

        // 创建OSSClient实例。// 当OSSClient实例不再使用时,调用shutdown方法以释放资源。String liveChannelName = "liveChannelName1";
        OSS oss = new OSSClientBuilder().build(endpoint, CREDENTIALS_PROVIDER);
        CreateLiveChannelRequest request = new CreateLiveChannelRequest(bucketName,
                liveChannelName, "desc", LiveChannelStatus.Enabled, new LiveChannelTarget());
        CreateLiveChannelResult result = oss.createLiveChannel(request);

        //获取推流地址。
        List<String> publishUrls = result.getPublishUrls();
        for (String item : publishUrls) {
            System.out.println(item);
        }

        //获取播放地址。
        List<String> playUrls = result.getPlayUrls();
        for (String item : playUrls) {
            System.out.println(item);
        }

        oss.shutdown();
    }
    public static void listLiveChannels() {
       

        // 创建OSSClient实例。OSS oss = new OSSClientBuilder().build(endpoint, CREDENTIALS_PROVIDER);

        ListLiveChannelsRequest request = new ListLiveChannelsRequest(bucketName);
        LiveChannelListing liveChannelListing = oss.listLiveChannels(request);
        List<LiveChannel> list = liveChannelListing.getLiveChannels();
        for(LiveChannel i:list){
            deleteLiveChannel(i.getName());
        }
        oss.shutdown();
    }
    public static void deleteLiveChannel(String liveChannelName) {

        // 创建OSSClient实例。OSS oss = new OSSClientBuilder().build(endpoint, CREDENTIALS_PROVIDER);
        LiveChannelGenericRequest request = new LiveChannelGenericRequest(bucketName, liveChannelName);
        System.out.println("Delete liveChanne "+liveChannelName+" Done");
        try {
            oss.deleteLiveChannel(request);
        } catch (OSSException ex) {
            ex.printStackTrace();
        } catch (ClientException ex) {
            ex.printStackTrace();
        } finally {
            oss.shutdown();
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        DeleteLiveChannel.listLiveChannels();
    }

}

删除Bucket

清空Bucket内的必删资源,才能删除Bucket本身。

使用OSS控制台

  1. 返回目标 Bucket 的删除 Bucket页面。

  2. 单击立即删除,按页面引导输入Bucket名称,单击确定完成删除。

ossutil

以下命令用于删除存储空间examplebucket

ossutil api delete-bucket --bucket examplebucket

更多信息,请参见delete-bucket

OSS SDK

以下仅列举常见SDK的删除Bucket的代码示例。关于其他SDK的删除Bucket的代码示例,请参见SDK简介

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
        String region = "cn-hangzhou";

        // 创建OSSClient实例。
        // 当OSSClient实例不再使用时,调用shutdown方法以释放资源。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // 删除存储空间。
            ossClient.deleteBucket(bucketName);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
} 

Node.js

const OSS = require('ali-oss');

const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'yourregion',
  // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // yourBucketName填写Bucket名称。
  bucket: 'yourBucketName',
});

async function deleteBucket() {
  try {
    // 指定存储空间名称。
    const result = await client.deleteBucket('yourbucketname');
    console.log(result);
  } catch (err) {
    console.log(err);
  }
}

deleteBucket();

.NET

using System;
using Aliyun.OSS;
using Aliyun.OSS.Common;


namespace Samples
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
            var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
            // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
            var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
            var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
            // 填写Bucket名称,例如examplebucket。
            var bucketName = "examplebucket314";
            // 填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为cn-hangzhou。
            const string region = "cn-hangzhou";
            // 创建ClientConfiguration实例,按照您的需要修改默认参数。
            var conf = new ClientConfiguration();
            // 设置v4签名。
            conf.SignatureVersion = SignatureVersion.V4;

            // 创建OssClient实例。
            var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
            client.SetRegion(region);
            
            try
            {
                client.DeleteBucket(bucketName);

                Console.WriteLine("Delete bucket succeeded");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Delete bucket failed. {0}", ex.Message);
            }
        }
    }
}

Android

DeleteBucketRequest deleteBucketRequest = new DeleteBucketRequest("bucketName");

// 异步删除存储空间。
OSSAsyncTask deleteBucketTask = oss.asyncDeleteBucket(deleteBucketRequest, new OSSCompletedCallback<DeleteBucketRequest, DeleteBucketResult>() {
    @Override
    public void onSuccess(DeleteBucketRequest request, DeleteBucketResult result) {
        Log.d("asyncDeleteBucket", "Success!");
    }
    @Override
    public void onFailure(DeleteBucketRequest request, ClientException clientException, ServiceException serviceException) {
        // 请求异常。
        if (clientException != null) {
            // 本地异常,如网络异常等。
            clientException.printStackTrace();
        }
        if (serviceException != null) {
            // 服务异常。
            Log.e("ErrorCode", serviceException.getErrorCode());
            Log.e("RequestId", serviceException.getRequestId());
            Log.e("HostId", serviceException.getHostId());
            Log.e("RawMessage", serviceException.getRawMessage());
        }
    }
});

iOS

OSSDeleteBucketRequest * delete = [OSSDeleteBucketRequest new];
// 填写存储空间名称,例如examplebucket。
delete.bucketName = @"examplebucket";
OSSTask * deleteTask = [client deleteBucket:delete];
[deleteTask continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        NSLog(@"delete bucket success!");
    } else {
        NSLog(@"delete bucket failed, error: %@", task.error);
    }
    return nil;
}];
// 实现同步阻塞等待任务完成。
// [getdeleteTask waitUntilFinished];

C++

#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /*初始化OSS账号信息。*/
    
    /*yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    
    / *yourRegion填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为cn - hangzhou。 * /
    std::string Region = "yourRegion";
    
    /*填写Bucket名称,例如examplebucket。*/
    std::string BucketName = "examplebucket";

    /*初始化网络等资源。*/
    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);

    /*删除Bucket。*/
    DeleteBucketRequest request(BucketName);
   
    auto outcome = client.DeleteBucket(request);

    if (outcome.isSuccess()) {
    std::cout << "Delete bucket successfully." << std::endl;
    } else {
    std::cout << "Failed to delete bucket. Error code: " << outcome.error().Code()
              << ", Message: " << outcome.error().Message()
              << ", RequestId: " << outcome.error().RequestId() << std::endl;
    }

    /*释放网络等资源。*/
    ShutdownSdk();
    return 0;
}

C

#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";

/* 填写Bucket名称,例如examplebucket。*/
const char *bucket_name = "examplebucket";
/* yourRegion填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为cn-hangzhou。*/
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
    options->config = oss_config_create(options->pool);
    /* 用char*类型的字符串初始化aos_string_t类型。*/
    aos_str_set(&options->config->endpoint, endpoint);
    /* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/    
    aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
    aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
    //需要额外配置以下两个参数
    aos_str_set(&options->config->region, region);
    options->config->signature_version = 4;
    /* 是否使用CNAME域名访问OSS服务。0表示不使用。*/
    options->config->is_cname = 0;
    /* 设置网络相关参数,比如超时时间等。*/
    options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
    /* 在程序入口调用aos_http_io_initialize方法来初始化网络、内存等全局资源。*/
    if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
        exit(1);
    }
    /* 用于内存管理的内存池(pool),等价于apr_pool_t。其实现代码在apr库中。*/
    aos_pool_t *pool;
    /* 重新创建一个内存池,第二个参数是NULL,表示没有继承其它内存池。*/
    aos_pool_create(&pool, NULL);
    /* 创建并初始化options,该参数包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全局配置信息。*/
    oss_request_options_t *oss_client_options;
    /* 在内存池中分配内存给options。*/
    oss_client_options = oss_request_options_create(pool);
    /* 初始化Client的选项oss_client_options。*/
    init_options(oss_client_options);
    /* 初始化参数。*/
    aos_string_t bucket;
    aos_table_t *resp_headers = NULL; 
    aos_status_t *resp_status = NULL; 
    /* 将char*类型数据赋值给aos_string_t类型的存储空间。*/
    aos_str_set(&bucket, bucket_name);
    /* 删除存储空间。*/
    resp_status = oss_delete_bucket (oss_client_options, &bucket, &resp_headers);
    if (aos_status_is_ok(resp_status)) {
        printf("delete bucket succeeded\n");
    } else {
        printf("delete bucket failed\n");
    }
    /* 释放内存池,相当于释放了请求过程中各资源分配的内存。*/
    aos_pool_destroy(pool);
    /* 释放之前分配的全局资源。*/
    aos_http_io_deinitialize();
    return 0;
}

Ruby

require 'aliyun/oss'

client = Aliyun::OSS::Client.new(
  # Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
  endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
  # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  access_key_id: ENV['OSS_ACCESS_KEY_ID'],
  access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# 填写Bucket名称,例如examplebucket。
client.delete_bucket('examplebucket')

Go

package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string
	bucketName string
)

func init() {
	// 定义命令行参数,用于指定区域和存储空间名称
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}

func main() {
	// 解析命令行参数
	flag.Parse()

	// 检查存储空间名称参数是否为空
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 检查区域参数是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建OSS客户端
	client := oss.NewClient(cfg)

	// 创建删除存储空间请求对象
	request := &oss.DeleteBucketRequest{
		Bucket: oss.Ptr(bucketName),
	}

	// 调用DeleteBucket方法删除存储空间
	result, err := client.DeleteBucket(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to delete bucket %v", err)
	}

	// 打印删除结果
	log.Printf("delete bucket result:%#v\n", result)
}

Python

import argparse
import alibabacloud_oss_v2 as oss

# 创建命令行参数解析器,描述此脚本用于删除指定的OSS Bucket。
parser = argparse.ArgumentParser(description="Delete a specified OSS bucket.")

# 添加命令行参数 --region,表示存储空间所在的区域,必需参数
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)

# 添加命令行参数 --bucket,表示存储空间的名称,必需参数
parser.add_argument('--bucket', help='The name of the bucket to delete.', required=True)

# 添加命令行参数 --endpoint,表示其他服务可用来访问OSS的域名,非必需参数
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS.')

def main():
    """
    主函数,用于解析命令行参数并执行删除指定Bucket的操作。
    """

    args = parser.parse_args()  # 解析命令行参数

    # 从环境变量中加载凭证信息,用于身份验证
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK的默认配置,并设置凭证提供者和区域信息
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region

    # 如果提供了endpoint参数,则设置配置中的endpoint
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)

    # 构造请求以删除指定的Bucket
    request = oss.DeleteBucketRequest(bucket=args.bucket)
   
    try:
        # 发送请求并获取响应结果
        result = client.delete_bucket(request)

        # 打印响应结果的状态码和请求ID
        print(f'status code: {result.status_code},'
              f' request id: {result.request_id}')
    except oss.exceptions.OssError as e:
        # 捕获并打印可能发生的异常
        print(f"Failed to delete bucket: {e}")

if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数
  

PHP

<?php

require_once __DIR__ . '/../vendor/autoload.php'; // 引入自动加载文件,加载依赖库

use AlibabaCloud\Oss\V2 as Oss;

// 定义命令行参数描述
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located.', 'required' => True], // 区域是必填项,存储空间所在的区域,例如 oss-cn-hangzhou。
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // 终端节点是可选项,其他服务可以用来访问OSS的域名。
    "bucket" => ['help' => 'The name of the bucket', 'required' => True], // 存储空间名称是必填项。
];
$longopts = \array_map(function ($key) {
    return "$key:"; // 每个参数后面加冒号,表示需要值
}, array_keys($optsdesc));

// 解析命令行参数
$options = getopt("", $longopts); 

// 检查必填参数是否缺失
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help"; // 提示用户缺少必填参数
        exit(1); 
    }
}

// 获取命令行参数值
$region = $options["region"]; // 存储空间所在区域。
$bucket = $options["bucket"]; // 存储空间名称。

// 使用环境变量加载凭证信息(AccessKeyId 和 AccessKeySecret)
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider(); 

// 使用SDK的默认配置
$cfg = Oss\Config::loadDefault(); // 加载SDK的默认配置。
$cfg->setCredentialsProvider($credentialsProvider); // 设置凭证提供者。
$cfg->setRegion($region); // 设置区域。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // 如果提供了终端节点,则设置终端节点。
}

// 创建OSS客户端实例
$client = new Oss\Client($cfg); 

// 创建删除存储空间的请求对象
$request = new Oss\Models\DeleteBucketRequest($bucket); 

// 调用deleteBucket方法删除存储空间
$result = $client->deleteBucket($request); 

// 打印返回结果
printf(
    'status code:' . $result->statusCode . PHP_EOL . // HTTP响应状态码。
    'request id:' . $result->requestId // 请求的唯一标识。
);

自动清理海量文件和碎片

Bucket内文件量极大,手动清理耗时过长,可配置生命周期规则让系统自动清理。请注意,文件删除操作不可逆,操作前务必谨慎。如对生命周期规则不熟悉,建议先在测试Bucket中进行验证。

Bucket未开启版本控制

对于未开启版本控制的Bucket,只需要配置一条生命周期规则,即可自动快速清理所有文件和碎片(Multipart Upload产生的未合并碎片)。

  1. 登录OSS管理控制台的Bucket列表页面,找到目标Bucket。

  2. 在左侧导航栏,选择数据安全 > 版本控制,确认Bucket未开启版本控制。

    未开启版本控制

  3. 在左侧导航栏,选择数据管理 > 生命周期,设置生命周期规则,指定Bucket内所有文件在最后一次修改后1天自动删除,同时对生成时间早于1天的文件碎片,自动执行清理操作。

    screenshot_2025-07-01_17-59-32

Bucket已开启版本控制

Bucket开启版本控制后,会产生当前版本文件、历史版本文件、碎片文件和删除标记。只需要配置一条生命周期规则,即可自动快速清理这些文件。

  1. 登录OSS管理控制台的Bucket列表页面,找到目标Bucket。

  2. 在左侧导航栏,选择数据安全 > 版本控制,确认Bucket已开启版本控制。

    screenshot_2025-07-02_10-58-23

  3. 在左侧导航栏,选择数据管理 > 生命周期,设置生命周期规则,指定Bucket内所有当前版本、历史版本文件在最后一次修改后1天自动删除,同时对生成时间早于1天的文件碎片,自动执行清理操作。该规则会同步清理删除标记。

    screenshot_2025-07-02_10-58-23

常见问题

删除时提示“Bucket不为空”怎么办?

Bucket内还有资源未清理。建议通过OSS控制台查看当前剩余资源,然后参照清理必须删除的资源进行清理,清理完毕后重试删除Bucket。

删除后如何立即重建同名Bucket?

删除Bucket后,Bucket名称在删除后有4-8小时的冷却期,无法立即同名重建。如果业务紧急,请使用新的Bucket名称。

冷却期结束后,任何用户都可以创建该名称的Bucket。如果未及时重新创建,存在被其他用户抢先注册的风险。

如何批量删除多个Bucket?

警告

批量删除是一项高风险操作,可能导致大量数据永久丢失。执行前,请务必再三确认待删除的Bucket列表,并完成所有必要的数据备份。

控制台不提供批量删除功能,您需要通过编写自动化脚本(如Shell、Python等)并结合ossutil命令行工具来完成。

其核心实现原理如下:

  1. 准备清单:创建一个准确无误的、包含所有待删除Bucket名称的文本文件或列表。

  2. 循环执行:您的脚本需要遍历这个清单,对每一个Bucket名称执行以下两个关键步骤。

    1. 清空资源:为当前Bucket调用ossutil的清空命令。

    2. 删除空Bucket:在确认上一步成功后,再调用ossutil的删除Bucket命令。

删除时提示“权限不足”怎么办?

删除Bucket前需先清理内部资源,清理过程中涉及列举(list)和删除(delete)等多项权限,建议联系管理员一次性为您的RAM身份授予AliyunOSSFullAccess权限,避免因权限点遗漏导致删除失败。

如何彻底停止OSS计费?

删除您账号下所有的Bucket。

误删除Bucket后是否可以恢复?

不能。 删除操作不可逆,请务必先备份再删除。