在SQL Server 2000中,有無數(shù)種備份數(shù)據(jù)庫的方法。無論你的數(shù)據(jù)庫有多大、改動(dòng)是否頻繁,都有滿足你的需求的備份策略。讓我們看看幾種能在不同環(huán)境下工作的基本備份策略。 本文假定你有備份數(shù)據(jù)庫的權(quán)限。也就是說,你要么是系統(tǒng)管理員,要么是db_owner或backupadministrator。更有,我們還假定你的操作系統(tǒng)提供了訪問備份所需要的資源的權(quán)利,例如,訪問磁盤或磁帶驅(qū)動(dòng)器。 從哪兒開始 在你開始備份一個(gè)SQL Server數(shù)據(jù)庫之前,你需要知道該數(shù)據(jù)庫使用了哪個(gè)恢復(fù)模型。這里有三種不同的恢復(fù)模型:FULL、BULK_LOGGED和SIMPLE。 FULL恢復(fù)模型向你提供了最大的恢復(fù)靈活性。新數(shù)據(jù)庫默認(rèn)使用的就是這種恢復(fù)模型。利用這種模型,你能恢復(fù)數(shù)據(jù)庫的一部分或完全恢復(fù)。假設(shè)交易記錄(transactions log)還沒有被破壞,你還能在失敗之前恢復(fù)出最后一次的已提交(committed)交易。在所有的恢復(fù)模型中,這種模型使用了最多的交易記錄空間,并輕微影響了SQL Server的性能。 BULK_LOGGED恢復(fù)模型比FULL模型少了一些恢復(fù)選項(xiàng),不過進(jìn)行批操作(bulk operation)時(shí)他不會(huì)嚴(yán)重影響性能。在進(jìn)行某些批操作時(shí),由于他只需記錄操作的結(jié)果,因此他使用了較少的記錄空間。然而,用這種模型,你不能恢復(fù)數(shù)據(jù)庫中的特定標(biāo)記,也不能僅僅恢復(fù)數(shù)據(jù)庫的一部分。 SIMPLE恢復(fù)模型是這三種模型中最容易實(shí)施的,他所占用的存儲(chǔ)空間也最小。然而,你只能恢復(fù)出備份結(jié)束時(shí)刻的數(shù)據(jù)庫。 為了找出你所用數(shù)據(jù)庫的恢復(fù)模型,能運(yùn)行下面的命令,該命令應(yīng)該返回FULL、BULK_LOGGED和SIMPLE這三個(gè)值中的某一個(gè): SELECT dbpropertyex("database", "recovery") 為了改動(dòng)數(shù)據(jù)庫的恢復(fù)選項(xiàng),運(yùn)行下面的命令: ALTER DATABASE database name SET RECOVERY {FULL | SIMPLE | BULK_LOGGED} 除數(shù)據(jù)之外,SQL Server備份還包括數(shù)據(jù)庫大綱(schema)和數(shù)據(jù)庫元數(shù)據(jù)(即數(shù)據(jù)庫文件、文件組和他們的位置)。SQL Server允許在備份時(shí)用戶依然使用數(shù)據(jù)庫,所以在備份期間發(fā)生的交易也記錄到備份中去了。 備份數(shù)據(jù)庫 為了備份數(shù)據(jù)庫,你能運(yùn)行BACKUP命令。(你也能使用SQL Enterprise Manager。)在執(zhí)行命令之前知道他的語法永遠(yuǎn)是個(gè)好主意。BACKUP命令有許多選項(xiàng),他的基本語法是: BACKUP DATABASE { database_name } TO < backup_device > | backup_device能是磁盤或磁帶??或他也能是個(gè)用磁盤文件、磁帶或已命名管道表示的邏輯上的備份設(shè)備。 如果你想做一個(gè)快速、一次性的備份,那么向下面那樣使用磁盤文件: BACKUP DATABASE Northwind TO DISK = "c:\backup\Northwind.bak" 如果你想把數(shù)據(jù)庫備份到另外一臺(tái)服務(wù)器上,能使用UNC名字: BACKUP DATABASE Northwind TO DISK = "\\FILESERVER\Shared\Backup\Northwind.bak" 如果想進(jìn)行有規(guī)律、有計(jì)劃的備份,就需要使用邏輯備份設(shè)備。一個(gè)邏輯備份設(shè)備能保存若干個(gè)數(shù)據(jù)庫備份并駐留在磁盤、磁帶或已命名管道上。如果你使用磁帶設(shè)備,磁帶驅(qū)動(dòng)器必須在同一臺(tái)物理服務(wù)器上。已命名管道能利用第三方備份軟件。 為了創(chuàng)建邏輯備份設(shè)備,使用sp_addumpdevice系統(tǒng)保存過程。SQL Enterprise Manager也能用來創(chuàng)建備份設(shè)備。命令行語法如清單A所示。 清單B給出了一個(gè)在磁盤上創(chuàng)建邏輯備份設(shè)備的例子。 當(dāng)備份設(shè)備創(chuàng)建完畢,Northwind數(shù)據(jù)庫能用下面的命令進(jìn)行備份: BACKUP DATABASE Northwind TO DiskBackup 頻繁變動(dòng)的大數(shù)據(jù)庫的備份 目前,我已演示了怎么備份整個(gè)數(shù)據(jù)庫。然而,他只允許你恢復(fù)備份結(jié)束時(shí)刻的數(shù)據(jù)庫所保存的數(shù)據(jù)。如果數(shù)據(jù)庫非常大并且頻繁變動(dòng),由于時(shí)間和空間的限制,頻繁進(jìn)行全數(shù)據(jù)庫備份是不現(xiàn)實(shí)的。當(dāng)數(shù)據(jù)庫失敗時(shí),可能會(huì)造成大量數(shù)據(jù)丟失。 在這種情況下,有兩種提高可恢復(fù)性的途徑,這兩個(gè)途徑都需求全數(shù)據(jù)庫備份。而且這兩種方法都需求數(shù)據(jù)庫恢復(fù)模型為FULL或BULK_LOGGED。 第一種方法采用差異數(shù)據(jù)庫備份,他只捕捉并保存全數(shù)據(jù)庫備份后改動(dòng)的數(shù)據(jù)。由于他的文件較小而且信息簡明,用他進(jìn)行數(shù)據(jù)恢復(fù)的速度非??臁? 下面的例子在一個(gè)名為DiffBackupDevice的邏輯備份設(shè)備上創(chuàng)建了一個(gè)差異備份: BACKUP DATABASE Northwind TO DiffBackupDevice WITH DIFFERENTIAL 第二個(gè)提高可恢復(fù)性的方法利用交易記錄備份,恢復(fù)能在一個(gè)特定的時(shí)間點(diǎn)上完成。 你可能會(huì)問這怎么可能。記住,交易記錄的目的就是記錄發(fā)生在數(shù)據(jù)庫中所有交易。交易記錄允許COMMIT和ROLLBACK正確工作。為了達(dá)到這個(gè)功能,該數(shù)據(jù)的變化前后的數(shù)值必須隨同操作類型、交易開始(時(shí)間)等一齊被記錄下來。 備份技巧 利用下面的列出的技巧來確保你不會(huì)在每周一次的數(shù)據(jù)庫備份過程中忘記關(guān)鍵步驟。 每周一次備份主數(shù)據(jù)庫。如果你創(chuàng)建、修改或停止一個(gè)數(shù)據(jù)庫,添加新的SQL Server消息,添加或停止連接服務(wù)器,或添加記錄設(shè)備,那就進(jìn)行手工備份。 每天備份一次msdb數(shù)據(jù)庫。他一般非常小,但非常重要,因?yàn)樗怂械腟QL Server工作、操作和計(jì)劃任務(wù)。 只有當(dāng)你修改他時(shí),才有必要備份模型數(shù)據(jù)庫。 用SQL Server Agent來安排你的備份工作的時(shí)間表。 如果在你的生產(chǎn)(production)環(huán)境中有現(xiàn)成資源,備份生產(chǎn)數(shù)據(jù)庫到本地磁盤或網(wǎng)絡(luò)服務(wù)器(用同一個(gè)開關(guān))。然后,把備份文件/設(shè)備拷貝到磁帶上。在存在許多硬件故障(特別是在RAID系統(tǒng)中)的情況下,磁盤常常是完好的(inact)。如果備份文件是在磁盤上,那么恢復(fù)時(shí)的速度會(huì)提高非常多。 備份研發(fā)和測試數(shù)據(jù)庫至少要用到SIMPLE恢復(fù)模型。 除了有計(jì)劃的定時(shí)備份外,在進(jìn)行未記錄的(nonlogged)批操作(如,批拷貝)、創(chuàng)建索引、或改動(dòng)恢復(fù)模型后要備份用戶數(shù)據(jù)庫。 如果你使用的是SIMPLE恢復(fù)模型,記住在截短(truncate)交易記錄之后備份你的數(shù)據(jù)庫。 用文件記錄你的恢復(fù)步驟。至少要大概記錄這些步驟,注意所有的重要文件的位置。 在截短記錄之前,也就是所有的已提交(committed)交易從記錄中清空之前,所有的這些信息都保存在交易記錄中。在SIMPLE恢復(fù)模型中,記錄在一個(gè)CHECKPOINT期間內(nèi)截短(在SQL Server內(nèi)存緩沖寫道磁盤時(shí)),他是自動(dòng)發(fā)生的,但也能手動(dòng)執(zhí)行。這也就是SIMPLE恢復(fù)模型不支持時(shí)間點(diǎn)(point-in-time)恢復(fù)的原因。在FULL和BULK_LOGGED恢復(fù)模型下,當(dāng)交易記錄被備份時(shí),交易記錄被截短,除非你明確指出不進(jìn)行截短。 為了備份交易記錄,使用BACKUP LOG命令。其基本語法和BACKUP命令非常相似: BACKUP LOG { database } TO 下面是怎么把交易記錄備份到一個(gè)名為LogBackupDevice的邏輯設(shè)備上的例子:
BACKUP TRANSACTION Northwind TO LogBackupDevice
如果你不希望截短交易記錄,使用NO_TRUNCATE選項(xiàng),如下所示:
BACKUP TRANSACTION Northwind TO LogBackupDevice WITH NO_TRUNCATE
只是基本知識(shí)
盡管我在本文中僅僅概述了數(shù)據(jù)庫恢復(fù)的基本知識(shí),你還是能通過這些技巧來找到正確的方向。那么,為了避免不必要的(丟失數(shù)據(jù)造成的)恐慌,你要做到每周備份主數(shù)據(jù)庫,每天備份msdb。 |
|