SQL Server 資料庫備份的三個恢復模型

2021-04-08 19:10:47 字數 3627 閱讀 6579

本文假定你有備份資料庫的許可權。也就是說,你要麼是系統管理員,要麼是db_owner或者backupadministrator。還有,我們還假定你的作業系統提供了訪問備份所需要的資源的權利,例如,訪問磁碟或者磁帶驅動器。

從哪兒開始

在你開始備份乙個sql server資料庫之前,你需要知道該資料庫使用了哪個恢復模型。這裡有三種不同的恢復模型:full、bulk_logged和******。

full恢復模型向你提供了最大的恢復靈活性。新資料庫預設使用的就是這種恢復模型。利用這種模型,你可以恢復資料庫的一部分或者完全恢復。假設交易記錄(transactions log)還沒有被破壞,你還可以在失敗之前恢復出最後一次的已提交(committed)交易。在所有的恢復模型中,這種模型使用了最多的交易記錄空間,並輕微影響了sql server的效能。

bulk_logged恢復模型比full模型少了一些恢復選項,但是進行批操作(bulk operation)時它不會嚴重影響效能。在進行某些批操作時,由於它只需記錄操作的結果,因此它使用了較少的記錄空間。然而,用這種模型,你不能恢復資料庫中的特定標記,也不能僅僅恢復資料庫的一部分。

******恢復模型是這三種模型中最容易實施的,它所占用的儲存空間也最小。然而,你只能恢復出備份結束時刻的資料庫。

為了找出你所用資料庫的恢復模型,可以執行下面的命令,該命令應該返回full、bulk_logged和******這三個值中的某乙個:

select dbpropertyex("database", "recovery")

為了改變資料庫的恢復選項,執行下面的命令:

alter database database name set recovery

除資料之外,sql server備份還包括資料庫大綱(schema)和資料庫元資料(即資料庫檔案、檔案組和它們的位置)。sql server允許在備份時使用者依然使用資料庫,所以在備份期間發生的交易也記錄到備份中去了。

備份資料庫

為了備份資料庫,你可以執行backup命令。(你也可以使用sql enterprise manager。)在執行命令之前知道它的語法永遠是個好主意。backup命令有許多選項,它的基本語法是:

backup database

to < backup_device > |

backup_device可以是磁碟或者磁帶——或者它也可以是乙個用磁碟檔案、磁帶或者已命名管道表示的邏輯上的備份裝置。

如果你想做乙個快速、一次性的備份,那麼向下面那樣使用磁碟檔案:

backup database northwind to disk = "c:/backup/northwind.bak"

如果你想把資料庫備份到另外一台伺服器上,可以使用unc名字:

backup database northwind to disk = "//fileserver/shared/backup/northwind.bak"

如果想進行有規律、有計畫的備份,就需要使用邏輯備份裝置。乙個邏輯備份裝置可以儲存若干個資料庫備份並駐留在磁碟、磁帶或者已命名管道上。如果你使用磁帶裝置,磁帶驅動器必須在同一臺物理伺服器上。已命名管道可以利用第三方備份軟體。

為了建立邏輯備份裝置,使用sp_addumpdevice系統儲存過程。sql enterprise manager也可以用來建立備份裝置。命令列語法如清單a所示。

清單b給出了乙個在磁碟上建立邏輯備份裝置的例子。

當備份裝置建立完畢,northwind資料庫可以用下面的命令進行備份:

backup database northwind to diskbackup

頻繁變動的大資料庫的備份

現在,我已經演示了如何備份整個資料庫。然而,它只允許你恢復備份結束時刻的資料庫所儲存的資料。如果資料庫很大並且頻繁變動,由於時間和空間的限制,頻繁進行全資料庫備份是不現實的。當資料庫失敗時,可能會造成大量資料丟失。

在這種情況下,有兩種提高可恢復性的途徑,這兩個途徑都要求全資料庫備份。而且這兩種方法都要求資料庫恢復模型為full或者bulk_logged。

第一種方法採用差異資料庫備份,它只捕獲並儲存全資料庫備份後改變的資料。由於它的檔案較小而且資訊簡明,用它進行資料恢復的速度非常快。

下面的例子在乙個名為diffbackupdevice的邏輯備份裝置上建立了乙個差異備份:

backup database northwind to diffbackupdevice with differential

第二個提高可恢復性的方法利用交易記錄備份,恢復可以在乙個特定的時間點上完成。

你可能會問這怎麼可能。記住,交易記錄的目的就是記錄發生在資料庫中所有交易。交易記錄允許commit和rollback正確工作。為了達到這個功能,該資料的變化前後的數值必須隨同操作型別、交易開始(時間)等一齊被記錄下來。

備份技巧

利用下面的列出的技巧來確保你不會在每週一次的資料庫備份過程中忘記關鍵步驟。

每週一次備份主資料庫。如果你建立、修改或者停止乙個資料庫,新增新的sql server訊息,新增或者停止連線伺服器,或者新增記錄裝置,那就進行手工備份。

每天備份一次msdb資料庫。它一般非常小,但很重要,因為它包含了所有的sql server工作、操作和計畫任務。

只有當你修改它時,才有必要備份模型資料庫。

用sql server agent來安排你的備份工作的時間表。

如果在你的生產(production)環境中有現成資源,備份生產資料庫到本地磁碟或者網路伺服器(用同乙個開關)。然後,把備份檔案/裝置拷貝到磁帶上。在存在許多硬體故障(特別是在raid系統中)的情況下,磁碟常常是完好的(inact)。如果備份檔案是在磁碟上,那麼恢復時的速度會提高很多。

備份開發和測試資料庫至少要用到******恢復模型。

除了有計畫的定時備份外,在進行未記錄的(nonlogged)批操作(如,批拷貝)、建立索引、或者改變恢復模型後要備份使用者資料庫。

如果你使用的是******恢復模型,記住在截短(truncate)交易記錄之後備份你的資料庫。

用文件記錄你的恢復步驟。至少要大概記錄這些步驟,注意所有的重要檔案的位置。

在截短記錄之前,也就是所有的已提交(committed)交易從記錄中清空之前,所有的這些資訊都儲存在交易記錄中。在******恢復模型中,記錄在乙個checkpoint期間內截短(在sql server記憶體緩衝寫道磁碟時),它是自動發生的,但也可以手動執行。這也就是******恢復模型不支援時間點(point-in-time)恢復的原因。在full和bulk_logged恢復模型下,當交易記錄被備份時,交易記錄被截短,除非你明確指出不進行截短。

為了備份交易記錄,使用backup log命令。其基本語法與backup命令非常相似:

backup log to

下面是如何把交易記錄備份到乙個名為logbackupdevice的邏輯裝置上的例子:

backup transaction northwind to logbackupdevice

如果你不希望截短交易記錄,使用no_truncate選項,如下所示:

backup transaction northwind to logbackupdevice with no_truncate

只是基本知識

儘管我在本文中僅僅概述了資料庫恢復的基本知識,你還是可以通過這些技巧來找到正確的方向。那麼,為了避免不必要的(丟失資料造成的)恐慌,你要做到每週備份主資料庫,每天備份msdb。 

備份SQL Server資料庫

搬遷之後,備份資料庫的功能出錯了,原因是原來資料庫與 同一臺伺服器,現在是資料庫與 分別在不同伺服器,引起在備分時,找不到路徑或是沒有許可權儲存。最初版本的儲存過程 setansi nulls ongo setquoted identifier ongo alter procedure dbo us...

備份SQL Server資料庫

搬遷之後,備份資料庫的功能出錯了,原因是原來資料庫與 同一臺伺服器,現在是資料庫與 分別在不同伺服器,引起在備分時,找不到路徑或是沒有許可權儲存。最初版本的儲存過程 set ansi nulls ongo setquoted identifier ongo alter procedure dbo u...

SQL Server資料庫備份方法

資料庫備份,是在資料丟失的情況下,能及時恢復重要資料,防止資料丟失的一種重要手段。乙個合理的資料庫備份方案,應該能夠在資料丟失時 有效地恢復重要資料 同時需要考慮技術實現難度和有效地利用資源。資料庫備份有四種型別,分別應用於不同的場合,下面簡要介紹一下。1 完全備份 2 事務日誌備份 事務日誌是乙個...