軟件測試數據庫中簡單實現Standby Sql Server數據庫
一、為什么要備份數據庫?
在現實IT世界里,我們使用的服務器硬件可能因為使用時間過長,而發生故障;
Windows系列服務器有可能藍屏或者感染病毒;SQL Server數據庫也可能因為誤操作或Bug而停止運行。
如何有效備份SQL Server數據庫,避免故障真正發生時長時間的宕機,是每個系統管理員必須面對的任務。
二、簡單實現Standby Sql Server 數據庫的原理
我這里介紹一種不需要多大硬件投入(只需一臺專用或兼用備份服務器)的Standby SQL Server的簡單配置和使用方法。
數據庫完全備份和日志備份文件通過Msdos下xcopy命令從工作環境復制到備份環境(比在SQL Server里設置日志轉移方法要簡單得多),備份環境再根據xcopy過來的備份文件設定作業(執行一些存儲過程)來完成自動恢復操作。
如果意外發生時,這樣的備份體系當然還需要人為地來干預和恢復(如改變備份機器的IP地址和主機名或更改應用程序的連接數據庫參數等),會丟失一些數據也在所難免。
下面是我的測試環境Standby SQL Server備份體系圖:
三、備份和恢復案例介紹
首先我們要了解系統所能承受的最長宕機時間是多少(假如是1小時),能承受的數據丟失最多是多少(假如是30分鐘),用它來定下備份和恢復的目標:
工作環境下的某一個SQL Server數據庫(假如是db_test)必須設置成完全故障還原模式;
然后在數據庫維護計劃里設定每天凌晨四點做一次完全數據庫備份(每天從0:00開始,每20分鐘做一次數據庫日志文件的備份,直到23:59分);
備份目錄下只保留最近一天內的完全備份和日志備份文件;并把此目錄共享。
備份環境下的服務器在[控制面板]->[任務計劃]里添加一個每天0:05分開始,每20分鐘執行一次的xcopy局域網上備份目錄下最新文件的任務,直到23:59分。
xcopy \\192.168.0.1\db_test_backup\ F:\backup_data\db_test\ /c /y /d /s
備份服務器上SQL Server根據復制過來的備份文件,也每天0:10分開始,每20分鐘執行一次由舊到新,逐一恢復數據庫的作業(調用我改寫的過程sp_RestoreDir實現);
另外還有一個刪除備份服務器兩天前備份文件的作業(調用我寫的過程p_delete_db_test_backup實現),避免備份硬盤扇區被裝滿。
過程sp_RestoreDir的源代碼:
if exists ( SET QUOTED_IDENTIFIER OFF /***************************************************************************************/ CREATE proc sp_RestoreDir --If a directory for the Log file is not supplied then use the data directory set nocount on declare @filename varchar(40), create table #dirList (id [int] IDENTITY (1, 1) NOT NULL , filename varchar(100)) --Get the list of database backups that are in the restoreFromDir directory order by date desc set @i_exist=0 -- 找到備份目錄下次新的2個文件名, 不處理最新的, 避免最新備份好的物理文件沒有完全復制成功 begin open BakFile_csr fetch BakFile_csr into @filename while @@fetch_status = 0 -- 判斷恢復日志表restore_log存在否,不存在則創建表 -- 判斷此備份文件有無在恢復日志表里記錄過? -- 根據備份目錄下的物理文件名, 找到對應的邏輯名等參數 insert #filelist exec ( @cmd ) if right(@filename,3)='TRN' select @cmd = "RESTORE Log " + @dbName + print '' select @cmd = "RESTORE DATABASE " + @dbName + print '' open DataFileCursor while @@fetch_status = 0 end -- DataFileCursor loop close DataFileCursor select @cmd = @cmd + ' REPLACE' IF @@ERROR=0 truncate table #filelist fetch BakFile_csr into @filename end -- BakFile_csr loop close BakFile_csr drop table #dirList return GO |
過程p_delete_db_test_backup的源代碼:
if exists ( create PROCEDURE dbo.p_delete_db_test_backup |
四、結束語
這里介紹的簡單實現Standby Sql Server數據庫方法在我的工作環境也是運行良好的。
它沒有主從服務器之間明顯的依賴關系,沒有復雜的配置,只要我們定好備份和恢復時間計劃表,就可以簡單實現實時備份數據庫的目的了。
文章來源于領測軟件測試網 http://www.kjueaiud.com/