今天琢磨一個(gè)問(wèn)題,在平時(shí)的工作中如果碰到一些不規(guī)范的操作,drop,truncate,delete,恢復(fù)起來(lái)還是很困難的,drop操作在Oracle中如果開(kāi)啟了recycle bin還是基本安全的,delete操作可以借助flashback delete操作,可能有些更細(xì)微的操作update,insert等等操作導(dǎo)致了問(wèn)題,需要做數(shù)據(jù)修復(fù)的時(shí)候,這個(gè)時(shí)候可以使用flashback query來(lái)輔助,如果來(lái)一個(gè)truncate,那就沒(méi)轍了,其實(shí)在truncate操作完成后,一般來(lái)說(shuō)數(shù)據(jù)還都是在數(shù)據(jù)文件里的,這個(gè)時(shí)候可以借助第三方的數(shù)據(jù)恢復(fù)工具來(lái)嘗試恢復(fù),這個(gè)時(shí)候數(shù)據(jù)恢復(fù)就不是毫秒級(jí)了,容忍度在分鐘甚至小時(shí)都是沒(méi)有辦法的事情。
不過(guò)在Oracle中,如果你之前開(kāi)啟了閃回?cái)?shù)據(jù)庫(kù)功能,那truncate的數(shù)據(jù)就能找回來(lái)了。但是話說(shuō)過(guò)來(lái),整個(gè)系統(tǒng)都讓重啟給弄停了,這個(gè)影響可能更大。如果不使用flashback database,直接通過(guò)dataguard來(lái)做時(shí)間點(diǎn)恢復(fù)或者其它的標(biāo)準(zhǔn)恢復(fù)到數(shù)據(jù)刪除之前,也是一種方法。
所以說(shuō)在Oracle中對(duì)于數(shù)據(jù)的恢復(fù)方法很多,使用場(chǎng)景也可以根據(jù)需要來(lái)選擇。
在MySQL中數(shù)據(jù)恢復(fù)可供選擇的方案相對(duì)就比較少了。不過(guò)有一個(gè)亮點(diǎn)就是MySQL中的redo日志是可讀的,mysqlbinlog可以很輕松地解析出來(lái)里面的內(nèi)容。不過(guò)truncate,drop,一些DML失誤操作場(chǎng)景來(lái)說(shuō),對(duì)于MySQL來(lái)說(shuō)就比較困難了。
一旦發(fā)生了問(wèn)題,做數(shù)據(jù)的恢復(fù)就只能借助于最近的備份了,需要相應(yīng)的備份,然后在最近的備份基礎(chǔ)上通過(guò)解析相關(guān)的binlog,直到把數(shù)據(jù)變更時(shí)間點(diǎn)的數(shù)據(jù)恢復(fù)。
這個(gè)過(guò)程總體來(lái)說(shuō)還是需要不少的時(shí)間的,首先就是判斷備份和binlog的時(shí)間點(diǎn),可以在其它測(cè)試環(huán)境中完成,需要花費(fèi)的時(shí)間應(yīng)該不短。
我想了下面這個(gè)方案,把Oracle和mysql結(jié)合起來(lái),充分利用Oracle的強(qiáng)大的閃回功能,可能這種方案對(duì)于很多數(shù)據(jù)恢復(fù)都有不少的亮點(diǎn)。
還沒(méi)有在本地測(cè)試,因?yàn)橐残枰恍╊~外的定制和數(shù)據(jù)類型映射,所以只是一個(gè)大概的思路。
首先還是保持MySQL原有的架構(gòu),一個(gè)主庫(kù),兩個(gè)備庫(kù)。因?yàn)橹鲙?kù)中的binlog是做數(shù)據(jù)同步的關(guān)鍵,所以可以考慮設(shè)置一個(gè)路徑做sql解析,sql解析還是使用binlog,然后再做適當(dāng)?shù)淖兏_@個(gè)過(guò)程可以是一個(gè)異步的過(guò)程,然后和Oracle結(jié)合起來(lái)部署到Oracle中的schema中。
MySQL中的數(shù)據(jù)量相對(duì)來(lái)說(shuō)還不是很大,所以可以考慮多個(gè)MySQL database和一個(gè)Oracle中的多個(gè)schema映射起來(lái),數(shù)據(jù)類型可以適當(dāng)做一些類型映射,比如,MySQL中的big int,small int等和Oracle中的number直接映射。varchar和varchar2映射等等。
數(shù)據(jù)到位之后,就可以考慮通過(guò)各種閃回特性來(lái)做數(shù)據(jù)的恢復(fù)了。發(fā)生了truncate之類的操作可以使用flashback database來(lái)恢復(fù),drop操作可以通過(guò)recycle bin,flashback database或者基于時(shí)間點(diǎn)等來(lái)恢復(fù)。delete可以通過(guò)閃回刪除,閃回查詢等來(lái)恢復(fù)。update可以通過(guò)閃回查詢來(lái)恢復(fù)等等。得到了相應(yīng)的技術(shù)局之后,可以直接導(dǎo)出csv文件,或者insert語(yǔ)句來(lái)。在MySQL中通過(guò)mysqlimport或者insert來(lái)完成數(shù)據(jù)的部署。
這個(gè)過(guò)程中可以使得MySQL端始終保持前行,可以打一個(gè)比方,比如一個(gè)部隊(duì)在行軍,結(jié)果突然某個(gè)軍官發(fā)現(xiàn)自己的地圖沒(méi)帶,落下半路上了,這個(gè)時(shí)候可以派一個(gè)士兵騎馬去取地圖。這個(gè)時(shí)候Oracle就是那個(gè)士兵,能夠完成這個(gè)艱巨的任務(wù),部隊(duì)依舊行進(jìn),不會(huì)產(chǎn)生其他影響。