目 錄
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物理上的刪除。