Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >通过COS多版本功能快速批量恢复数据

通过COS多版本功能快速批量恢复数据

原创
作者头像
wainsun
修改于 2023-05-11 09:43:33
修改于 2023-05-11 09:43:33
89101
代码可运行
举报
运行总次数:1
代码可运行

问:线上的业务最怕什么?

答:误删除数据。

继续问:比误删除数据还可怕的是什么呢?

答:删除后无法找回!

COS对象存储有11个9的数据保障级别,但是不保障主动删除的数据,如果真是手欠清空了存储桶。那么真的是无法挽回了。

所以数据备份的事情,一定要防患于未然,提前做好高可用架构。COS产品官网上有详细的高可用架构说明文档https://cloud.tencent.com/document/product/436/37709

以上的理论内容,咱们就不详细说了。这里介绍一下,当真的手残点击了当前桶和备份桶的删除动作后,我们继续多版本的高可用架构如何可以快速的恢复我们想要的数据。

这里介绍一下快速恢复的方案。总结成一句话:遍历所有目标对象,找到第一个非删除版本的数据对象进行拷贝。

场景

  • 第一条为删除标记,第二条为最新版本数据,第三条为次新版本数据。
  • 第一条为最新版本数据。
  • 第一条为最新版本数据,第二条为次新版本是数据。
  • 第一条为删除标记,第二条为删除标记,第三条为最新版本数据,第四条为次新版本数据。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
final int maxKeyNum = 400;
ListVersionsRequest listVersionsRequest = new ListVersionsRequest();
listVersionsRequest.withBucketName(srcbucket).withPrefix(keyPrefix).withMaxResults(maxKeyNum);

VersionListing versionListing = cossrcclient.listVersions(listVersionsRequest);
List < String > objectlist = new ArrayList < String > ();

int i = 0;
while (true) {
    List < COSVersionSummary > versionSummaries = versionListing.getVersionSummaries();

    for (COSVersionSummary versionInfo: versionSummaries) {
        // 对相同可key的文件list出来的顺序是版本号由近到远
        i++;

        String versionId = versionInfo.getVersionId();
        String key = versionInfo.getKey();
        long expectedLength = versionInfo.getSize();
        String expectedEtag = versionInfo.getETag();
        Boolean islatest = versionInfo.isLatest();
        Owner owner = versionInfo.getOwner();
        String getStorageClass = versionInfo.getStorageClass();
        Boolean isDeleteMarker = versionInfo.isDeleteMarker();

        System.out.println("Id:" + i); //ID
        System.out.println("versionId:" + versionId); //版本ID
        System.out.println("key:" + key); //对象全称
        System.out.println("islatest:" + islatest); //是否最新
        System.out.println("isDeleteMarker:" + isDeleteMarker); //是否有删除标记
        System.out.println("expectedLength:" + expectedLength); //对象大小
        System.out.println("expectedEtag:" + expectedEtag); //Etag值
        System.out.println("Owner:" + owner.getId() + ":" + owner.getDisplayName()); //资源拥有者ID和名称
        System.out.println("getStorageClass:" + getStorageClass); //对象类型

        if (isDeleteMarker == false) //标记不是删除标记的记录
        {
            if (islatest == true) //标记是最新的记录
            {
                System.out.println("最新版文件,拷贝" + "key:" + key + ",version:" + versionId);
                copyObjectRequest(cosdstclient, srcappid, srcbucket, key, versionId, dstbucket, key);
                objectlist.add(key);
            } else {
                if (!copiedobject(key, objectlist)) {
                    System.out.println("次新文件,拷贝" + "key:" + key + ",version:" + versionId);
                    copyObjectRequest(cosdstclient, srcappid, srcbucket, key, versionId, dstbucket, key);
                    objectlist.add(key);
                }

            }
        }
    }
    if (!versionListing.isTruncated()) {

        break;
    }
    versionListing = cossrcclient.listNextBatchOfVersions(versionListing); //列出下一批版本
    System.out.println("--------------------------------------");
}

这个方法的作用是,while每次400条遍历所有的目标对象。

1.当有DeleteMarker标记时则跳过操作。

2.当islastest为true时,说明这是一个最新版本的数据对象。则进行复制操作。

3.当既不是deletemarker标签,也不是islastest最新版时。我们会找到第一个数据对象,作为筛选后的最新版实体数据,进行复制。

4.复制操作完成后,对象名称加入objectlist,避免再次被覆盖,也就是说,每一个对象,最多只会操作一次复制。

通过这个逻辑,我们只要找到第一个有实体数据的对象,做复制操作,就可以实现所有最新版的复制功能,实现批量的数据恢复

以下是已复制的object列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static Boolean copiedobject(String object, List < String > objectlist) {
    for (int i = 0; i < objectlist.size(); i++) {
        //System.out.println("object:"+object);
        //System.out.println("objectlist.get(i):"+objectlist.get(i));
        if (object.equals(objectlist.get(i))) {
            return true;
        }
    }
    return false;
}

测试一下,我们做了一份桶的数据清单,如下

备份桶文件列表

这里模拟各种删除场景,之后执行批量恢复脚本,执行结果如下

脚本执行结果

完成后在目标桶查看

目标桶恢复的对象列表

验证成功。

java脚本文件:https://wainsun-1253985742.cos.ap-beijing.myqcloud.com/%E8%84%9A%E6%9C%AC%E6%96%87%E4%BB%B6/DisasterRecovery.rar

python脚本链接:https://github.com/shezhangjun/TencentCOS/tree/master/Python_SDK/COS_Disaster_Recovery

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前端动画实现笔记
动画:动画是通过快速连续排列彼此差异极小的连续图像来制造运动错觉和变化错觉的过程。
赤蓝紫
2023/01/02
1.7K0
前端动画实现笔记
【CSS】1088- CSS 快速实现烟花绽放
什么样的场景决定使用什么样的动画。比如一些比较轻量、装饰性的动画,CSS 动画就足够了,而一些对动画要求比较高的运营活动,创意小游戏等,JS 动画肯定是首选,必要情况下还需要借助一些图形库,比如 Pixi.js。
pingan8787
2021/10/08
1.4K0
【CSS】1088- CSS 快速实现烟花绽放
网易新闻《娱乐圈画传》H5的动画技巧
今天看到一个非常喜欢的H5,又是网易出品的!于是,我忍不住去研究了他的实现方式,有3个值得我们学习的地方,分别是逐帧动画,多种变换叠加的css动画,还有最亮的:画中画动画的实现方式,下文将分享技术实现方式。 实验环境,采用chrome开发者工具: 一、逐帧动画 这个h5,几乎没有采用gif图片,大部分采用css的方式实现的逐帧动画。 比如上图,每一帧的尺寸是500px 1000px,共有8帧,存成雪碧图的形式。 CSS雪碧 即CSS Sprite,也有人叫它CSS精灵,是一种CSS图像合并技术,
mixlab
2018/04/17
9820
网易新闻《娱乐圈画传》H5的动画技巧
HTML5骨骼动画Demo | 使用min2d、createjs、pixi播放spine动画
Spine做骨骼动画是比较流行的,使用起来可能相对复杂,但功能毕竟强大,所以市场占有率较大。 在unity、cocos2d、starling中使用spine已经很成熟了,而HTML5这一块可能刚刚起步,暂时spine对这一块也没有做得非常完善。 整理了一下,找了一些比较好的方法,分享一下。 createjs 这是HTML5动画引擎比较好用,也比较小的一个,如果项目纯碎为了播放骨骼动画,而不是一个游戏,强烈推荐用这个。缺点是对webgl支持不好,官方也没什么动作去做好webgl的支持。 代码比较复杂,是我从g
用户1258909
2018/07/03
6.2K0
【效果高能】你不知道的 Animation 动画技巧
在大多数需求中,css3 的 transition / animation 都能满足我们的需求,并且相对于 js 实现,可以大大提升我们的开发效率,降低开发成本。
一只图雀
2020/11/03
1.7K0
【效果高能】你不知道的 Animation 动画技巧
一个栗子带你上手CSS3动画
本篇文章介绍CSS动画的各种知识, 补间动画,逐帧动画,动画原则, 并且通过一个实际例子彻底理解CSS动画.
winty
2020/02/25
5840
Css3新特性应用之过渡与动画
一、缓动效果 学习和利用贝塞尔曲线,默认支持ease,ease-in,ease-out,ease-in-out和linear等 还提供一个cubic-beizer自定义贝塞尔曲线的起点和终点 Css中只支持一条贝塞尔曲的运动,不能连续多段 对cubic-beizer中控制锚点的水平坐标与垂直坐标互换,就可以得到任何调整函数的反向版本 cubic-beizer(.1,.25,1,.25)是ease的反向调整函数 水平坐标只能在0~1的范围内,因为水平坐标表示的是时间 垂直坐标可以超过此范围,表示为运动距离
sam dragon
2018/01/17
1.1K0
小程序基于DOM的小镇游戏开发
需要开发一个小镇游戏,包含建造建筑、升级建筑、建筑生产金币、收金币等功能。整体复杂度不是太高,主要是建筑的循环动画和地图上小车、风车等小元素的动画,所以考虑使用DOM+CSS3动画来实现。
790531192
2022/02/07
1K0
小程序基于DOM的小镇游戏开发
动画:从 AE 到 Web,‘甩锅’给设计师
接下来因工作调整,应该就很少接触 H5 开发了。借此机会总结对动画的一些个人思考。
用户4962466
2019/08/02
3.5K0
一篇文章教会你使用html+css3制作GIF图
生活中经常会见到很多gif图,那么gif图到底是什么?GIF是一种位图。简单来说就是通过每一张张静图,通过控制它的关键帧,从而达到静态图动起来的效果。
前端皮皮
2020/11/26
1.3K0
一篇文章教会你使用html+css3制作GIF图
骨骼动画初体验
运营需求的一个重要核心功能在于页面内指定内容可配置,比如:头图、不同情况的提示文案等都可以支持根据运营同学的配置随时更改,提供灵活性。 但是这种配置的方式也出现了遇到难题的情况, 图片中包含复杂特效的情况往往会选择直接用视觉同学导出的gif动图, 问题在于页面中涉及的动图量大加载成本大大提高的问题。 为了尝试既维持灵活可配 & 减少加载成本,加下来介绍下骨骼动画的方案。
零式的天空
2022/03/25
1.5K0
animation动画实践
由于业务关系,有幸参与腾讯课堂app下载页面制作,原则上ie8、9可表现为静态版本,而高级浏览则为动画版本。在这把一些重要思想和中间遇到的一些问题记录下,以供知识积累及讨论交流。 区分浏览器 既然要实
IMWeb前端团队
2017/12/28
1.5K0
animation
因为渲染引擎可以通过跳帧(frame-skipping)及其它技术来确保性能尽量流畅
ayqy贾杰
2023/03/15
1.2K0
animation
手把手教你实现「京喜工厂」的CSS动画效果
今年Q1(2020年第一季度)参与了京喜事业部「京喜工厂」业务的前端开发。用户可以通过「京喜工厂」参与口罩、抽纸、大米等商品的“在线生产”,既能趣味造物,又能免费领奖品。目前可以通过「京喜」小程序首页访问该活动。
WecTeam
2020/05/21
1.6K0
前端都要了解的2D游戏化互动入门基础
现在越来越多的公司和APP开始使用游戏化的方式去做产品了,所谓游戏化,是指在非游戏环境中将游戏的思维和游戏的机制进行整合运用,以引导用户互动和使用的方法。支付宝里面的蚂蚁庄园、蚂蚁森林,通过游戏和公益的结合实现用户的留存和活跃。淘宝支付宝的芭芭农场、京东的东东果园、拼多多的多多果园、美团的小美果园...无一不是通过游戏化的方式去提升用户留存的方案。
ConardLi
2021/09/29
1.7K0
前端都要了解的2D游戏化互动入门基础
【前端动画】实现动画的6种方式
javascript 实现动画通常会导致页面频繁性重排重绘,消耗性能,一般应该在桌面端浏览器。在移动端上使用会有明显的卡顿。(❤️ 现在关注【前端修罗场】,后台回复【666】,即可获取一份【免费的优质学习资料】,一起学习,一起进步~)
前端修罗场
2023/10/07
6040
2019年了,你还不会CSS动画?
今年我面试了很多同学,只要看到简历上写“熟练掌握CSS3”的,我都会问问动画相关知识。然而我发现:都 2019 年了,还有很多同学不会 CSS 动画。
Nealyang
2019/11/04
5020
前端动画实现 - 笔记
无论动画多么简单,始终需要定义两个基本状态,即开始状态和结束状态。没有它们,我们将无法定义插值状态,从而填补了两者之间的空白。
TagBug
2023/03/17
2.4K0
前端动画实现 - 笔记
rem逐帧动画与像素精度计算
前段时间(很长的一个时间区间),接手了一个产品的活动运营需求。设计要求要有精妙的动态效果,大概长这个样子:
IMWeb前端团队
2019/12/03
1.6K0
rem逐帧动画与像素精度计算
【前端攻略--HTML/CSS】这是你需要的transform学习教程
transition语法格式:transition: property duration timing-function delay;
野原测试开发
2019/07/10
1K0
相关推荐
前端动画实现笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验