有一種慘,叫做人還在,數(shù)據(jù)沒了
對(duì),說的就是我......
大家好,我叫王大錘,一個(gè)平平無奇的IT打工人,就職于一家創(chuàng)業(yè)公司。
說起來是創(chuàng)業(yè)公司,其實(shí)主要業(yè)務(wù)是為一家北美商務(wù)公司提供電子商務(wù)平臺(tái)開發(fā)和運(yùn)維的外包服務(wù)。
作為一名初窺門徑的數(shù)據(jù)庫DBA,我深知數(shù)據(jù)備份的重要性。畢竟,小到病毒,電源故障乃至意外操作失誤,大到自然災(zāi)害,都會(huì)影響系統(tǒng)的正常運(yùn)行,甚至造成系統(tǒng)完全癱瘓。因此,機(jī)智如我,對(duì)正在開發(fā)和維護(hù)的電子商務(wù)平臺(tái)數(shù)據(jù)庫每周一備,力圖做到有備無患。
可萬萬沒想到,數(shù)據(jù)丟失的鬼故事依舊上演了,而我正是故事的主角......
電子商務(wù)平臺(tái)使用了IBM的Informix數(shù)據(jù)庫。這款數(shù)據(jù)庫在美國還算流行,它運(yùn)行穩(wěn)定,性能也很不錯(cuò)。公司的CTO對(duì)這款數(shù)據(jù)庫很是喜歡,可能這和他之前的美國留學(xué)經(jīng)歷有關(guān)吧。但這款數(shù)據(jù)庫在國內(nèi)使用的人數(shù)不是很高,網(wǎng)上實(shí)用的資料更是少之又少。
因此,相關(guān)的數(shù)據(jù)庫運(yùn)維知識(shí)只能靠自學(xué)。好在我勤學(xué)苦練,之前公司也出現(xiàn)過由于服務(wù)器磁盤損壞而導(dǎo)致的數(shù)據(jù)庫故障,但均被我通過備份數(shù)據(jù)進(jìn)行恢復(fù),其間未丟失任何數(shù)據(jù)。工作之余,我也常常在筆記本上使用Informix數(shù)據(jù)庫模擬數(shù)據(jù)演練,運(yùn)用基于時(shí)間點(diǎn)的恢復(fù)將數(shù)據(jù)庫恢復(fù)到數(shù)據(jù)被破壞前的時(shí)刻,熟練數(shù)據(jù)還原操作,以備不時(shí)之需。
然而,就在系統(tǒng)準(zhǔn)備上線試運(yùn)行的前一天,有研發(fā)人員反饋,數(shù)據(jù)庫的一個(gè)表不見了,希望我盡快通過備份找回表數(shù)據(jù)。
作為創(chuàng)意小王子,我立即就有了一個(gè)絕佳的idea,這不就是我平時(shí)玩的基于指定時(shí)間點(diǎn)的不完全恢復(fù)嘛,解決這個(gè)問題so easy。
我當(dāng)即嘗試使用onbar工具進(jìn)行基于指定時(shí)間點(diǎn)的數(shù)據(jù)恢復(fù),可是恢復(fù)的結(jié)果不盡如人意,不是依舊找不到丟失的表,就是所找到的表中的數(shù)據(jù)不完整。
與平時(shí)演練完全不同(我在刪除表時(shí)記錄了操作時(shí)間),此時(shí)的我完全不清楚丟失的表究竟是什么時(shí)候被刪除的!
通過幾次數(shù)據(jù)恢復(fù)操作,可以確定在昨天下午15點(diǎn)時(shí)表還存在,但在凌晨12點(diǎn)時(shí),這個(gè)表已經(jīng)丟失了。通過不停地恢復(fù)嘗試(每次約半小時(shí)),可以縮小表被刪除的時(shí)間范圍。但問題關(guān)鍵在于,此時(shí)已經(jīng)沒有更多的時(shí)間讓我慢慢嘗試了。測(cè)試團(tuán)隊(duì)希望能在5個(gè)小時(shí)內(nèi)解決這個(gè)問題,否則后續(xù)的一些測(cè)試工作將無法完成。
沒有困難的工作,只有勇敢的打工人
在我發(fā)覺僅憑個(gè)人能力無法在短短5小時(shí)之內(nèi)找回丟失的數(shù)據(jù)表后,我決定尋求外援。然而,詢遍同學(xué)及大學(xué)老師,都沒有得到可行的解決辦法,這個(gè)數(shù)據(jù)庫在國內(nèi)的用戶很少,我的大學(xué)老師甚至都沒用過。上網(wǎng)查詢解決方法,有網(wǎng)友說可以通過審計(jì)日志查看表的刪除時(shí)間,可Informix的審計(jì)功能有140多項(xiàng),當(dāng)時(shí)看的我頭大,根本來不及配置審計(jì)。
難道我的數(shù)據(jù)庫DBA生涯要盡毀于此?
萬萬沒想到,最終,我還是得到了高人的幫助。
危急之時(shí),我想起了參加培訓(xùn)時(shí)認(rèn)識(shí)的金倉工程師——夏洛克·福爾摩斯·K,便抱著病篤亂投醫(yī)的心態(tài)嘗試求助。沒想到,在了解我的情況之后,福爾摩斯·K很快回應(yīng)了我的難題。他讓我先將表被刪除那段時(shí)間的邏輯日志提取出來備用,然后我們開始一起分析定位Informix表被刪除的精確時(shí)間。
與福爾摩斯·K聯(lián)合確定解決方案
對(duì)于事務(wù)型數(shù)據(jù)庫,通常都會(huì)有邏輯日志,用于記錄數(shù)據(jù)庫的各種操作。數(shù)據(jù)庫系統(tǒng)在執(zhí)行DDL操作時(shí),都會(huì)操作系統(tǒng)表。數(shù)據(jù)庫系統(tǒng)的邏輯日志中會(huì)記錄全部的DML操作,可以通過分析對(duì)系統(tǒng)表的DELETE操作,來分析用戶執(zhí)行的實(shí)際的DDL操作。
通過與福爾摩斯·K近50分鐘的電話溝通,我們初步確定如下方案:
1. 根據(jù)表的大概丟失時(shí)間段,初步確定需要分析的邏輯日志文件。
2. 使用onlog工具,將待分析的邏輯日志文件內(nèi)容由二進(jìn)制轉(zhuǎn)化為文本格式,方便后續(xù)分析。
3. 過濾邏輯日志文本中包含HDELETE關(guān)鍵字的行,提取行中的表ID數(shù)據(jù)。
4. 使用oncheck工具,將表ID轉(zhuǎn)換為實(shí)際的表名稱。
5. 定位表名稱為systables的行,記錄該行的表ID。
6. 查找關(guān)鍵字包含HDELETE和表ID行,并輸出該行的前后各n行記錄。
7. 查找搜索結(jié)果中包含被刪除表名稱的行。找到信息后,在該行的前面查找包含BEGIN關(guān)鍵字的行,該行即為刪除表的事務(wù)的開始記錄行。在該記錄行中,包含了事務(wù)的開始時(shí)間,這個(gè)時(shí)間就是表被刪除時(shí)的精確時(shí)間。
福爾摩斯·K的方案驗(yàn)證
根據(jù)與福爾摩斯·K溝通的解決方案,我開始在自己的筆記本上進(jìn)行技術(shù)驗(yàn)證。
模擬現(xiàn)場(chǎng)環(huán)境
首先編寫腳本,模擬在Informix數(shù)據(jù)庫mydb中刪除t_user表的場(chǎng)景。
在上面測(cè)試中,用戶在2022-05-09 16:49:16和2022-05-09 16:49:20之間,刪除了t_user表。
在測(cè)試中,我需要找出最后一個(gè)邏輯日志文件,用于分析t_user表的精確刪除時(shí)間。通過onstat命令可以看到,當(dāng)前的邏輯日志文件的uniqid為18。
在下面的操作中,將演示如何分析這個(gè)邏輯日志文件中的內(nèi)容,查詢到刪除表的精確時(shí)間。
使用邏輯日志,分析表的精確刪除時(shí)間
1) 轉(zhuǎn)換邏輯日志為文本格式
使用onlog命令將邏輯日志文件轉(zhuǎn)換為文本格式,并輸出到文件中。
2) 通過關(guān)鍵字搜索,確定要分析的表ID
通過過濾HDELETE關(guān)鍵字,查詢出要分析的表ID。
得到的表ID會(huì)有重復(fù),可以在去重后,用于后續(xù)的表名稱分析。
使用oncheck解析出表名稱,確定系統(tǒng)表對(duì)應(yīng)的表ID
說明:上面數(shù)據(jù)為十六進(jìn)制,在用oncheck分析時(shí),需要加上0x。
根據(jù)上面的結(jié)果,使用oncheck確定4個(gè)表的名稱。
命令會(huì)輸出表名稱,內(nèi)容如下:
我們需要關(guān)注的是指定數(shù)據(jù)庫mydb下的systables表。對(duì)于上面的結(jié)果,我們需要的表ID為0x80004b。詳細(xì)信息見下面:
4) 根據(jù)系統(tǒng)表ID分析刪除表的事務(wù)數(shù)據(jù)
本例中,用戶刪除了t_user表。需要查找80004b和HDELETE兩個(gè)關(guān)鍵字附近中包含t_user的信息。下面的命令演示查詢同時(shí)包含80004b和HDELETE兩個(gè)關(guān)鍵字行,并輸出該行的前后各10行信息(可根據(jù)實(shí)際情況適當(dāng)增加)。
在本示例中,我們只查詢到一行數(shù)據(jù),并輸出了該記錄的前后各10行記錄。通過分析輸入的文本信息,可以看到該行信息的后面包含了t_user表的名稱,說明該行即為刪除t_user表的信息。在該行的前面,對(duì)應(yīng)BEGIN關(guān)鍵字的行,為該事務(wù)的開始信息,其中包含了該事務(wù)的開始時(shí)間(05/09/2022 16:49:18)。
煩惱隨風(fēng)而逝,數(shù)據(jù)成功找回
聯(lián)合解決方案令我拍案叫絕,通過和前面測(cè)試執(zhí)行DROP TABLE時(shí)記錄的時(shí)間(2022-05-09 16:49:16到2022-05-09 16:49:20)對(duì)比,得到實(shí)際執(zhí)行DROP TABLE的時(shí)間(2022-05-09 16:49:18)完全正確。
驗(yàn)證方案正確后,我迅速通過腳本,對(duì)多個(gè)邏輯日志文件進(jìn)行篩選并進(jìn)行文本轉(zhuǎn)換。
幸運(yùn)的是,表被刪除的那段時(shí)間,電子商務(wù)平臺(tái)操作業(yè)務(wù)雖然非常多,但執(zhí)行刪除表的操作很少。通過對(duì)5個(gè)邏輯日志文件的分析,很快就精確定位了刪除表的精確時(shí)間,并順利找回了被刪除表的全部數(shù)據(jù),我司的電子商務(wù)平臺(tái)也如期上線運(yùn)行。
看到KingbaseES的數(shù)據(jù)恢復(fù)能力,我徹底服了
福爾摩斯·K的分析問題能力令我為之欽服。作為一名好學(xué)上進(jìn)的青年,在問題復(fù)盤之時(shí),亦不免對(duì)金倉數(shù)據(jù)庫心馳神往。對(duì)于此類的表刪除問題,在金倉數(shù)據(jù)庫中應(yīng)該如何去精確定位表的刪除時(shí)間呢?
福爾摩斯·K告訴我,在金倉數(shù)據(jù)庫中,雖然也可以通過分析日志來確定表的刪除時(shí)間,并恢復(fù)數(shù)據(jù)。但此類方案的處理時(shí)間通常較長(zhǎng)(整庫的不完全恢復(fù)所涉及的數(shù)據(jù)量太大,在恢復(fù)數(shù)據(jù)并導(dǎo)出后,還需再進(jìn)行一次數(shù)據(jù)庫的完全恢復(fù),并合并被刪除的數(shù)據(jù),因此耗時(shí)較長(zhǎng))。對(duì)于線上業(yè)務(wù),過長(zhǎng)的停機(jī)時(shí)間不僅會(huì)給企業(yè)帶來嚴(yán)重的經(jīng)濟(jì)損失,而且會(huì)產(chǎn)生負(fù)面的社會(huì)影響,降低企業(yè)信譽(yù)。金倉數(shù)據(jù)庫KingbaseES為解決這一難題,實(shí)現(xiàn)了數(shù)據(jù)庫閃回功能,可將表刪除的恢復(fù)時(shí)間由數(shù)小時(shí)縮短至分鐘級(jí)。
在金倉數(shù)據(jù)庫KingbaseES中使用閃回功能,只需要在kingbase.conf配置一個(gè)參數(shù)即可。
福爾摩斯·K給我做了一個(gè)演示。
他先創(chuàng)建兩個(gè)表,并插入測(cè)試數(shù)據(jù)。
然后刪除t_user表,并在t_goods表中繼續(xù)插入數(shù)據(jù)。
金倉數(shù)據(jù)庫KingbaseES提供了一個(gè)視圖,可以查詢出表的刪除信息。
如果我們需要了解表的精確刪除時(shí)間,可以直接查詢r(jià)ecyclebin視圖,快速得到表的精確刪除時(shí)間。
相比Informix數(shù)據(jù)庫的日志分析確定表刪除時(shí)間方法,這簡(jiǎn)直太便捷了。然而更方便的還在后面。
通過閃回(flashback)這一特性,恢復(fù)被刪除的表,根本無需了解表的精確刪除時(shí)間,只需要在命令中指定before drop關(guān)鍵字即可。而且,不同于使用基于時(shí)間點(diǎn)的不完全恢復(fù),使用flashback只恢復(fù)了這個(gè)被刪除的表及其數(shù)據(jù),對(duì)于在刪除表之后進(jìn)行的業(yè)務(wù)操作,則完全不受閃回操作的影響。
看了福爾摩斯·K的介紹,我深感自身能力不足,目前無法勝任公司的DBA一職,希望繼續(xù)深造提升自我,于是決定向公司的CTO辭職。
我的生涯一片無悔, 我想起那天夕陽下的奔跑,那是我逝去的青春......
后記
大家好,我叫王大錘。
萬萬沒想到,公司CTO對(duì)我的工作表示高度地認(rèn)可,并極力地挽留我。他誠懇地表示是他自己的工作不到位,才會(huì)導(dǎo)致此類問題發(fā)生。
在CTO極力地挽留和高度地認(rèn)可下,我還是留在了公司。
雖然現(xiàn)在電子商務(wù)平臺(tái)已經(jīng)成功上線,但后面隨著業(yè)務(wù)增長(zhǎng),還會(huì)面臨更多的困難。CTO希望我盡快調(diào)研,后續(xù)將電子商務(wù)平臺(tái)遷移到我們有能力運(yùn)維的數(shù)據(jù)庫平臺(tái)上。出于對(duì)福爾摩斯·K的信任和感激,我率先調(diào)研了人大金倉KingbaseES這款數(shù)據(jù)庫:
1. KingbaseES在數(shù)據(jù)保護(hù)上,做了很多工作。不但有常規(guī)的備份與恢復(fù),更提供了類似壞塊自動(dòng)修復(fù)功能,時(shí)刻保護(hù)數(shù)據(jù)安全。對(duì)于用戶表被誤刪除此類問題,可通過閃回特性直接快速恢復(fù),減少對(duì)業(yè)務(wù)的影響和用戶損失。
2. 支持集群部署,當(dāng)電子商務(wù)平臺(tái)業(yè)務(wù)增長(zhǎng)時(shí),可以通過擴(kuò)展集群節(jié)點(diǎn),滿足不斷增長(zhǎng)的業(yè)務(wù)要求。
3. 集群實(shí)現(xiàn)高可用,當(dāng)服務(wù)器或操作系統(tǒng)出現(xiàn)故障時(shí),可以自動(dòng)進(jìn)行節(jié)點(diǎn)切換,更好的支持電子商務(wù)平臺(tái)的可用性需求。可以滾動(dòng)升級(jí),在不停止業(yè)務(wù)的情況下,更換服務(wù)器硬件,升級(jí)操作系統(tǒng)或升級(jí)集群組件。通過用戶實(shí)際的驗(yàn)證,KingbaseES集群的高可用達(dá)99.999%。
4. 完善的技術(shù)支持體系,不但可以及時(shí)、高效解決客戶問題,更可為客戶規(guī)劃方案,支撐客戶不斷發(fā)展的業(yè)務(wù)需求。
5. 免費(fèi)的KCA/KCP培訓(xùn),方便我們構(gòu)建自己的技術(shù)支持團(tuán)隊(duì)。
6. 有KDMS、KDTS工具,方便將其它數(shù)據(jù)庫業(yè)務(wù)遷移到KingbaseES中。借助KFS,更可實(shí)現(xiàn)業(yè)務(wù)的無停機(jī)平滑遷移。
在金倉數(shù)據(jù)庫KingbaseES這款利器的幫助之下,相信用不了多久我就會(huì)升職加薪,當(dāng)上總經(jīng)理,出任CEO,迎娶白富美,走向人生巔峰。想想,還有點(diǎn)小激動(dòng)呢!