全部產品
Search
文件中心

Object Storage Service:雲盒版本控制

更新時間:Aug 08, 2025

版本控制是針對雲盒Bucket的資料保護功能。開啟版本控制後,針對資料的覆蓋和刪除操作將會以歷史版本的形式儲存下來。您在錯誤覆蓋或者刪除對象(Object)後,能夠將Bucket中儲存的Object恢複至任意時刻的歷史版本。

前提條件

  • 華東1(杭州)、華東2(上海)、華南1(深圳)、華南2(河源)、華北2(北京)、西南1(成都)地區支援使用OSS ON雲盒服務。

  • 購買雲盒

  • 已在雲盒內建立Virtual Private Cloud和交換器

  • 已聯絡支援人員申請建立雲盒VPC內網SingleTunnel網路類型。

使用情境

建議您在以下情境中使用版本控制,為您的資料安全提供更好的保障。

  • 資料誤刪除

    當前OSS不提供資源回收筒功能。您刪除OSS資料後想要找回時,可使用版本控制功能,恢複已刪除的資料。

  • 檔案被覆蓋

    對於網盤、線上協作類產品,檔案會被頻繁修改,針對檔案的編輯會產生大量的臨時版本。您可以使用版本控制功能找回某個時間點的版本。

注意事項

  • 許可權說明

    只有雲盒Bucket的擁有者及授予了oss-cloudbox:PutBucketVersioning許可權的RAM使用者才能配置版本控制。

  • 功能互斥

    如果Bucket已開啟版本控制,上傳檔案時附加的覆蓋同名檔案要求標頭x-oss-forbid-overwrite將不生效。更多資訊,請參見要求標頭

版本控制狀態

Bucket包含三種版本控制狀態,分別為未開啟、開啟或者暫停。

  • 預設情況下,Bucket版本控制狀態為“未開啟”。一旦Bucket處於“開啟”版本狀態,將無法返回至“未開啟”狀態。但是,您可以暫停Bucket的版本控制狀態。

  • 當Bucket版本控制處於“開啟”狀態時,OSS將為新上傳的Object產生全域唯一的隨機字串版本ID。

  • 當Bucket版本控制處於“暫停”狀態時,OSS將為新上傳的Object產生特殊字元串為“null”的版本ID。

說明

當雲盒Bucket版本控制處於“開啟”狀態時,由於Object的每個版本都被儲存下來,每個版本都會佔用儲存空間。建議結合您的使用情境通過生命週期規則刪除不再需要的歷史版本。

資料保護

以下表格詳細闡述了不同版本控制狀態下,OSS對覆蓋和刪除Object的處理邏輯,協助您瞭解版本控制狀態下的資料保護機制。

版本控制狀態

覆蓋Object

刪除Object

未開啟

已有Object被直接覆蓋,且無法恢複,只能擷取最新版本Object。

直接刪除,無法再擷取此Object。

開啟

為此Object添加新的版本ID,歷史版本不受影響。

為此Object添加刪除標記(Delete Marker),刪除標記將攜帶一個全域唯一的版本ID,歷史版本不受影響。

暫停

為此Object產生版本ID為“null”的新版本。

如果歷史版本中已存在版本號碼為“null”的Object或刪除標記,則將會被新的“null”版本Object覆蓋,其他非“null”版本的Object或刪除標記不受影響。

為此Object產生版本ID為“null”的刪除標記。

如果歷史版本中已存在版本號碼為“null”的Object或刪除標記,則將會被新的刪除標記覆蓋,其他非“null”版本的Object或刪除標記不受影響。

以下以圖示的方法說明在Bucket版本控制狀態處於“開啟”和“暫停”時,上傳同名Object或刪除Object時OSS的處理行為。圖示中的版本號碼均以簡短版本號碼代替。

  • 開啟版本控制下的Object覆蓋操作

    在開啟版本控制的Bucket中連續執行上傳Object操作,Object雖然被多次覆蓋,但每次覆蓋操作均會產生一個獨立的版本ID。

    1

  • 開啟版本控制下的Object刪除操作

    在開啟版本控制下的Bucket中刪除Object時,歷史版本Object不會被真正刪除,而是產生一個刪除標記來標識Object的目前的版本是刪除狀態。如果再重複上傳同名Object,將產生新的版本ID。

    2

  • 暫停版本控制下的Object覆蓋操作

    在暫停版本控制狀態Bucket中上傳Object時,歷史版本資料繼續保留,新上傳的Object版本號碼為“null”。如果再重複上傳同名Object,將產生新的“null”版本,並自動把前一次的“null”版本覆蓋。

    3

  • 暫停版本控制下的Object刪除操作

    在暫停版本控制下的Bucket中刪除Object時,歷史版本Object不會被真正刪除,而是產生一個刪除標記來標識Object的目前的版本是刪除狀態。

    4

從上述資訊得知,當您的Bucket處於版本控制狀態時,針對資料的覆蓋和刪除操作將會以歷史版本的形式儲存下來。您在錯誤覆蓋或者刪除Object後,能夠將Bucket中儲存的Object恢複至任意時刻的歷史版本。

開啟版本控制

開啟版本控制後,OSS會為Bucket中所有Object的每個版本指定唯一的versionId。

使用OSS控制台

  • 建立雲盒Bucket時開啟版本控制

    1. 登入OSS管理主控台

    2. 在左側導覽列,選擇資料服務 > 雲盒Bucket,然後單擊左上方的建立Bucket

    3. 建立Bucket頁面配置各項參數。

      其中,版本控制地區選取項目開通。其他參數的配置詳情,請參見建立雲盒Bucket

    4. 單擊確定
  • 對已建立的雲盒Bucket開啟版本控制

    1. 在左側導覽列,選擇資料服務 > 雲盒Bucket,然後在Bucket列表中單擊目標Bucket。

    2. 在左側導覽列,選擇資料安全 > 版本控制

    3. 單擊版本控制右側的開啟

使用Java SDK

僅支援通過Java SDK開啟版本控制,Java SDK要求3.15.0及以上版本。

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.*;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;

public class Demo {
    public static void main(String[] args) throws Exception {
        // 填寫雲盒Bucket的資料網域名稱。
        String endpoint = "https://cb-f8z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox.aliyuncs.com";
        // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫雲盒Bucket名稱,例如examplebucket。
        String bucketName = "examplebucket";
        // 填寫雲盒Bucket所在地區。
        String region = "cn-hangzhou";
        // 填寫雲盒ID。
        String cloudBoxId = "cb-f8z7yvzgwfkl9q0h****";

        // 建立OSSClient執行個體。
        // 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。
        ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
        conf.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(new DefaultCredentialProvider(credentialsProvider.getCredentials()))
                .clientConfiguration(conf)
                .region(region)
                .cloudBoxId(cloudBoxId)
                .build();

        try {
            // 設定Bucket為開啟版本控制狀態。
            BucketVersioningConfiguration configuration = new BucketVersioningConfiguration();
            configuration.setStatus(BucketVersioningConfiguration.ENABLED);
            SetBucketVersioningRequest request = new SetBucketVersioningRequest(bucketName, configuration);
            ossClient.setBucketVersioning(request);
        } 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();
            }
        }
    }
}

使用命令列工具ossutil

您可以使用命令列工具ossutil來設定指定儲存空間的版本控制狀態,ossutil的安裝請參見安裝ossutil

以下命令用於啟用指定儲存空間的版本控制功能。

ossutil api put-bucket-versioning --bucket examplebucket --versioning-configuration "{\"Status\":\"Enabled\"}"

關於該命令的更多資訊,請參見put-bucket-versioning

使用REST API

如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見PutBucketVersioning

暫停版本控制

開啟版本控制後,您還可以隨時暫停版本控制以停止在Bucket中繼續累積同一Object的新版本。暫停版本控制後,OSS將為新產生的Object添加versionId為null的版本,已有的歷史版本Object將繼續保留。

使用OSS控制台

  1. 在左側導覽列,選擇資料服務 > 雲盒Bucket,然後在Bucket列表中單擊目標Bucket。

  2. 在左側導覽列,選擇冗餘與容錯 > 版本控制

使用Java SDK

僅支援通過Java SDK暫停版本控制,Java SDK要求3.15.0及以上版本。

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.*;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;

public class Demo {
    public static void main(String[] args) throws Exception {
        // 填寫雲盒Bucket的資料網域名稱。
        String endpoint = "https://cb-f8z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox.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";
        // 填寫雲盒ID。
        String cloudBoxId = "cb-f8z7yvzgwfkl9q0h****";

        // 建立OSSClient執行個體。
        // 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。
        ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
        conf.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(new DefaultCredentialProvider(credentialsProvider.getCredentials()))
                .clientConfiguration(conf)
                .region(region)
                .cloudBoxId(cloudBoxId)
                .build();

        try {
            // 設定Bucket為暫停版本控制狀態。
            BucketVersioningConfiguration configuration = new BucketVersioningConfiguration();
            configuration.setStatus(BucketVersioningConfiguration.SUSPENDED);
            SetBucketVersioningRequest request = new SetBucketVersioningRequest(bucketName, configuration);
            ossClient.setBucketVersioning(request);
        } 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();
            }
        }
    }
}

使用命令列工具ossutil

您可以使用命令列工具ossutil來設定指定儲存空間的版本控制狀態,ossutil的安裝請參見安裝ossutil

以下命令用於暫停指定儲存空間的版本控制功能。

ossutil api put-bucket-versioning --bucket examplebucket --versioning-configuration "{\"Status\":\"Suspended\"}"

關於該命令的更多資訊,請參見put-bucket-versioning

使用REST API

如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見PutBucketVersioning