这篇文章给大家分享的是有关HBase1.x中误删数怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
创新互联公司2013年至今,先为平和等服务建站,平和等地企业,进行企业商务咨询服务。为平和企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
以前常用的关系数据库MySQL、oracle 误删除后,都可通过各种方式进行数据的恢复,而HBase中如果我们误删除了表中的一行或者一行中的几列数据能不能恢复呢?答案是肯定的,HBase可设置KEEP_DELETED_CELLS 为 True 的目的在于防止数据被物理删除:
先来说下HBase的两个属性:KEEP_DELETED_CELLS和TTL
1.创建表时指定列族的TTL[time to live]存活时间 10s -- 表中改列族所有数据,仅存活7秒
hbase(main):002:0> create 'ljs:testTable2',{NAME=>'columnFamily1', TTL=> 10, VERSIONS=>3}
2..创建表时指定 KEEP_DELETED_CELLS[删除key之后,数据是否还在内存保留,但是TTL设置之后,这里到了TTL设置的10s时间后,仍然会删除]
hbase(main):002:0> create 'ljs:testTable2',{NAME=>'columnFamily1', TTL=> 10, VERSIONS=>3 , KEEP_DELETED_CELLS => true}
TTL和KEEP_DELETED_CELLS差异
a.创建表时,可以指定TTL和KEEP_DELETED_CELLS,TTL的强制性要大于KEEP_DELETED_CELLS
b.当指定了TTL,那么到TTL指定时间,全表数据都会被删除,从hbase上清除
c.当指定了KEEP_DELETED_CELLS = true[默认值], 删除[delete]的数据仍然在hbase中,即使flush,也没有删除。使用原生扫描,是可以查到的
d.当指定了KEEP_DELETED_CELLS = false,同时flush,数据就会被删除,hbase没有保留。原生扫描也查不到数据了
下面开始讲数据误删恢复:
当误删数据后,第一时间登陆hbase shell,执行以下命令:
误删几个列族数据就对几个列族执行以下命令,这里误删除两个列族colunmFamily1,columnFamily2:
alter'ljs:testTable2', { NAME => 'columnFamily1', KEEP_DELETED_CELLS => TRUE }, { NAME => 'columnFamily2', KEEP_DELETED_CELLS => TRUE }
HBase随着数据的写入和合并发生清理时,不会去清理数据文件中的数据,而是写入一个删除标记到新文件中。当某一刻major compaction发生时,在合并文件的同时会根据删除标记清理数据,新合并出来的数据文件不会再有旧数据。
KEEP_DELETED_CELLS 的作用就是在major compaction发生的时候,决定要不要清理旧数据。这里需要注意一点,即使 KEEP_DELETED_CELLS 设置为True,数据仍然会因为过期而被清理(HBsae表中的TTL属性)。这个设定无可厚非,既然过期了,误删不误删也无所谓了。
下面用实际操作演示一下:
1.准备数据:
hbase(main):009:0> scan 'testTable2'ROW COLUMN+CELL row001 column=columnFamily1:column1, timestamp=1580948919942, value=value001 row001 column=columnFamily1:column2, timestamp=1580948927665, value=value002 row001 column=columnFamily2:column1, timestamp=1580948939101, value=value021 row001 column=columnFamily2:column2, timestamp=1580948945476, value=value022 row002 column=columnFamily1:column1, timestamp=1580948964943, value=value201 row002 column=columnFamily1:column2, timestamp=1580948972598, value=value202 2 row(s) in 0.0580 seconds
2.删除row002的数据:
hbase(main):010:0> delete 'testTable2','row002','columnFamily1:column1'
0 row(s) in 0.0640 seconds
hbase(main):011:0> delete 'testTable2','row002','columnFamily1:column2'
0 row(s) in 0.0220 seconds
hbase(main):012:0> scan 'testTable2'
ROW COLUMN+CELL
row001 column=columnFamily1:column1, timestamp=1580948919942, value=value001
row001 column=columnFamily1:column2, timestamp=1580948927665, value=value002
row001 column=columnFamily2:column1, timestamp=1580948939101, value=value021
row001 column=columnFamily2:column2, timestamp=1580948945476, value=value022
1 row(s) in 0.0570 seconds
3.scan时可以设置是否开启Raw模式,开启Raw模式会返回包括已添加删除标记但是未实际删除的数据现在我们指定RAW属性,重新scan这张表:
不仅能看到原来的数据,还多了一行含有DeleteColum标签的已删除数据。
4.下面你就可以根据自身需要重新put已删除插入数据即可,这里就不在执行操作了。
感谢各位的阅读!关于“HBase1.x中误删数怎么办”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!