版本控制是針對雲盒Bucket的資料保護功能。開啟版本控制後,針對資料的覆蓋和刪除操作將會以歷史版本的形式儲存下來。您在錯誤覆蓋或者刪除對象(Object)後,能夠將Bucket中儲存的Object恢複至任意時刻的歷史版本。
使用情境
建議您在以下情境中使用版本控制,為您的資料安全提供更好的保障。
版本控制狀態
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。

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

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

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

從上述資訊得知,當您的Bucket處於版本控制狀態時,針對資料的覆蓋和刪除操作將會以歷史版本的形式儲存下來。您在錯誤覆蓋或者刪除Object後,能夠將Bucket中儲存的Object恢複至任意時刻的歷史版本。
開啟版本控制
開啟版本控制後,OSS會為Bucket中所有Object的每個版本指定唯一的versionId。
使用OSS控制台
建立雲盒Bucket時開啟版本控制
登入OSS管理主控台。
在左側導覽列,選擇,然後單擊左上方的建立Bucket。
在建立Bucket頁面配置各項參數。
其中,版本控制地區選取項目開通。其他參數的配置詳情,請參見建立雲盒Bucket。
- 單擊確定。
對已建立的雲盒Bucket開啟版本控制
在左側導覽列,選擇,然後在Bucket列表中單擊目標Bucket。
在左側導覽列,選擇。
單擊版本控制右側的開啟。
使用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控制台
在左側導覽列,選擇,然後在Bucket列表中單擊目標Bucket。
- 在左側導覽列,選擇。
使用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。