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