【HBase从入门到精通系列】误删数据如何抢救?
摘要:?前言 有時(shí)候我們操作數(shù)據(jù)庫(kù)的時(shí)候不小心誤刪數(shù)據(jù),這時(shí)候如何找回?mysql里有binlog可以幫助我們恢復(fù)數(shù)據(jù),但是沒(méi)有開(kāi)binlog也沒(méi)有備份就尷尬了。如果是HBase,你沒(méi)有做備份誤刪了又如何恢復(fù)呢? 數(shù)據(jù)保護(hù) 當(dāng)誤刪數(shù)據(jù)發(fā)生時(shí)候,不管三七二十一,第一要?jiǎng)?wù)是進(jìn)入hbase shell,執(zhí)行如下.
前言
有時(shí)候我們操作數(shù)據(jù)庫(kù)的時(shí)候不小心誤刪數(shù)據(jù),這時(shí)候如何找回?mysql里有binlog可以幫助我們恢復(fù)數(shù)據(jù),但是沒(méi)有開(kāi)binlog也沒(méi)有備份就尷尬了。如果是HBase,你沒(méi)有做備份誤刪了又如何恢復(fù)呢?
數(shù)據(jù)保護(hù)
當(dāng)誤刪數(shù)據(jù)發(fā)生時(shí)候,不管三七二十一,第一要?jiǎng)?wù)是進(jìn)入hbase shell,執(zhí)行如下命令:
alter 't', { NAME => 'f', KEEP_DELETED_CELLS => TRUE }如果誤刪一張表的有多個(gè)family里的數(shù)據(jù),需要都執(zhí)行一下:
alter 'tt', { NAME => 'f1', KEEP_DELETED_CELLS => TRUE }, { NAME => 'f2', KEEP_DELETED_CELLS => TRUE }設(shè)置 KEEP_DELETED_CELLS 為 True 的目的在于防止數(shù)據(jù)被物理刪除。這里有必要解釋一下HBase清理數(shù)據(jù)的原理:
- 首先HBase是一個(gè)LSM架構(gòu),不斷發(fā)生著數(shù)據(jù)文件的寫(xiě)入和合并
- 當(dāng)刪除操作發(fā)生時(shí),不會(huì)去清理數(shù)據(jù)文件中的數(shù)據(jù),而是寫(xiě)入一個(gè)刪除標(biāo)記到新文件中。
- 當(dāng)某一刻major compaction發(fā)生時(shí),在合并文件的同時(shí)會(huì)根據(jù)刪除標(biāo)記清理數(shù)據(jù),新合并出來(lái)的數(shù)據(jù)文件不會(huì)再有舊數(shù)據(jù)。
KEEP_DELETED_CELLS 的作用就是在major compaction發(fā)生的時(shí)候,決定要不要清理舊數(shù)據(jù)。這里需要注意一點(diǎn),即便 KEEP_DELETED_CELLS 設(shè)置為T(mén)rue,數(shù)據(jù)仍然會(huì)因?yàn)檫^(guò)期而被清理(HBsae表中的TTL屬性)。這個(gè)設(shè)定無(wú)可厚非,既然過(guò)期了,誤刪不誤刪也無(wú)所謂了。
數(shù)據(jù)恢復(fù)
數(shù)據(jù)恢復(fù)的前提數(shù)據(jù)沒(méi)有被物理刪除,也就是上文提及的。你只需要在查詢(xún)(Scan)的時(shí)候,指定raw模式來(lái)搜索數(shù)據(jù),就能看到被刪除的數(shù)據(jù),之后你要做就是把數(shù)據(jù)再寫(xiě)入一次。我們來(lái)看一個(gè)簡(jiǎn)單的例子,還是以hbase shell為例子:
1.首先我們準(zhǔn)備幾行數(shù)據(jù)
hbase(main):020:0> scan 't' ROW COLUMN+CELLx.row1 column=f:c1, timestamp=1528449361490, value=value1x.row2 column=f:c2, timestamp=1528449372090, value=value2x.row3 column=f:c3, timestamp=1528449378971, value=value3y.row1 column=f:c1, timestamp=1528449387923, value=value1y.row2 column=f:c2, timestamp=1528449394742, value=value2 5 row(s) Took 0.0304 seconds2.然后我們刪掉y開(kāi)頭掉數(shù)據(jù)
delete 't', 'y.row1', 'f:c1' Took 0.0212 seconds delete 't', 'y.row2', 'f:c2' Took 0.0043 seconds3.查一下,現(xiàn)在只有3行了
hbase(main):026:0> scan 't' ROW COLUMN+CELLx.row1 column=f:c1, timestamp=1528449361490, value=value1x.row2 column=f:c2, timestamp=1528449372090, value=value2x.row3 column=f:c3, timestamp=1528449378971, value=value3 3 row(s) Took 0.0079 seconds4.現(xiàn)在我們帶上raw再次查找數(shù)據(jù),不僅能看到被刪除數(shù)據(jù),還能看到刪除標(biāo)記。
hbase(main):047:0> scan 't', { TIMERANGE => [0, 1528450107075], RAW => true} ROW COLUMN+CELLx.row1 column=f:c1, timestamp=1528449361490, value=value1x.row2 column=f:c2, timestamp=1528449372090, value=value2x.row3 column=f:c3, timestamp=1528449378971, value=value3y.row1 column=f:c1, timestamp=1528449387923, type=Deletey.row1 column=f:c1, timestamp=1528449387923, value=value1y.row2 column=f:c2, timestamp=1528449394742, type=Deletey.row2 column=f:c2, timestamp=1528449394742, value=value2 5 row(s) Took 0.0091 seconds這里我設(shè)置了TIMERANGE, 指定的是數(shù)據(jù)寫(xiě)入的時(shí)間。對(duì)于我這個(gè)case其實(shí)并沒(méi)有什么用,我只是想說(shuō)明幾點(diǎn):
- 即便不設(shè)置RAW,也可以通過(guò)時(shí)間搜索到被刪數(shù)據(jù)。比如數(shù)據(jù)寫(xiě)入時(shí)間是T,delete時(shí)間是T+2,那么查找[0, T+1]的話(huà)就能看見(jiàn)數(shù)據(jù)。前提是設(shè)置了 KEEP_DELETED_CELLS=TRUE
- 如果你后續(xù)寫(xiě)入重復(fù)的Key,那你必須指定好TIMERANGE,不然你可能看到的不是原先刪除的keyVlaue。
- delete操作默認(rèn)的時(shí)間不是當(dāng)前server的時(shí)間,也不是構(gòu)造Delete對(duì)象的時(shí)間,而是被刪除的這個(gè)keyValue的寫(xiě)入時(shí)間。當(dāng)然這個(gè)得看版本,測(cè)試時(shí)候發(fā)現(xiàn)1.x和2.x還是不一樣的,有點(diǎn)坑,還以為高版本不能僅通過(guò)TIMERAGE搜素被刪數(shù)據(jù)了。
- 如果你的Delete mark的時(shí)間和數(shù)據(jù)的時(shí)間一樣,那只能通過(guò)RAW看到。
數(shù)據(jù)恢復(fù)完,建議關(guān)閉KEEP_DELETED_CELLS,節(jié)省空間,提高查詢(xún)效率。
其他
- 上文使用的是hbase shell演示,你可以使用任何語(yǔ)言的API完成上面的操作。
- 如果你使用的是云HBase,即便因?yàn)閙ajor compaction物理刪除了數(shù)據(jù),只要你開(kāi)啟了備份功能,依然可以恢復(fù)。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的【HBase从入门到精通系列】误删数据如何抢救?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 京信通信:数据智能为生产调试“增效瘦身”
- 下一篇: 阿里云商品评价解析功能示例解析