開發與維運

OSS刪除bucket報錯Bucket不為空的排查方案

背景

用戶在使用OSS服務中對於不需要的bucket在清除時候
如果存儲空間不為空則存儲空間無法刪除,必須刪除存儲空間中的所有文件、未完成的分片文件、存在的livechannel以及多版本數據,存儲空間才能成功刪除,下面會對於這四個因素來進行介紹查看和刪除的方法。
image.png
本文使用的工具ossutil來進行操作。
注意:刪除數據和bucket是不可逆的操作,確認bucket沒有關鍵數據後再進行刪除

存儲文件和碎片查看和刪除

查看bucket數據和碎片簡單的方法是可以通過控制檯查看下bucket中是否有存在文件,如果有可以使用控制檯刪除或者是工具ossuti刪除
image.png
工具ossutil刪除文件和碎片並刪除bucket,命令如下

./ossutil rm oss://bucket1 -bar

如果指定以上操作再刪除bucket的時候還是報錯bucekt不為空,無法刪除則繼續排查多版本。

Bucket多版本查看和刪除

多版本的作用是針對數據的覆蓋和刪除操作將會以歷史版本的形式保存下來。通過文件(Object)的版本控制,在錯誤覆蓋或者刪除Object後,能夠將Bucket中存儲的Object恢復至任意時刻的歷史版本,但是控制檯和工具查看(不指定版本號的查詢)只顯示最新數據,歷史版本不顯示的。

  1. 查看是否開啟版本控制
    image.png

2.命令查看
可以使用ousstil工具來查看
image.png
如果bucket是開啟了版本控制功能,可以直接刪除bucket中數據的版本數據,ossutil刪除多版本命令

./ossutil rm oss://bucket1/ --all-versions -r

image.png
執行完以上操作後可以嘗試刪除bucket測試是否可以刪除成功,如果還是報錯bucket不為空,則排查bucket的Livechannel

Bucket查看和刪除LiveChannel

目前對於bucket的LiveChannel查看和刪除還未有工具和控制檯的查看方法可以使用接口或者是SDK來實現操作,如下代碼

至此涉及到所有的數據全部被清理,可以直接對於該bucket進行刪除操作。


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;

public class DeleteLiveChannel {
     private static String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
     // 阿里雲主賬號 AccessKey 擁有所有 API 的訪問權限,風險很高。
     // 強烈建議您創建並使用 RAM 賬號進行 API 訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建 RAM 賬號。
     private static String accessKeyId = "xx";
     private static String accessKeySecret = "xx";
     private static String bucketName = "bucktname";
    
    public static void createLiveChannel() {

        // 創建 OSSClient 實例。
        String liveChannelName = "liveChannelName1";
        OSS oss = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        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, accessKeyId, accessKeySecret);

        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, accessKeyId, accessKeySecret);
        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();
    }

}

Leave a Reply

Your email address will not be published. Required fields are marked *