开发者社区> 只会写BUG> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【HBase从入门到精通系列】误删数据如何抢救?

简介: 前言 有时候我们操作数据库的时候不小心误删数据,这时候如何找回?mysql里有binlog可以帮助我们恢复数据,但是没有开binlog也没有备份就尴尬了。如果是HBase,你没有做备份误删了又如何恢复呢? 数据保护 当误删数据发生时候,不管三七二十一,第一要务是进入hbase shell,执行如下.
+关注继续查看

前言

有时候我们操作数据库的时候不小心误删数据,这时候如何找回?mysql里有binlog可以帮助我们恢复数据,但是没有开binlog也没有备份就尴尬了。如果是HBase,你没有做备份误删了又如何恢复呢?

数据保护

当误删数据发生时候,不管三七二十一,第一要务是进入hbase shell,执行如下命令:

alter 't', { NAME => 'f', KEEP_DELETED_CELLS => TRUE }

如果误删一张表的有多个family里的数据,需要都执行一下:

alter 'tt', { NAME => 'f1', KEEP_DELETED_CELLS => TRUE }, { NAME => 'f2', KEEP_DELETED_CELLS => TRUE }

设置 KEEP_DELETED_CELLS 为 True 的目的在于防止数据被物理删除。这里有必要解释一下HBase清理数据的原理:

  • 首先HBase是一个LSM架构,不断发生着数据文件的写入和合并
  • 当删除操作发生时,不会去清理数据文件中的数据,而是写入一个删除标记到新文件中。
  • 当某一刻major compaction发生时,在合并文件的同时会根据删除标记清理数据,新合并出来的数据文件不会再有旧数据。

KEEP_DELETED_CELLS 的作用就是在major compaction发生的时候,决定要不要清理旧数据。这里需要注意一点,即便 KEEP_DELETED_CELLS 设置为True,数据仍然会因为过期而被清理(HBsae表中的TTL属性)。这个设定无可厚非,既然过期了,误删不误删也无所谓了。

数据恢复

数据恢复的前提数据没有被物理删除,也就是上文提及的。你只需要在查询(Scan)的时候,指定raw模式来搜索数据,就能看到被删除的数据,之后你要做就是把数据再写入一次。我们来看一个简单的例子,还是以hbase shell为例子:

1.首先我们准备几行数据

hbase(main):020:0> scan 't'
ROW                                COLUMN+CELL
 x.row1                            column=f:c1, timestamp=1528449361490, value=value1
 x.row2                            column=f:c2, timestamp=1528449372090, value=value2
 x.row3                            column=f:c3, timestamp=1528449378971, value=value3
 y.row1                            column=f:c1, timestamp=1528449387923, value=value1
 y.row2                            column=f:c2, timestamp=1528449394742, value=value2
5 row(s)
Took 0.0304 seconds

2.然后我们删掉y开头掉数据

hbase(main):024:0> delete 't', 'y.row1', 'f:c1'
Took 0.0212 seconds
hbase(main):025:0> delete 't', 'y.row2', 'f:c2'
Took 0.0043 seconds

3.查一下,现在只有3行了

hbase(main):026:0> scan 't'
ROW                                COLUMN+CELL
 x.row1                            column=f:c1, timestamp=1528449361490, value=value1
 x.row2                            column=f:c2, timestamp=1528449372090, value=value2
 x.row3                            column=f:c3, timestamp=1528449378971, value=value3
3 row(s)
Took 0.0079 seconds

4.现在我们带上raw再次查找数据,不仅能看到被删除数据,还能看到删除标记。

hbase(main):047:0> scan 't', { TIMERANGE => [0, 1528450107075], RAW => true}
ROW                                COLUMN+CELL
 x.row1                            column=f:c1, timestamp=1528449361490, value=value1
 x.row2                            column=f:c2, timestamp=1528449372090, value=value2
 x.row3                            column=f:c3, timestamp=1528449378971, value=value3
 y.row1                            column=f:c1, timestamp=1528449387923, type=Delete
 y.row1                            column=f:c1, timestamp=1528449387923, value=value1
 y.row2                            column=f:c2, timestamp=1528449394742, type=Delete
 y.row2                            column=f:c2, timestamp=1528449394742, value=value2
5 row(s)
Took 0.0091 seconds

这里我设置了TIMERANGE, 指定的是数据写入的时间。对于我这个case其实并没有什么用,我只是想说明几点:

  • 即便不设置RAW,也可以通过时间搜索到被删数据。比如数据写入时间是T,delete时间是T+2,那么查找[0, T+1]的话就能看见数据。前提是设置了 KEEP_DELETED_CELLS=TRUE
  • 如果你后续写入重复的Key,那你必须指定好TIMERANGE,不然你可能看到的不是原先删除的keyVlaue。
  • delete操作默认的时间不是当前server的时间,也不是构造Delete对象的时间,而是被删除的这个keyValue的写入时间。当然这个得看版本,测试时候发现1.x和2.x还是不一样的,有点坑,还以为高版本不能仅通过TIMERAGE搜素被删数据了。
  • 如果你的Delete mark的时间和数据的时间一样,那只能通过RAW看到。

数据恢复完,建议关闭KEEP_DELETED_CELLS,节省空间,提高查询效率。

其他

  • 上文使用的是hbase shell演示,你可以使用任何语言的API完成上面的操作。
  • 如果你使用的是云HBase,即便因为major compaction物理删除了数据,只要你开启了备份功能,依然可以恢复。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
js中的数据
本文主要介绍js中的数据
22 0
云数据库HBase如何设置访问白名单?
今天这篇文章主要介绍一下如何在HBase控台上设置HBase白名单。 我们来到HBase控制台页面。 我们看到这里已经有一个按量付费的经典网络HBase集群。点击管理,进入集群详情页面。 在详情页面的第三栏网络信息的右边有一个修改网络白名单按钮,我们点击它。
1380 0
数据结构例程——非连通图的遍历
本文是[数据结构基础系列(7):图]中第7课时[非连通图的遍历]的例程。 (程序中graph.h是图存储结构的“算法库”中的头文件,详情请单击链接…) 1、非连通图的深度优先遍历——DFS #include <stdio.h> #include <malloc.h> #include "graph.h" int visited[MAXV];
1298 0
+关注
只会写BUG
郭泽晖,花名索月,目前就职于阿里云数据库团队。HBase&Cassandra contributor,热爱算法与开源技术。
11
文章
43
问答
来源圈子
更多
让用户数据永远在线,让数据无缝的自由流动
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载