从阿里云 oss 恢复数据库备份

内容纲要

背景

大概是因为 2 会,500px.com 被墙了,我在香港的 vps 也被封了……从朋友那弄到一个 ss 帐号翻墙,发现网站的登录验证方式也改变了,我的爬虫无法正常抓取图片了
今天改了下爬虫,使用本机 chrome 浏览器的 cookie 可以从 500px.com 抓取到图片了。这样本机抓取到的图片就比服务器上的要多一些,就用 mysqldump 把本机多出来的记录导出到 sql 脚本,然后再导入到服务器上
不幸的是这个过程出了点小问题,导致服务器上的数据被清空了

导出数据

在本机用 mysqldump 导出数据,使用 --where 选项导出部分数据

# mysqldump -u用户名 -p密码 数据库名 表名 --where="筛选条件" > 导出文件路径
mysqldump 500px image --where="create_date>='2021-04-08'" > 500px.sql

在服务器上执行 mysql 后导入脚本文件

use 500px;
source /root/500px.sql;

执行完脚本后后发现表里原有的数据全部没有了,只有新导入的数据,再看 500px.sql 脚本,才发现执行步骤是先删除 image 表,再建表然后才是执行 insert 语句

DROP TABLE IF EXISTS `image`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
 SET character_set_client = utf8mb4 ;
CREATE TABLE `image` (
......

从备份文件恢复

好在我早已未雨绸缪,每天都会将整个数据库备份并归档到阿里云 oss,可以参考文章
用阿里云 oss 保存数据库备份
现在要做的就是恢复备份,执行如下命令

ossutil64 ls oss://dbbak-refusea
LastModifiedTime                   Size(B)  StorageClass   ETAG                                  ObjectName
2021-04-08 02:00:01 +0800 CST      2748599       Archive   0C6C48EDFD920BE7B6F670C9F7A9D27C      oss://dbbak-refusea/500px.bak
2021-04-08 02:00:01 +0800 CST      4506803       Archive   EE74C72924219A77D41C080566F0BC71      oss://dbbak-refusea/wordpress.bak
Object Number is: 2

可以看到备份文件 500px.bak,先下载回来

ossutil64 cp oss://dbbak-refusea/500px.bak .
FinishWithError: Scanned 1 objects. Error num: 1. OK num: 0, Transfer size: 0.

average speed 0(byte/s)
Error: oss: service returned error: StatusCode=403, ErrorCode=InvalidObjectState, ErrorMessage="The operation is not valid for the object's state", RequestId=606E78BD14604B3535ABB02F, Bucket=dbbak-refusea, Object=500px.bak

出错了,状态码是 403,错误码是 InvalidObjectState,查看 oss 帮助文档

InvalidObjectState

  • 错误消息:The operation is not valid for the object’s state.
  • 问题原因:下载归档类型Object时,以下两种情况会导致报错无效的Object状态。
    • 未提交RestoreObject请求或者上一次提交RestoreObject已超时。
    • 已提交RestoreObject请求,但数据的RestoreObject操作还没有完成。
  • 解决方案:请参见RestoreObject进行排查。

貌似我的数据库备份文件是归档型对象,需要先执行解冻操作后才可以下载,那么就试一下

# 解冻
ossutil64 restore oss://dbbak-refusea/500px.bak

0.072099(s) elapsed

# 下载失败,解冻未完成
ossutil64 cp oss://dbbak-refusea/500px.bak .
FinishWithError: Total num: 1, size: 2,748,599. Error num: 1. OK num: 0, Transfer size: 0.

average speed 0(byte/s)
Error: oss: service returned error: StatusCode=403, ErrorCode=InvalidObjectState, ErrorMessage="The operation is not valid for the object's state", RequestId=606E9E389C0E8332394D64BE, Bucket=dbbak-refusea, Object=500px.bak

# 再执行一次解冻
ossutil64 restore oss://dbbak-refusea/500px.bak

0.032204(s) elapsed

# 下载成功
ossutil64 cp oss://dbbak-refusea/500px.bak .
Succeed: Total num: 1, size: 2,748,599. OK num: 1(download 1 objects).

average speed 15355000(byte/s)

0.179397(s) elapsed

# 查看本机目录,备份文件已下载
ll
total 2692
-rw-r--r-- 1 root root 2748599 Apr  8 14:10 500px.bak
-rw-r--r-- 1 root root     242 Apr  8 02:00 ossutil.log

恢复数据

从阿里云 oss 恢复数据库备份

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Scroll to top
粤ICP备2020114259号 粤公网安备44030402004258