用T-SQL語言還原資料庫
T-SQL語言裡提供了RESTORE DATABASE語句來恢複Database Backup,用該語句可以恢複完整備份、差異備份、檔案和檔案組備份。如果要還原交易記錄備份則還可以用RESTORE LOG語句。雖然RESTORE DATABASE語句可以恢複完整備份、差異備份、檔案和檔案組備份,但是在恢複完整備份、差異備份與檔案和檔案組備份的文法上有一點點出入,下面分別介紹幾種類型備份的還原方法。
18.6.1 還原完整備份
還原完整備份的文法如下:
RESTORE DATABASE { database_name | @database_name_var } --資料庫名
[ FROM <backup_device> [ ,...n ] ] --備份裝置
[ WITH
[ { CHECKSUM | NO_CHECKSUM } ] --是否校檢和
[ [ , ] { CONTINUE_AFTER_ERROR | STOP_ON_ERROR } ] --還原失敗是否繼續
[ [ , ] ENABLE_BROKER ] --啟動Service Broker
[ [ , ] ERROR_BROKER_CONVERSATIONS ] --對束所有會話
[ [ , ] FILE = { backup_set_file_number | @backup_set_file_number } ] --用於還原的檔案
[ [ , ] KEEP_REPLICATION ] --將複製設定為與記錄傳送一同使用
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ] --媒體名
[ [ , ] MEDIAPASSWORD = { mediapassword | --媒體密碼
@mediapassword_variable } ]
[ [ , ] MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name' ] --資料還原為
[ ,...n ]
[ [ , ] NEW_BROKER ] --建立新的service_broker_guid值
[ [ , ] PASSWORD = { password | @password_variable } ] --備份組的密碼
[ [ , ] { RECOVERY | NORECOVERY | STANDBY = --復原模式
{standby_file_name | @standby_file_name_var }
} ]
[ [ , ] REPLACE ] --覆蓋現有資料庫
[ [ , ] RESTART ] --重新啟動被中斷的還原作業
[ [ , ] RESTRICTED_USER ] --限制訪問還原的資料庫
[ [ , ] { REWIND | NOREWIND } ] --是否釋放和重繞磁帶
[ [ , ] { UNLOAD | NOUNLOAD } ] --是否重繞並卸載磁帶
[ [ , ] STATS [ = percentage ] ] --還原到其在指定的日期和時間時的狀態
[ [ , ] { STOPAT = { date_time | @date_time_var } --還原到指定的日期和時間
| STOPATMARK = { 'mark_name' | 'lsn:lsn_number' } --恢複為已標記的事務或記錄序號
[ AFTER datetime ]
| STOPBEFOREMARK = { 'mark_name' | 'lsn:lsn_number' }
[ AFTER datetime ]
} ]
]
[;]
<backup_device> ::=
{
{ logical_backup_device_name |
@logical_backup_device_name_var }
| { DISK | TAPE } = { 'physical_backup_device_name' |
@physical_backup_device_name_var }
}
其中大多參數在備份資料時已經介紹過了,下面介紹一些沒有介紹過的參數:
l ENABLE_BROKER:啟動Service Broker以便訊息可以立即發送。
l ERROR_BROKER_CONVERSATIONS:發生錯誤時結束所有會話,併產生一個錯誤指出資料庫已附加或還原。此時Service Broke將一直處于禁用狀態直到此操作完成,然後再將其啟用。
l KEEP_REPLICATION:將複製設定為與記錄傳送一同使用。設定該參數後,在待命伺服器上還原資料庫時,可防止刪除複製設定。該參數不能與NORECOVERY參數同時使用。
l MOVE:將邏輯名指定的資料檔案或記錄檔還原到所指定的位置,相當於圖18.14中所示的【將資料庫檔案還原為】功能。
l NEW_BROKER:使用該參數在會在databases資料庫和還原資料庫中都建立一個新的service_broker_guid值,並通過清除結束所有交談端點。Service Broker已啟用,但未向遠端工作階段端點發送訊息。
l RECOVERY:復原未提交的事務,使資料庫處於可以使用狀態。無法還原其他交易記錄
l NORECOVERY:不對資料庫執行任何操作,不復原未提交的事務。可以還原其他交易記錄。
l STANDBY:使資料庫處於唯讀模式。撤消未提交的事務,但將撤消操作儲存在待命資料庫檔案中,以便可以復原逆轉。
l standby_file_name | @standby_file_name_var:指定一個允許撤消復原的待命資料庫檔案或變數。
l REPLACE:會覆蓋所有現有資料庫以及相關檔案,包括已存在的同名的其他資料庫或檔案。
l RESTART:指定SQL Serve 應重新啟動被中斷的還原作業。RESTAR從中斷點重新啟動還原作業。
l RESTRICTED_USER:還原後的資料庫僅供db_owner、dbcreator或sysadmin的成員才能使用。
l STOPAT:將資料庫還原到其在指定的日期和時間時的狀態。
l STOPATMARK:恢複為已標記的事務或記錄序號。恢複中包括帶有已命名標記或 LSN 的事務,僅當該事務最初於實際產生事務時已獲得提交,才可進行本次提交。
l TOPBEFOREMARK:恢複為已標記的事務或記錄序號。恢複中不包括帶有已命名標記或LSN的事務,在使用WITH RECOVERY時,事務將復原。
例十二、用名為“Northwind備份”的備份裝置來還原Northwind資料庫,其代碼如下:
USE master
RESTORE DATABASE Northwind
FROM Northwind備份
在本例中,沒有使用指定備份裝置裡的哪一個備份組來還原資料庫備份,那麼預設使用備份裝置裡的第一個備份組還原資料庫。如果要指定用哪個備份組來還原資料庫,則要使用file參數指定。
例十三、用名為“Northwind備份”的備份裝置的第六個備份組來還原Northwind資料庫,其代碼如下:
USE master
RESTORE DATABASE Northwind
FROM Northwind備份
WITH FILE = 6
例十四、用名為“backup.bak”的備份檔案來還原Northwind資料庫,其代碼如下:
USE master
RESTORE DATABASE Northwind
FROM DISK='D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\
Backup\backup.bak'
18.6.2 還原差異備份
還原差異備份的文法與還原完整備份的文法是一樣的,只是在還原差異備份時,必須要先還原完整備份再還原差異備份,因此還原差異備份必須要分為兩步完成。完整備份與差異備份資料在同一個備份檔案或備份裝置中,也有可能是在不同的備份檔案或備份裝置中。如果在同一個備份檔案或備份裝置中,則必須要用file參數來指定備份組。無論是備份組是不是在同一個備份檔案(備份裝置)中,除了最後一個還原作業,其他所有還原作業都必須要加上NORECOVERY或STANDBY參數。
例十五、用名為“Northwind備份”的備份裝置的第一個備份組來還原Northwind資料庫的完整備份,再用第三個備份組來還原差異備份,其代碼如下:
USE master
RESTORE DATABASE Northwind
FROM Northwind備份
WITH FILE = 1,NORECOVERY
GO
RESTORE DATABASE Northwind
FROM Northwind備份
WITH FILE = 3
GO
如果單獨還原差異備份或在本例中完整備份代碼裡沒有加上NORECOVERY參數,都會出現18.16所示的無法還原差異備份資訊。
圖18.16 無法還原差異備份
18.6.3 還原交易記錄備份
SQL Server 2005中已經將交易記錄備份看成和完整備份、差異備份一樣的備份組,因此,還原交易記錄備份也可以和還原差異備份一樣,只要知道它在備份檔案或備份裝置裡是第幾個檔案集即可。
與還原差異備份相同,還原交易記錄備份必須要先還原在其之前的完整備份,除了最後一個還原作業,其他所有還原作業都必須要加上NORECOVERY或STANDBY參數。
例十六、用名為“Northwind備份”的備份裝置的第一個備份組來還原Northwind資料庫的完整備份,再用第二個備份組來還原交易記錄備份,其代碼如下:
USE master
RESTORE DATABASE Northwind
FROM Northwind備份
WITH FILE = 1,NORECOVERY
GO
RESTORE DATABASE Northwind
FROM Northwind備份
WITH FILE = 2
GO
使用RESTORE LOG語句也可以用來還原交易記錄備份,例十六的代碼也可以改為以下代碼:
USE master
RESTORE DATABASE Northwind
FROM Northwind備份
WITH FILE = 1,NORECOVERY
GO
RESTORE LOG Northwind
FROM Northwind備份
WITH FILE = 2
GO
18.6.4 還原檔案和檔案組備份
還原檔案和檔案組備份也可以使用RESTORE DATABASE語句,但是必須要在資料庫名與FROM之間加上“FILE”或“FILEGROUP”參數來指定要還原的檔案或檔案組。通常來說,在還原檔案和檔案組備份之後,還要再還原其他備份來獲得最近的資料庫狀態。
例十七、用名為“Northwind備份”的備份裝置的還原檔案和檔案組,再用第十五個備份組來還原交易記錄備份,其代碼如下:
USE master
RESTORE DATABASE Northwind
FILEGROUP = 'PRIMARY'
FROM Northwind備份
GO
RESTORE LOG Northwind
FROM Northwind備份
WITH FILE = 15
GO
18.6.5 將資料庫還原到某個時間點
有關“時間點”在上面章節裡提到過一點點,下面舉例詳細地介紹怎麼將資料庫還原到某個時間點。
假設一個資料庫,在上午8點做過一次完整備份、10點做過一次交易記錄備份,現在發現在9點15分時的一次資料更新是錯誤的,那麼能不能將資料恢複到9點14分時的資料庫狀態,還是只能恢複到10點所做的交易記錄備份時的狀態呢?
交易記錄的作用就是記錄每一次資料的修改記錄,所以從理論上來說,是可以恢複到任何一次操作之前的狀態。9點15分時的資料是錯誤的,那就將其恢複到9點14分的資料吧。
例十八、用名為“Northwind備份”的備份裝置的第17個備份組來還原Northwind資料庫的完整備份,再用第18個交易記錄備份集來將資料庫還原到9點14分,其代碼如下:
USE master
RESTORE DATABASE Northwind
FROM Northwind備份
WITH FILE = 17,NORECOVERY
GO
RESTORE LOG Northwind
FROM Northwind備份
WITH FILE = 18,STOPAT = '2006-9-21 9:14:00'
GO
技巧:在SQL Server Management Studio裡也可以完成同樣的操作,只要將圖18.12所示對話方塊裡設定好【目標時間點】即可。
18.6.6 將檔案還原到新位置上
使用RESTORE DATABASE語句也可以利用備份檔案建立一個新的資料庫。
例十九、用名為“Northwind備份”的備份裝置的第17個備份組來建立一個名為“Northwind_test”的新資料庫,其代碼如下:
USE master
RESTORE DATABASE Northwind_test
FROM Northwind備份
WITH FILE = 17,
MOVE 'Northwind_Data' TO 'D:\Northwind_Data.MDF',
MOVE 'Northwind_Log' TO 'D:\Northwind_Log.LDF',
MOVE 'Northwind自訂資料檔案' TO 'D:\Northwind自訂資料檔案.NDF',
MOVE 'Northwind自訂記錄檔' TO 'D:\Northwind自訂記錄檔.LDF'
GO
說明:
在使用RESTORE DATABASE還原資料庫時多次用到了file參數來指定備份組,那麼如何查看這個備份組的編號呢?在“查看備份裝置的內容”小節裡曾經介紹過怎麼查看備份裝置裡的備份組,18.9中所表示格的“Postition”列裡顯示的就是file參數所指定的數字。