數(shù)據(jù)庫任意回退點(diǎn)的意義
數(shù)據(jù)庫的任意回退可以解決數(shù)據(jù)庫的邏輯錯(cuò)誤,找回任意需要找回的數(shù)據(jù),以保證數(shù)據(jù)庫的完整和可用。
2013年10月份濟(jì)南兒童醫(yī)院數(shù)據(jù)表丟失,急需找回。但是幾個(gè)冷備份的點(diǎn)數(shù)據(jù)表雖然在,但是表內(nèi)的數(shù)據(jù)并不是最新的。因?yàn)檫@時(shí)候要找回的數(shù)據(jù)是表,且表內(nèi)數(shù)據(jù)最新,這就需要恢復(fù)到這個(gè)表,而且是這個(gè)表內(nèi)最新數(shù)據(jù)的那個(gè)點(diǎn),這個(gè)點(diǎn)只有一個(gè),是在輸入數(shù)據(jù)的時(shí)候?qū)嶋H發(fā)生的,而不是預(yù)先設(shè)置的,因?yàn)樵谥罢l也不知道什么時(shí)候會(huì)出現(xiàn)這個(gè)故障。很顯然,要記錄這個(gè)點(diǎn)就必須事先記錄所有的變化點(diǎn)。
數(shù)據(jù)庫任意回退點(diǎn)和I/O任意回退時(shí)間點(diǎn)的區(qū)別
記錄磁盤寫入的任意點(diǎn)并不難,通過監(jiān)控block塊就可以做到。但是這些所有的變化點(diǎn)很大程度上不是應(yīng)用的可用點(diǎn)。這個(gè)應(yīng)用可以是數(shù)據(jù)庫,也可以是某種特殊的文件。
另外就算是磁盤寫入的I/O點(diǎn),都是數(shù)據(jù)庫的可用點(diǎn),也肯定不是數(shù)據(jù)庫的所有記錄寫入點(diǎn)。因?yàn)閿?shù)據(jù)庫在寫入的時(shí)候會(huì)把某些操作合并成一個(gè)I/O。打個(gè)比方來說,數(shù)據(jù)庫輸入了100條記錄,其中每5條記錄合并為了一個(gè)I/O點(diǎn),那就只有20個(gè)I/O回退點(diǎn)可以使用,而不是我們預(yù)期的100個(gè)。
而這時(shí)候我們要回退到100條中的任意某一條就無法實(shí)現(xiàn)了,因?yàn)橹挥涗浟?0個(gè)點(diǎn)。對(duì)于刪除操作亦是如此。
如何來測(cè)試區(qū)分?jǐn)?shù)據(jù)庫任意回退點(diǎn)和I/O任意回退時(shí)間點(diǎn)
首先我們進(jìn)行數(shù)據(jù)庫的數(shù)據(jù)模擬輸入,此時(shí)要注意,數(shù)據(jù)的輸入一定是沒有規(guī)則的。這和數(shù)據(jù)庫的種類以及數(shù)據(jù)庫服務(wù)器的性能有關(guān),性能越高,單位時(shí)間內(nèi)輸入的數(shù)據(jù)就會(huì)越多。有一些I/O監(jiān)控廠商為了讓I/O和數(shù)據(jù)庫的記錄點(diǎn)進(jìn)行同步,他們?cè)谧鰷y(cè)試的時(shí)候會(huì)對(duì)sql語句做手腳,比如加入“waitfor delay '00:00:01'”的語句,這實(shí)際上就是每延遲1秒輸入一條,而I/O也以秒級(jí)監(jiān)控的話,這樣數(shù)據(jù)庫的任意回退點(diǎn)和I/O的回退點(diǎn)就同步了。
但是在實(shí)際情況中,不可能我們的應(yīng)用是每延遲1秒輸入一條數(shù)據(jù)的。應(yīng)用軟件提供商不會(huì)這么寫軟件,就算這么寫了,客戶也不愿意。因?yàn)檫@是等于把數(shù)據(jù)庫以及數(shù)據(jù)庫服務(wù)器的性能閹割了!本來1秒鐘可以處理成千上萬條數(shù)據(jù),卻給限制在了1條,這種測(cè)試是不客觀的,也是嚴(yán)重不合理的。
正確的測(cè)試應(yīng)該是首先循環(huán)插入大量數(shù)據(jù)
declare @i int
set @i = 1
while @i <30000
begin
insert into test (a,b,c,d,e,f,g) values ('測(cè)試1','測(cè)試2
','測(cè)試3','測(cè)試4','測(cè)試5','測(cè)試6','測(cè)試7')
set @i = @i + 1
end
上面的30000是指插入30000條數(shù)據(jù),可以根據(jù)需求調(diào)整。后面的a,b,c,d,e,f,g是test表內(nèi)的字段,測(cè)試1-7是賦予字段的具體內(nèi)容,也可以把字段內(nèi)容根據(jù)需要調(diào)長。
按照以上的語句插入后,應(yīng)該至少有30000個(gè)回退點(diǎn),且每個(gè)回退點(diǎn)都是數(shù)據(jù)庫可用并且完整的。
插入測(cè)試完成以后,我們可以進(jìn)行刪除測(cè)試。
declare @num int
declare @datecount int
set @datecount=(select count(id) from test)
set @num=0
while
@num<@datecount
begin
delete test where id=(select top 1 id from test order by id desc )
set
@num=@num+1
End
以上語句是將表內(nèi)所有的數(shù)據(jù)倒序(正序也沒有關(guān)系)逐條刪除,同樣也應(yīng)該產(chǎn)生至少30000個(gè)回退點(diǎn),且每個(gè)回退點(diǎn)都是數(shù)據(jù)庫可用并且完整的。
只有按照上述的方法測(cè)試通過,才說明是滿足了任意時(shí)間點(diǎn)回退的要求,否則都是不合理的,是解決不了用戶實(shí)際問題的。
國產(chǎn)容災(zāi)備份軟件北京和力記易科技有限公司的UPM備特佳容災(zāi)備份系統(tǒng),完全滿足數(shù)據(jù)庫的任意時(shí)間點(diǎn)回退,可以經(jīng)得住任何的測(cè)試。有興趣的用戶不妨一試。