開啟版本控制實(shí)現(xiàn)數(shù)據(jù)恢復(fù)和版本管理
版本控制是針對(duì)存儲(chǔ)空間(Bucket)級(jí)別的數(shù)據(jù)保護(hù)功能。開啟版本控制后,針對(duì)數(shù)據(jù)的覆蓋和刪除操作將會(huì)以歷史版本的形式保存下來(lái)。您在錯(cuò)誤覆蓋或刪除對(duì)象(Object)后,能夠?qū)⒋鎯?chǔ)在Bucket中的Object恢復(fù)至任意時(shí)刻的歷史版本。
使用場(chǎng)景
建議您在以下場(chǎng)景中使用版本控制,為您的數(shù)據(jù)安全提供更好的保障。
數(shù)據(jù)誤刪除
當(dāng)前OSS不提供回收站功能。您刪除OSS數(shù)據(jù)后想要找回時(shí),可使用版本控制功能,恢復(fù)已刪除的數(shù)據(jù)。
文件被覆蓋
對(duì)于網(wǎng)盤、在線協(xié)作類產(chǎn)品,文件會(huì)被頻繁修改,針對(duì)文件的編輯會(huì)產(chǎn)生大量的臨時(shí)版本。您可以使用版本控制功能找回某個(gè)時(shí)間點(diǎn)的版本。
注意事項(xiàng)
費(fèi)用說(shuō)明
版本控制功能本身不收取任何費(fèi)用,但對(duì)當(dāng)前版本和所有歷史版本的文件都會(huì)收取存儲(chǔ)費(fèi)用。為避免不必要的存儲(chǔ)費(fèi)用,請(qǐng)通過(guò)生命周期及時(shí)刪除不需要的歷史版本文件。具體操作,請(qǐng)參見生命周期概述。此外,若您對(duì)歷史版本文件進(jìn)行下載或恢復(fù)等操作,還會(huì)產(chǎn)生相應(yīng)的請(qǐng)求費(fèi)用、流量費(fèi)用等。計(jì)費(fèi)詳情,請(qǐng)參見計(jì)量項(xiàng)與計(jì)費(fèi)項(xiàng)。
權(quán)限說(shuō)明
只有Bucket的擁有者及授予了PutBucketVersioning權(quán)限的RAM用戶才能配置版本控制。
功能互斥
同一Bucket中,版本控制與合規(guī)保留策略無(wú)法同時(shí)配置。
如果Bucket已開啟版本控制,上傳文件時(shí)附加的覆蓋同名文件請(qǐng)求頭
x-oss-forbid-overwrite
將不生效。更多信息,請(qǐng)參見請(qǐng)求頭。
版本控制與OSS-HDFS服務(wù)
同一個(gè)Bucket請(qǐng)勿同時(shí)開通OSS-HDFS服務(wù)和版本控制。
如果某個(gè)Bucket已同時(shí)開通OSS-HDFS服務(wù)和版本控制,可能導(dǎo)致OSS-HDFS服務(wù)異常。為保證OSS-HDFS服務(wù)的穩(wěn)定性,您需要盡快暫停版本控制,同時(shí)配置生命周期規(guī)則清理刪除標(biāo)記。
版本控制狀態(tài)
Bucket包含三種版本控制狀態(tài),分別為未開啟、開啟或者暫停。
默認(rèn)情況下,Bucket版本控制狀態(tài)為“未開啟”。如果Bucket處于“開啟”版本狀態(tài),將無(wú)法返回至“未開啟”狀態(tài)。但是,您可以暫停Bucket的版本控制狀態(tài)。
當(dāng)Bucket版本控制處于“開啟”狀態(tài)時(shí),OSS將為新上傳的Object生成全局唯一的隨機(jī)字符串版本ID。關(guān)于啟用版本控制狀態(tài)下Object的具體操作,請(qǐng)參見開啟版本控制下Object的操作。
當(dāng)Bucket版本控制處于“暫停”狀態(tài)時(shí),OSS將為新上傳的Object生成特殊字符串為“null”的版本ID。關(guān)于暫停版本控制狀態(tài)下Object的具體操作,請(qǐng)參見暫停版本控制下Object的操作。
當(dāng)Bucket版本控制處于“開啟”狀態(tài)時(shí),由于Object的每個(gè)版本都被保存下來(lái),每個(gè)版本都會(huì)占用存儲(chǔ)空間,OSS會(huì)對(duì)Object的所有版本收取存儲(chǔ)費(fèi)用。建議結(jié)合您的使用場(chǎng)景通過(guò)生命周期規(guī)則,將當(dāng)前版本或歷史版本Object轉(zhuǎn)換為低頻訪問(wèn)或歸檔存儲(chǔ)類型以及刪除不再需要的歷史版本,以降低您的存儲(chǔ)費(fèi)用,更多信息請(qǐng)參見使用最后一次修改時(shí)間的生命周期規(guī)則結(jié)合版本控制降低存儲(chǔ)成本。
數(shù)據(jù)保護(hù)
以下表格詳細(xì)闡述了不同版本控制狀態(tài)下,OSS對(duì)覆蓋和刪除Object的處理邏輯,幫助您了解版本控制狀態(tài)下的數(shù)據(jù)保護(hù)機(jī)制。
版本控制狀態(tài) | 覆蓋Object | 刪除Object |
未開啟 | 已有Object被直接覆蓋,且無(wú)法恢復(fù),只能獲取最新版本Object。 | 直接刪除,無(wú)法再獲取此Object。 |
開啟 | 為此Object添加新的版本ID,歷史版本不受影響。 | 為此Object添加刪除標(biāo)記(Delete Marker),刪除標(biāo)記將攜帶一個(gè)全局唯一的版本ID,歷史版本不受影響。 |
暫停 | 為此Object產(chǎn)生版本ID為“null”的新版本。 如果歷史版本中已存在版本號(hào)為“null”的Object或刪除標(biāo)記,則將會(huì)被新的“null”版本Object覆蓋,其他非“null”版本的Object或刪除標(biāo)記不受影響。 | 為此Object產(chǎn)生版本ID為“null”的刪除標(biāo)記。 如果歷史版本中已存在版本號(hào)為“null”的Object或刪除標(biāo)記,則將會(huì)被新的刪除標(biāo)記覆蓋,其他非“null”版本的Object或刪除標(biāo)記不受影響。 |
以下以圖示的方法說(shuō)明在Bucket版本控制狀態(tài)處于“開啟”和“暫停”時(shí),上傳同名Object或刪除Object時(shí)OSS的處理行為。圖示中的版本號(hào)均以簡(jiǎn)短版本號(hào)代替。
開啟版本控制下的Object覆蓋操作
在開啟版本控制的Bucket中連續(xù)執(zhí)行上傳Object操作,Object雖然被多次覆蓋,但每次覆蓋操作均會(huì)產(chǎn)生一個(gè)獨(dú)立的版本ID。
開啟版本控制下的Object刪除操作
在開啟版本控制下的Bucket中刪除Object時(shí),歷史版本Object不會(huì)被真正刪除,而是產(chǎn)生一個(gè)刪除標(biāo)記來(lái)標(biāo)識(shí)Object的當(dāng)前版本是刪除狀態(tài)。如果再重復(fù)上傳同名Object,將產(chǎn)生新的版本ID。
暫停版本控制下的Object覆蓋操作
在暫停版本控制狀態(tài)Bucket中上傳Object時(shí),歷史版本數(shù)據(jù)繼續(xù)保留,新上傳的Object版本號(hào)為“null”。如果再重復(fù)上傳同名Object,將產(chǎn)生新的“null”版本,并自動(dòng)把前一次的“null”版本覆蓋。
暫停版本控制下的Object刪除操作
在暫停版本控制下的Bucket中刪除Object時(shí),歷史版本Object不會(huì)被真正刪除,而是產(chǎn)生一個(gè)刪除標(biāo)記來(lái)標(biāo)識(shí)Object的當(dāng)前版本是刪除狀態(tài)。
從上述信息得知,當(dāng)您的Bucket處于版本控制狀態(tài)時(shí),針對(duì)數(shù)據(jù)的覆蓋和刪除操作將會(huì)以歷史版本的形式保存下來(lái)。您在錯(cuò)誤覆蓋或者刪除Object后,能夠?qū)ucket中存儲(chǔ)的Object恢復(fù)至任意時(shí)刻的歷史版本。
開啟版本控制
開啟版本控制后,OSS會(huì)為Bucket中所有Object的每個(gè)版本指定唯一的versionId。
新建Bucket時(shí)開啟版本控制。
單擊Bucket 列表,然后單擊創(chuàng)建 Bucket。
在創(chuàng)建 Bucket頁(yè)面配置各項(xiàng)參數(shù)。
其中,在版本控制區(qū)域選擇開通。其他參數(shù)的配置詳情,請(qǐng)參見創(chuàng)建存儲(chǔ)空間。
單擊確定。
對(duì)已創(chuàng)建的Bucket開啟版本控制。
單擊Bucket 列表,然后單擊目標(biāo)Bucket名稱。
在左側(cè)導(dǎo)航欄,選擇
。在版本控制頁(yè)面,單擊開啟。
在彈出的對(duì)話框,單擊確定。
開啟版本控制后,您可以在文件列表頁(yè)面單擊歷史版本右側(cè)的顯示,查看所有版本的文件。如果僅需查看文件的當(dāng)前版本,請(qǐng)單擊歷史版本右側(cè)的隱藏。隱藏歷史版本并不能提升列舉文件的性能,如果列舉文件時(shí)頁(yè)面響應(yīng)過(guò)慢,請(qǐng)參見響應(yīng)速度下降排查并解決。
以下僅列舉常見SDK的開啟版本控制的代碼示例。關(guān)于其他SDK的開啟版本控制的代碼示例,請(qǐng)參見SDK簡(jiǎn)介。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫B(tài)ucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 創(chuàng)建OSSClient實(shí)例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// 開啟版本控制。
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();
}
}
}
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\OssClient;
use OSS\Core\OssException;
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// Endpoint以杭州為例,其它Region請(qǐng)按實(shí)際情況填寫。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "yourBucketName";
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
try {
// 開啟版本控制。
$ossClient->putBucketVersioning($bucket, "Enabled");
} catch (OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
const OSS = require("ali-oss");
const client = new OSS({
// yourregion填寫B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: "oss-cn-hangzhou",
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// 填寫存儲(chǔ)空間名稱,例如examplebucket。
bucket: "examplebucket",
});
async function putBucketVersioning() {
// 開啟版本控制。
const status = "Enabled";
const result = await client.putBucketVersioning("examplebucket", status);
console.log(result);
}
putBucketVersioning();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import BucketVersioningConfig
# 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫存儲(chǔ)空間名稱。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')
# 創(chuàng)建bucket版本控制配置。
config = BucketVersioningConfig()
# 開啟版本控制。
config.status = oss2.BUCKET_VERSIONING_ENABLE
result = bucket.put_bucket_versioning(config)
# 查看http返回碼。
print('http response code:', result.status)
using Aliyun.OSS;
// yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫B(tài)ucket名稱,例如examplebucket。
var bucketName = "examplebucket";
// 填寫B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
const string region = "cn-hangzhou";
// 創(chuàng)建ClientConfiguration實(shí)例,按照您的需要修改默認(rèn)參數(shù)。
var conf = new ClientConfiguration();
// 設(shè)置v4簽名。
conf.SignatureVersion = SignatureVersion.V4;
// 創(chuàng)建OssClient實(shí)例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
c.SetRegion(region);
try
{
// 設(shè)置存儲(chǔ)空間版本控制狀態(tài)為Enabled。
client.SetBucketVersioning(new SetBucketVersioningRequest(bucketName, VersioningStatus.Enabled));
Console.WriteLine("Create bucket Version succeeded");
}
catch (Exception ex)
{
Console.WriteLine("Create bucket Version failed. {0}", ex.Message);
}
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
/// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 創(chuàng)建一個(gè)存儲(chǔ)空間。
// yourBucketName填寫存儲(chǔ)空間名稱。
err = client.CreateBucket("yourBucketName")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 此處以設(shè)置存儲(chǔ)空間版本狀態(tài)為Enabled為例。
config := oss.VersioningConfig{Status: "Enabled"}
err = client.SetBucketVersioning("yourBucketName", config)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS賬號(hào)信息。*/
/* yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* 填寫B(tài)ucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 初始化網(wǎng)絡(luò)等資源。*/
InitializeSdk();
ClientConfiguration conf;
/* 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
/* 創(chuàng)建Bucket版本配置,狀態(tài)設(shè)置為Enabled。*/
SetBucketVersioningRequest setrequest(BucketName, VersioningStatus::Enabled);
auto outcome = client.SetBucketVersioning(setrequest);
if (!outcome.isSuccess()) {
/* 異常處理。*/
std::cout << "SetBucketVersioning fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* 釋放網(wǎng)絡(luò)等資源。*/
ShutdownSdk();
return 0;
}
關(guān)于使用ossutil開啟版本控制的具體操作,請(qǐng)參見設(shè)置版本控制狀態(tài)。
如果您的程序自定義要求較高,您可以直接發(fā)起REST API請(qǐng)求。直接發(fā)起REST API請(qǐng)求需要手動(dòng)編寫代碼計(jì)算簽名。更多信息,請(qǐng)參見PutBucketVersioning。
暫停版本控制
開啟版本控制后,您還可以隨時(shí)暫停版本控制以停止在Bucket中繼續(xù)累積同一Object的新版本。暫停版本控制后,OSS將為新生成的Object添加versionId為null的版本,已有的歷史版本Object將繼續(xù)保留。
暫停Bucket版本控制的操作步驟如下:
單擊Bucket 列表,然后單擊目標(biāo)Bucket名稱。
在左側(cè)導(dǎo)航欄,選擇
。在版本控制頁(yè)面,單擊暫停。
在彈出的對(duì)話框,單擊確定。
以下僅列舉常見SDK的開啟版本控制的代碼示例。關(guān)于其他SDK的開啟版本控制的代碼示例,請(qǐng)參見SDK簡(jiǎn)介。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫B(tài)ucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 創(chuàng)建OSSClient實(shí)例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// 暫停版本控制。
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();
}
}
}
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\OssClient;
use OSS\Core\OssException;
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// Endpoint以杭州為例,其它Region請(qǐng)按實(shí)際情況填寫。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "yourBucketName";
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
try {
// 暫停版本控制。
$ossClient->putBucketVersioning($bucket, "Suspended");
} catch (OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
const OSS = require("ali-oss");
const client = new OSS({
// yourregion填寫B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: "oss-cn-hangzhou",
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// 填寫存儲(chǔ)空間名稱,例如examplebucket。
bucket: "examplebucket",
});
async function putBucketVersioning() {
// 暫停版本控制。
const status = "Suspended";
const result = await client.putBucketVersioning("examplebucket", status);
console.log(result);
}
putBucketVersioning();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import BucketVersioningConfig
# 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫存儲(chǔ)空間名稱。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')
# 創(chuàng)建bucket版本控制配置。
config = BucketVersioningConfig()
# 暫停版本控制。
config.status = oss2.BUCKET_VERSIONING_SUSPENDED
result = bucket.put_bucket_versioning(config)
# 查看http返回碼。
print('http response code:', result.status)
using Aliyun.OSS;
// yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫B(tài)ucket名稱,例如examplebucket。
var bucketName = "examplebucket";
// 初始化OSSClient。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
// 設(shè)置存儲(chǔ)空間版本控制狀態(tài)為Suspended。
client.SetBucketVersioning(new SetBucketVersioningRequest(bucketName, VersioningStatus.Suspended));
Console.WriteLine("Create bucket Version succeeded");
}
catch (Exception ex)
{
Console.WriteLine("Create bucket Version failed. {0}", ex.Message);
}
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
/// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 創(chuàng)建一個(gè)存儲(chǔ)空間。
// yourBucketName填寫存儲(chǔ)空間名稱。
err = client.CreateBucket("yourBucketName")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 暫停版本控制。
config := oss.VersioningConfig{Status: "Suspended"}
err = client.SetBucketVersioning("yourBucketName", config)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS賬號(hào)信息。*/
/* yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* 填寫B(tài)ucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 初始化網(wǎng)絡(luò)等資源。*/
InitializeSdk();
ClientConfiguration conf;
/* 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
/* 創(chuàng)建Bucket版本配置,狀態(tài)設(shè)置為Suspended。*/
SetBucketVersioningRequest setrequest(BucketName, VersioningStatus::Suspended);
auto outcome = client.SetBucketVersioning(setrequest);
if (!outcome.isSuccess()) {
/* 異常處理。*/
std::cout << "SetBucketVersioning fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* 釋放網(wǎng)絡(luò)等資源。*/
ShutdownSdk();
return 0;
}
查看版本
您可以使用命令行ossutil查看某個(gè)Object的所有版本。例如,您希望查看examplebucket根目錄下example.txt的所有版本。
ossutil ls oss://examplebucket/example.txt --all-versions
更多信息,請(qǐng)參見列舉Object。
恢復(fù)版本
在開啟版本控制下的Bucket中刪除Object時(shí),歷史版本Object不會(huì)被真正刪除,而是產(chǎn)生一個(gè)刪除標(biāo)記來(lái)標(biāo)識(shí)Object的當(dāng)前版本是刪除狀態(tài)。此時(shí)您可以在控制臺(tái)恢復(fù)版本。
單擊Bucket 列表,然后單擊目標(biāo)Bucket名稱。
選擇
。單擊歷史版本右側(cè)的顯示。
選中待恢復(fù)文件,然后單擊頁(yè)面下方的恢復(fù)。
在彈出的對(duì)話框,單擊確定。
您可以使用revert-versioning(恢復(fù)版本)命令恢復(fù)已刪除文件的歷史版本。更多信息,請(qǐng)參見revert-versioning(恢復(fù)版本)。