全部產品
Search
文件中心

:開啟版本控制實現資料恢複和版本管理

更新時間:Nov 30, 2024

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

使用情境

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

  • 資料誤刪除

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

  • 檔案被覆蓋

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

注意事項

  • 費用說明

    版本控制功能本身不收取任何費用,但對目前的版本和所有歷史版本的檔案都會收取儲存費用。為避免不必要的儲存費用,請通過生命週期及時刪除不需要的歷史版本檔案。具體操作,請參見生命週期。此外,若您對歷史版本檔案進行下載或恢複等操作,還會產生相應的請求費用、流量費用等。計費詳情,請參見計量項目與計費項目

  • 許可權說明

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

  • 功能互斥

    • 同一Bucket中,版本控制與合規保留原則無法同時配置。

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

  • 版本控制與OSS-HDFS服務

    同一個Bucket請勿同時開通OSS-HDFS服務和版本控制。

    如果某個Bucket已同時開通OSS-HDFS服務和版本控制,可能導致OSS-HDFS服務異常。為保證OSS-HDFS服務的穩定性,您需要儘快暫停版本控制,同時配置生命週期規則清理刪除標記。

版本控制狀態

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

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

  • 當Bucket版本控制處於“開啟”狀態時,OSS將為新上傳的Object產生全域唯一的隨機字串版本ID。關於啟用版本控制狀態下Object的具體操作,請參見開啟版本控制下Object的操作

  • 當Bucket版本控制處於“暫停”狀態時,OSS將為新上傳的Object產生特殊字元串為“null”的版本ID。關於暫停版本控制狀態下Object的具體操作,請參見暫停版本控制下Object的操作

說明

當Bucket版本控制處於“開啟”狀態時,由於Object的每個版本都被儲存下來,每個版本都會佔用儲存空間,OSS會對Object的所有版本收取儲存費用。建議結合您的使用情境通過生命週期規則,將目前的版本或歷史版本Object轉換為低頻訪問或Archive Storage類型以及刪除不再需要的歷史版本,以降低您的儲存費用,更多資訊請參見使用最後一次修改時間的生命週期規則結合版本控制降低儲存成本

資料保護

以下表格詳細闡述了不同版本控制狀態下,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控制台

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

  • 建立Bucket時開啟版本控制。

    1. 登入OSS管理主控台

    2. 單擊Bucket 列表,然後單擊建立 Bucket

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

      其中,在版本控制地區選取項目開通。其他參數的配置詳情,請參見建立儲存空間

    4. 單擊確定

  • 對已建立的Bucket開啟版本控制。

    1. 單擊Bucket 列表,然後單擊目標Bucket名稱。

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

    3. 版本控制頁面,單擊開啟

    4. 在彈出的對話方塊,單擊確定

開啟版本控制後,您可以在檔案清單頁面單擊歷史版本右側的顯示,查看所有版本的檔案。如果僅需查看檔案的目前的版本,請單擊歷史版本右側的隱藏。隱藏歷史版本並不能提升列舉檔案的效能,如果列舉檔案時頁面響應過慢,請參見響應速度下降排查並解決。

使用阿里雲SDK

以下僅列舉常見SDK的開啟版本控制的程式碼範例。關於其他SDK的開啟版本控制的程式碼範例,請參見SDK簡介

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請按實際情況填寫。
        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";

        // 建立OSSClient執行個體。
        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;

// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// Endpoint以杭州為例,其它Region請按實際情況填寫。
$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填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
  region: "oss-cn-hangzhou",
  // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // 填寫儲存空間名稱,例如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
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')

# 建立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填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數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 = "examplebucket";
// 填寫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);
c.SetRegion(region);
try
{
    // 設定儲存空間版本控制狀態為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() {
    /// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 建立OSSClient執行個體。
    // yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
       fmt.Println("Error:", err)
       os.Exit(-1)
  }

  // 建立一個儲存空間。
  // yourBucketName填寫儲存空間名稱。
  err = client.CreateBucket("yourBucketName")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  // 此處以設定儲存空間版本狀態為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帳號資訊。*/
            
    /* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填寫Bucket名稱,例如examplebucket。*/
    std::string BucketName = "examplebucket";

    /* 初始化網路等資源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);

    /* 建立Bucket版本配置,狀態設定為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;
    }

    /* 釋放網路等資源。*/
    ShutdownSdk();
    return 0;
}

使用命令列工具ossutil

關於使用ossutil開啟版本控制的具體操作,請參見設定版本控制狀態

使用REST API

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

暫停版本控制

使用OSS控制台

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

暫停Bucket版本控制的操作步驟如下:

  1. 單擊Bucket 列表,然後單擊目標Bucket名稱。

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

  3. 版本控制頁面,單擊暫停

  4. 在彈出的對話方塊,單擊確定

使用阿里雲SDK

以下僅列舉常見SDK的開啟版本控制的程式碼範例。關於其他SDK的開啟版本控制的程式碼範例,請參見SDK簡介

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請按實際情況填寫。
        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";

        // 建立OSSClient執行個體。
        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;

// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// Endpoint以杭州為例,其它Region請按實際情況填寫。
$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填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
  region: "oss-cn-hangzhou",
  // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // 填寫儲存空間名稱,例如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
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')

# 建立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填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數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 = "examplebucket";
// 初始化OSSClient。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    // 設定儲存空間版本控制狀態為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() {
    /// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 建立OSSClient執行個體。
    // yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
       fmt.Println("Error:", err)
       os.Exit(-1)
  }

  // 建立一個儲存空間。
  // yourBucketName填寫儲存空間名稱。
  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帳號資訊。*/
            
    /* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填寫Bucket名稱,例如examplebucket。*/
    std::string BucketName = "examplebucket";

    /* 初始化網路等資源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);

    /* 建立Bucket版本配置,狀態設定為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;
    }

    /* 釋放網路等資源。*/
    ShutdownSdk();
    return 0;
}

使用命令列工具ossutil

關於使用ossutil暫停版本控制的具體操作,請參見設定版本控制狀態

使用REST API

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

查看版本

您可以使用命令列ossutil查看某個Object的所有版本。例如,您希望查看examplebucket根目錄下example.txt的所有版本。

ossutil ls oss://examplebucket/example.txt --all-versions

更多資訊,請參見列舉Object

恢複版本

使用OSS控制台

在開啟版本控制下的Bucket中刪除Object時,歷史版本Object不會被真正刪除,而是產生一個刪除標記來標識Object的目前的版本是刪除狀態。此時您可以在控制台恢複版本。

  1. 單擊Bucket 列表,然後單擊目標Bucket名稱。

  2. 選擇文件管理 > 檔案清單

  3. 單擊歷史版本右側的顯示

  4. 選中待恢複檔案,然後單擊頁面下方的恢復

  5. 在彈出的對話方塊,單擊確定

使用命令列工具ossutil

您可以使用revert-versioning(恢複版本)命令恢複已刪除檔案的歷史版本。更多資訊,請參見revert-versioning(恢複版本)

後續參考