目 录
0 引 言
数据误删是一个老生常谈的问题,在不同的数据库中有不同的恢复策略,那么数据误删后如何第一时间抢救呢?以保证损失最小呢?。本文针对HBase数据库数据误删后进行分析,阐述了如果没有提前做好备份策略情况下,数据误删后,如何快速挽救的问题。文中分析了HBase中数据删除的基本原理,给出了如何在第一时间抢救方法,并进行了实验验证,读者可根据本文步骤进行尝试。
1 方法及原理
(1)方法
设置 KEEP_DELETED_CELLS 为 True。其目的在于防止数据被物理删除。
(2)HBase清理数据的原理
- 当删除操作发生时,只是标记删除,不会立即去清理数据文件中的数据,而是写入一个删除标记到新文件中,客户端再次查询数据时只是请求不到数据,返回为空。
- 数据真正删除时是发生在major compaction时候,在此时会根据删除标记清理数据。
- 合并操作具体如下图所示:
- 参考链接:https://blog.csdn.net/godlovedaniel/article/details/104533109
- KEEP_DELETED_CELLS 的作用就是在major compaction发生的时候,决定要不要清理旧数据,当设置为true时,此时不会被物理删除。
- 这里需要注意一点,即便 KEEP_DELETED_CELLS 设置为True,数据仍然会因为过期而被清理(HBsae表中的TTL属性)。既然过期了,误删不误删也无所谓了。
2 实 验
(1)数据准备。有如下所示的一张表
(2)删掉1002的数据 。操作如下:
(3)查看数据。可以看到数据已经被删除,具体如下图所示:
(4)快速恢复误删的数据
步骤3对数据进行了误删,为了挽救刚才的误删的数据,可以立即执行如下语句。
alter 'student', { NAME => 'infor', KEEP_DELETED_CELLS => TRUE }
具体执行情况如下图所示:
hbase(main):018:0> alter 'student', { NAME => 'infor', KEEP_DELETED_CELLS => TRUE }
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 3.1950 seconds
注意:如果此时该表中有多个列簇,有几个列簇就需要对每个列簇进行 KEEP_DELETED_CELLS => TRUE的操作 。如
alter 'student', { NAME => 'infor', KEEP_DELETED_CELLS => TRUE },{ NAME => 'info', KEEP_DELETED_CELLS => TRUE }
(5) 再次查询数据。
利用raw操作,查询数据,不仅能看到被删除数据,还能看到删除标记。具体如下图所示:
这样,被删除的数据在基于时间的历史数据查询中依然可见(当然要保证delete mark的时间戳不在历史查询的时间范围内)。在上述的例子中,表中添加KEEP_DELETED_CELLS => TRUE这个属性后,查询[0,T+1)时间段的数据如果返回C,那么查询[0,T+X+1)时间段的数据将不会返回C,因为在该时间点,C也已经被删除了。
如上述案例中指定时间查询范围为[0,1586168917520],则查询结果如下:
hbase(main):037:0> scan 'student',{TIMERANGE => [0,1586168917520]}
ROW COLUMN+CELL
1001 column=infor:age, timestamp=1583069359770, value=18
1001 column=infor:name, timestamp=1583069932711, value=xiaoyanjing
1001 column=infor:sex, timestamp=1583069340807, value=male
1002 column=infor:age, timestamp=1583069391977, value=18
1002 column=infor:name, timestamp=1583069369971, value=guozi
1002 column=infor:sex, timestamp=1583069383057, value=male
2 row(s) in 0.0190 seconds
当指定时间范围为 [0,1586168925295]时查询结果如下:
hbase(main):036:0> scan 'student',{TIMERANGE => [0,1586168925295]}
ROW COLUMN+CELL
1001 column=infor:age, timestamp=1583069359770, value=18
1001 column=infor:name, timestamp=1583069932711, value=xiaoyanjing
1001 column=infor:sex, timestamp=1583069340807, value=male
1002 column=infor:name, timestamp=1583069369971, value=guozi
1002 column=infor:sex, timestamp=1583069383057, value=male
注意点:
- 需要通过TIMERANGE形式查看数据。使用TIMERANGE查看数据需要设置时间范围在标记删除时间之前的范围,否则无法查看到数据。
- 通过相关的数据恢复工具将数据恢复完后记得关闭KEEP_DELETED_CELLS,这样节省空间,提高查询效率。
3 小 结
本文分析了数据误删后第一时间抢救的策略。具体可以通过设置表的属性KEEP_DELETED_CELLS 为TRUE进行快速抢救,避免HBase物理上的删除。