数据误删,跑路还是挽救?一种HBase数据误删后快速挽救方法

目 录

0 引 言

1 方法及原理

2 实 验

 3 小 结


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物理上的删除。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值