數據誤刪,跑路還是挽救?一種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物理上的刪除。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章