




<AccessControlPolicy><Owner><ID>qcs::cam::uin/100000000001:uin/100000000001</ID></Owner><AccessControlList><Grant><Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="RootAccount"><ID>qcs::cam::uin/100000000001:uin/100000000001</ID></Grantee><Permission>FULL_CONTROL</Permission></Grant></AccessControlList></AccessControlPolicy>













package mainimport ("context""fmt""os""net/url""net/http""github.com/tencentyun/cos-go-sdk-v5""github.com/tencentyun/cos-go-sdk-v5/debug")func log_status(err error) {if err == nil {return}if cos.IsNotFoundError(err) {// WARNfmt.Println("WARN: Resource is not existed: %v", err)} else if e, ok := cos.IsCOSError(err); ok {fmt.Printf("ERROR: Code: %v\\n", e.Code)fmt.Printf("ERROR: Message: %v\\n", e.Message)fmt.Printf("ERROR: Resource: %v\\n", e.Resource)fmt.Printf("ERROR: RequestId: %v\\n", e.RequestID)// ERROR} else {fmt.Printf("ERROR: %v\\n", err)// ERROR}}var (srcBucket = "test-1259654469"srcBucketRegion = "ap-guangzhou"srcCosClient *cos.ClientcopyObjs = map[string]struct{}{})func newClient(bucket, region string) *cos.Client {u, _ := url.Parse(fmt.Sprintf("https://%v.cos.%v.myqcloud.com", bucket, region))b := &cos.BaseURL{BucketURL: u,}return cos.NewClient(b, &http.Client{Transport: &cos.AuthorizationTransport{SecretID: os.Getenv("COS_SECRETID"),SecretKey: os.Getenv("COS_SECRETKEY"),Transport: &debug.DebugRequestTransport{RequestHeader: false,RequestBody: false,ResponseHeader: false,ResponseBody: false,},},})}func recoverObj(key, versionId string) {sourceURL := fmt.Sprintf("%v.cos.%v.myqcloud.com/%v?versionId=%v", srcBucket, srcBucketRegion, key, versionId)_, _, err := srcCosClient.Object.MultiCopy(context.Background(), key, sourceURL, nil)if err != nil {log_status(err)}}func main() {srcCosClient = newClient(srcBucket, srcBucketRegion)keyMarker := ""versionIdMarker := ""isTruncated := trueopt := &cos.BucketGetObjectVersionsOptions{EncodingType: "url",}for isTruncated {opt.KeyMarker = keyMarkeropt.VersionIdMarker = versionIdMarkerv, _, err := srcCosClient.Bucket.GetObjectVersions(context.Background(), opt)if err != nil {log_status(err)break}for _, vc := range v.DeleteMarker {if vc.IsLatest {// 对象被删除,需要恢复copyObjs[vc.Key] = struct{}{}}}for _, vc := range v.Version {// 按最新恢复if _, ok := copyObjs[vc.Key]; ok {delete(copyObjs, vc.Key)key, _ := cos.DecodeURIComponent(vc.Key)fmt.Printf("key: %v, versionId: %v\\n", key, vc.VersionId)recoverObj(key, vc.VersionId)}}keyMarker = v.NextKeyMarkerversionIdMarker = v.NextVersionIdMarkerisTruncated = v.IsTruncated}}
package mainimport ("context""fmt""os""net/url""net/http""github.com/tencentyun/cos-go-sdk-v5""github.com/tencentyun/cos-go-sdk-v5/debug")func log_status(err error) {if err == nil {return}if cos.IsNotFoundError(err) {// WARNfmt.Println("WARN: Resource is not existed: %v", err)} else if e, ok := cos.IsCOSError(err); ok {fmt.Printf("ERROR: Code: %v\\n", e.Code)fmt.Printf("ERROR: Message: %v\\n", e.Message)fmt.Printf("ERROR: Resource: %v\\n", e.Resource)fmt.Printf("ERROR: RequestId: %v\\n", e.RequestID)// ERROR} else {fmt.Printf("ERROR: %v\\n", err)// ERROR}}var (srcBucket = "test-1259654469"dstBucket = "test2-1259654469"srcBucketRegion = "ap-guangzhou"dstBucketRegion = "ap-guangzhou"srcCosClient *cos.ClientdstCosClient *cos.Client)func newClient(bucket, region string) *cos.Client {u, _ := url.Parse(fmt.Sprintf("https://%v.cos.%v.myqcloud.com", bucket, region))b := &cos.BaseURL{BucketURL: u,}return cos.NewClient(b, &http.Client{Transport: &cos.AuthorizationTransport{SecretID: os.Getenv("COS_SECRETID"),SecretKey: os.Getenv("COS_SECRETKEY"),Transport: &debug.DebugRequestTransport{RequestHeader: false,RequestBody: false,ResponseHeader: false,ResponseBody: false,},},})}func recoverObj(key, versionId string) {sourceURL := fmt.Sprintf("%v.cos.%v.myqcloud.com/%v?versionId=%v", srcBucket, srcBucketRegion, key, versionId)_, _, err := dstCosClient.Object.MultiCopy(context.Background(), key, sourceURL, nil)if err != nil {log_status(err)}}func main() {srcCosClient = newClient(srcBucket, srcBucketRegion)dstCosClient = newClient(dstBucket, dstBucketRegion)keyMarker := ""versionIdMarker := ""isTruncated := trueopt := &cos.BucketGetObjectVersionsOptions{EncodingType: "url",}var preKey stringfor isTruncated {opt.KeyMarker = keyMarkeropt.VersionIdMarker = versionIdMarkerv, _, err := srcCosClient.Bucket.GetObjectVersions(context.Background(), opt)if err != nil {log_status(err)break}for _, vc := range v.Version {// 最新非deletemarker对象if preKey != vc.Key {preKey = vc.Keykey, _ := cos.DecodeURIComponent(vc.Key)fmt.Printf("key: %v, versionId: %v, lastest: %v\\n", key, vc.VersionId, vc.IsLatest)recoverObj(key, vc.VersionId)}}keyMarker = v.NextKeyMarkerversionIdMarker = v.NextVersionIdMarkerisTruncated = v.IsTruncated}}
import com.qcloud.cos.COSClient;import com.qcloud.cos.ClientConfig;import com.qcloud.cos.auth.BasicCOSCredentials;import com.qcloud.cos.auth.COSCredentials;import com.qcloud.cos.exception.CosClientException;import com.qcloud.cos.exception.CosServiceException;import com.qcloud.cos.http.HttpProtocol;import com.qcloud.cos.model.COSVersionSummary;import com.qcloud.cos.model.CopyObjectRequest;import com.qcloud.cos.model.CopyObjectResult;import com.qcloud.cos.model.ListVersionsRequest;import com.qcloud.cos.model.VersionListing;import com.qcloud.cos.region.Region;import java.util.List;import java.util.Objects;public class RecoverObjectsDemo {private static String secretId = "************************************";private static String secretKey = "************************************";private static String bucketName = "examplebucket-12500000000";private static String bucketRegion = "ap-guangzhou";private static COSClient cosClient = createCli();public static void main(String[] args) {listAndRecoverObjs();}private static COSClient createCli() {// 1 初始化用户身份信息(secretId, secretKey)COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);// 2 设置bucket的区域, COS地域的简称请参照 https://www.qcloud.com/document/product/436/6224ClientConfig clientConfig = new ClientConfig(new Region(bucketRegion));clientConfig.setHttpProtocol(HttpProtocol.https);// 生成cos客户端return new COSClient(cred, clientConfig);}private static void listAndRecoverObjs() {ListVersionsRequest listVersionsRequest = new ListVersionsRequest();listVersionsRequest.setBucketName(bucketName);listVersionsRequest.setPrefix("");listVersionsRequest.setMaxResults(1000);VersionListing versionListing = null;String recover_key = "";String recover_versionid = "";boolean has_recovered = false;do {try {versionListing = cosClient.listVersions(listVersionsRequest);} catch (CosServiceException e) {e.printStackTrace();return;} catch (CosClientException e) {e.printStackTrace();return;}List<COSVersionSummary> cosVersionSummaries = versionListing.getVersionSummaries();for (COSVersionSummary cosVersionSummary : cosVersionSummaries) {String key = cosVersionSummary.getKey();String versionId = cosVersionSummary.getVersionId();boolean isDeleteMarker = cosVersionSummary.isDeleteMarker();boolean isLatest = cosVersionSummary.isLatest();String msg = String.format("list obj, Key[%s], Version[%s], isDeleteMarker[%s], isLatest[%s]", key, versionId, isDeleteMarker, isLatest);System.out.println(msg);if (isDeleteMarker && isLatest) {// 只恢复最新 versionid 为删除标记的对象recover_key = key;has_recovered = false;} else if (!isDeleteMarker && !isLatest && Objects.equals(key, recover_key) && !has_recovered) {// 既不是最新版本,也不是删除标记,如果key等于recover_key,那么说明找到了要恢复的数据版本,执行恢复逻辑recover_versionid = versionId;recoverObj(recover_key, recover_versionid);has_recovered = true;}}String keyMarker = versionListing.getNextKeyMarker();String versionIdMarker = versionListing.getNextVersionIdMarker();listVersionsRequest.setKeyMarker(keyMarker);listVersionsRequest.setVersionIdMarker(versionIdMarker);} while (versionListing.isTruncated());}private static void recoverObj(String srcKey, String srcVersionId) {String dstKey = srcKey;CopyObjectRequest copyObjectRequest = new CopyObjectRequest(new Region(bucketRegion), bucketName, srcKey, bucketName, dstKey);copyObjectRequest.setSourceVersionId(srcVersionId);try {CopyObjectResult result = cosClient.copyObject(copyObjectRequest);String msg = String.format("finish recover by copying obj, srcKey[%s], srcVersion[%s], dstKey[%s], dstVersion[%s]", srcKey, srcVersionId, dstKey, result.getVersionId());System.out.println(msg);} catch (CosServiceException cse) {cse.printStackTrace();} catch (CosClientException cce) {cce.printStackTrace();}}}
import com.qcloud.cos.COSClient;import com.qcloud.cos.ClientConfig;import com.qcloud.cos.auth.BasicCOSCredentials;import com.qcloud.cos.auth.COSCredentials;import com.qcloud.cos.exception.CosClientException;import com.qcloud.cos.exception.CosServiceException;import com.qcloud.cos.http.HttpProtocol;import com.qcloud.cos.model.CopyObjectRequest;import com.qcloud.cos.model.CopyObjectResult;import com.qcloud.cos.model.COSVersionSummary;import com.qcloud.cos.model.ListVersionsRequest;import com.qcloud.cos.model.VersionListing;import com.qcloud.cos.region.Region;import java.util.ArrayList;import java.util.List;public class RecoverObjectsDemo2 {private static String secretId = "************************************";private static String secretKey = "************************************";private static String srcbucketName = "examplebucket-backup-12500000000";private static String dstbucketName = "examplebucket-dest-12500000000";private static String srcbucketRegion = "ap-guangzhou";private static String dstbucketRegion = "ap-shanghai";private static List<String> copyobjs = new ArrayList<>();private static COSClient srcCosClient = createCli(srcbucketRegion);private static COSClient dstCosClient = createCli(dstbucketRegion);public static void main(String[] args) {listAndRecoverObjs();}private static COSClient createCli(String region) {// 1 初始化用户身份信息(secretId, secretKey)COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);// 2 设置bucket的区域, COS地域的简称请参照 https://www.qcloud.com/document/product/436/6224ClientConfig clientConfig = new ClientConfig(new Region(region));clientConfig.setHttpProtocol(HttpProtocol.https);// 生成cos客户端return new COSClient(cred, clientConfig);}private static void recoverObj(String srcKey, String srcVersionId) {String dstKey = srcKey;CopyObjectRequest copyObjectRequest = new CopyObjectRequest(new Region(srcbucketRegion), srcbucketName, srcKey, dstbucketName, dstKey);copyObjectRequest.setSourceVersionId(srcVersionId);try {CopyObjectResult result = dstCosClient.copyObject(copyObjectRequest);String msg = String.format("finish recover by copying obj, srcBucket[%s], srcKey[%s], srcVersion[%s], dstBucket[%s], dstKey[%s], dstVersion[%s]",srcbucketName, srcKey, srcVersionId, dstbucketName, dstKey, result.getVersionId());System.out.println(msg);copyobjs.add(srcKey);} catch (CosServiceException cse) {cse.printStackTrace();} catch (CosClientException cce) {cce.printStackTrace();}}private static void listAndRecoverObjs() {ListVersionsRequest listVersionsRequest = new ListVersionsRequest();listVersionsRequest.setBucketName(srcbucketName);listVersionsRequest.setPrefix("");VersionListing versionListing = null;do {try {versionListing = srcCosClient.listVersions(listVersionsRequest);} catch (CosServiceException e) {e.printStackTrace();return;} catch (CosClientException e) {e.printStackTrace();return;}List<COSVersionSummary> cosVersionSummaries = versionListing.getVersionSummaries();for (COSVersionSummary cosVersionSummary : cosVersionSummaries) {String key = cosVersionSummary.getKey();String versionId = cosVersionSummary.getVersionId();boolean isDeleteMarker = cosVersionSummary.isDeleteMarker();boolean isLatest = cosVersionSummary.isLatest();if (!isDeleteMarker) {if (isLatest) {System.out.println("latest object, will copy " + "key:" + key + ", versionId:" + versionId);recoverObj(key, versionId);} else {if (!copyobjs.contains(key)) {System.out.println("not latest object, will copy " + "key:" + key + ", versionId:" + versionId);recoverObj(key, versionId);}}}}String keyMarker = versionListing.getNextKeyMarker();String versionIdMarker = versionListing.getNextVersionIdMarker();listVersionsRequest.setKeyMarker(keyMarker);listVersionsRequest.setVersionIdMarker(versionIdMarker);} while (versionListing.isTruncated());System.out.println("--------------------------------------");}}
# -*- coding=utf-8from qcloud_cos import CosConfigfrom qcloud_cos import CosS3Clientimport sysimport osimport logging# logging.basicConfig(level=logging.INFO, stream=sys.stdout)def _recover_main(src_region, src_bucket, secret_id, secret_key, prefix):src_client = CosS3Client(CosConfig(Region=src_region, SecretId=secret_id, SecretKey=secret_key))# 列举操作的分页参数key_marker = ''versionId_marker = ''recovered_keys = set() # 用于记录已经恢复的对象while True:response = src_client.list_objects_versions(Bucket=src_bucket,Prefix=prefix,KeyMarker=key_marker,VersionIdMarker=versionId_marker,)delete_marker_keys = set()# 从 DeleteMarker 取出被删除的对象if 'DeleteMarker' in response:for version in response['DeleteMarker']:if version['IsLatest'] == 'true':delete_marker_keys.add(version['Key'])if len(delete_marker_keys) == 0:print('no delete markers found, no data to recover, continue listing')# 从 Version 取出用于恢复的对象版本if 'Version' in response:for version in response['Version']:key = version['Key']versionId = version['VersionId']if key in delete_marker_keys and not key in recovered_keys:print('recover from object: {src_bucket}/{key}(versionId:{versionId})'.format(src_bucket=src_bucket, key=key, versionId=versionId))try:src_client.copy(Bucket=src_bucket,Key=key,CopySource={'Bucket': src_bucket,'Key': key,'Region': src_region,'VersionId': versionId,})recovered_keys.add(key)print("success recover object: {src_bucket}/{key}(versionId={versionId}) => {src_bucket}/{key}".format(src_bucket=src_bucket, key=key, versionId=versionId))except Exception as e:print(e)passif response['IsTruncated'] == 'false':breakkey_marker = response['NextKeyMarker']versionId_marker = response['NextVersionIdMarker']if __name__ == '__main__':# 使用场景:# 根据源桶 src_bucket 的删除标记从历史版本里把文件恢复出来# 源桶信息src_region = 'ap-guangzhou' # 源地域src_bucket = 'bucket-1250000000' # 源桶名# 从环境变量获取密钥secret_id = os.environ['COS_SECRET_ID']secret_key = os.environ['COS_SECRET_KEY']prefix = '' # 设置要恢复的对象前缀,例如 'docs/',默认空字符串表示恢复所有对象_recover_main(src_region=src_region,src_bucket=src_bucket,secret_id=secret_id,secret_key=secret_key,prefix=prefix)
# -*- coding=utf-8from qcloud_cos import CosConfigfrom qcloud_cos import CosS3Clientimport sysimport osimport logging# logging.basicConfig(level=logging.INFO, stream=sys.stdout)def _recover_main(src_region, src_bucket, dst_region, dst_bucket, secret_id, secret_key, prefix):src_client = CosS3Client(CosConfig(Region=src_region, SecretId=secret_id, SecretKey=secret_key))dst_client = CosS3Client(CosConfig(Region=dst_region, SecretId=secret_id, SecretKey=secret_key))# 列举操作的分页参数key_marker = ''versionId_marker = ''recovered_keys = set() # 记录已经恢复的对象while True:response = src_client.list_objects_versions(Bucket=src_bucket,Prefix=prefix,KeyMarker=key_marker,VersionIdMarker=versionId_marker,)# 从 Version 取出用于恢复的对象版本if 'Version' in response:for version in response['Version']:key = version['Key']versionId = version['VersionId']if not key in recovered_keys:print('recover from object: {src_bucket}/{key}(versionId={versionId})'.format(src_bucket=src_bucket, key=key, versionId=versionId))try:dst_client.copy(Bucket=dst_bucket,Key=key,CopySource={'Bucket': src_bucket,'Key': key,'Region': src_region,'VersionId': versionId,})recovered_keys.add(key)print("success recover object: {src_bucket}/{key}(versionId={versionId}) => {dst_bucket}/{key}".format(src_bucket=src_bucket, key=key, versionId=versionId, dst_bucket=dst_bucket))except Exception as e:print(e)passif response['IsTruncated'] == 'false':breakkey_marker = response['NextKeyMarker']versionId_marker = response['NextVersionIdMarker']if __name__ == '__main__':# 使用场景:# src_bucket: 备份桶# dst_bucket: 目标桶# 目标桶(dst_bucket)里的对象被误删,遍历备份桶(src_bucket)的对象,选择非删除标记的当前版本对象,复制到目标桶(dst_bucket)从而完成恢复# 备份桶信息src_region = 'ap-guangzhou'src_bucket = 'bucket-backup-1250000000'# 目标桶信息dst_region = 'ap-guangzhou'dst_bucket = 'bucket-1250000000'# 从环境变量获取密钥secret_id = os.environ['COS_SECRET_ID']secret_key = os.environ['COS_SECRET_KEY']prefix = '' # 设置要恢复的对象前缀,例如 'docs/',默认空字符串表示恢复所有对象_recover_main(src_region=src_region,src_bucket=src_bucket,dst_region=dst_region,dst_bucket=dst_bucket,secret_id=secret_id,secret_key=secret_key,prefix=prefix)

DELETE /exampleobject?versionId=MTg0NDUxNzgyODk2ODc1NjY0NzQ HTTP/1.1Host: examplebucket-1250000000.cos.ap-beijing.myqcloud.comDate: Wed, 14 Aug 2019 12:00:42 GMTAuthorization: q-sign-algorithm=sha1&q-ak=************************************&q-sign-time=1565784042;1565791242&q-key-time=1565784042;1565791242&q-header-list=date;host&q-url-param-list=versionid&q-signature=****************************************Connection: close
HTTP/1.1 204 No Content Content-Length: 0 Connection: close Date: Wed, 14 Aug 2019 12:00:42 GMT Server: tencent-cos x-cos-delete-marker: true x-cos-request-id: NWQ1M2Y3ZWFfNzljMDBiMDlfMjkyMDJfMWRjNjVm**** x-cos-version-id: MTg0NDUxNzgyODk2ODc1NjY0NzQ
response = client.delete_object( Bucket='examplebucket-1250000000', Key='exampleobject', VersionId='string' )

PUT /exampleobject HTTP/1.1Host: destinationbucket-1250000000.cos.ap-beijing.myqcloud.comDate: Sat, 11 Apr 2020 17:51:35 GMTx-cos-copy-source: sourcebucket-1250000001.cos.ap-shanghai.myqcloud.com/example.jpg?versionId=MTg0NDUxNTc0NDYyMjQ2MzUzMjQContent-Length: 0Authorization: q-sign-algorithm=sha1&q-ak=************************************&q-sign-time=1586627495;1586634695&q-key-time=1586627495;1586634695&q-header-list=content-length;date;host;x-cos-copy-source&q-url-param-list=&q-signature=****************************************Connection: close
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 219 Connection: close Date: Sat, 11 Apr 2020 17:51:35 GMT Server: tencent-cos x-cos-copy-source-version-id: MTg0NDUxNTc0NDYyMjQ2MzUzMjQ x-cos-request-id: NWU5MjAzYTdfMWZjMDJhMDlfNTE4N18zNGU2**** <?xml version="1.0" encoding="UTF-8"?> <CopyObjectResult> <ETag>"ee8de918d05640145b18f70f4c3aa602"</ETag> <CRC64>16749565679157681890</CRC64> <LastModified>2020-04-11T17:51:35Z</LastModified> </CopyObjectResult>
response = client.copy( Bucket='examplebucket-1250000000', Key='exampleobject', CopySource={ 'Bucket': 'examplebucket-1250000000', 'Key': 'exampleobject', 'Region': 'ap-guangzhou', 'VersionId': 'String' } )

文档反馈