您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關HBase1.x中誤刪數怎么辦的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
以前常用的關系數據庫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中誤刪數怎么辦”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。