如何:將資料庫還原成資料庫快照集 (Transact-SQL)
資料庫快照集並不是備援儲存體,因此無法針對磁碟錯誤或其他損毀類型提供保護。但是,如果線上資料庫發生使用者錯誤,您可以將資料庫還原到發生錯誤之前的資料庫快照集。
重要事項 |
---|
建立定期備份和測試還原計畫對於保護資料庫很重要。如果您必須將來源資料庫還原到您建立資料庫快照集當時的時間點,請實作可讓您執行此作業的備份原則。 |
還原會使用還原的資料庫覆寫原始來源資料庫。還原為快照集會卸除所有全文檢索目錄。
重要事項 |
---|
在還原之前,您應該先詳讀<還原至資料庫快照集>中的資訊。 |
若要將資料庫還原成資料庫快照集
識別您要將資料庫還原成哪一個資料庫快照集。您可以檢視 SQL Server Management Studio 中之資料庫的快照集 (請參閱<如何:檢視資料庫快照集 (SQL Server Management Studio)>)。此外,您可以從 sys.databases (Transact-SQL) 目錄檢視的 source_database_id 資料行中,識別某個檢視的來源資料庫。
卸除任何其他資料庫快照集。
如需有關卸除快照集的詳細資訊,請參閱<如何:卸除資料庫快照集 (Transact-SQL)>。如果資料庫使用完整復原模式,您應該在還原之前備份記錄。如需詳細資訊,請參閱<如何:備份交易記錄 (SQL Server Management Studio)>或<如何:資料庫損毀時備份交易記錄 (Transact-SQL)>。
執行還原作業。
還原作業需要來源資料庫上的 RESTORE DATABASE 權限。若要還原資料庫,請使用以下 Transact-SQL 陳述式:
RESTORE DATABASE <database_name> FROM DATABASE_SNAPSHOT =<database_snapshot_name>
其中 <database_name> 是來源資料庫,而 <database_snapshot_name> 是要用來還原資料庫的快照名稱。請注意,在此陳述式中,您必須指定快照名稱,而非備份裝置。
如需詳細資訊,請參閱<RESTORE (Transact-SQL)>。
[!附註]
在還原作業期間,將無法使用快照和來源資料庫。來源資料庫和快照集都會標示為「還原中」。如果還原作業期間發生錯誤,它會在資料庫重新啟動時嘗試完成還原。
如果建立資料庫快照集之後,資料庫擁有者有變更過,您可以更新所還原資料庫的資料庫擁有者。
[!附註]
還原的資料庫會保留資料庫快照集的權限和組態 (例如,資料庫擁有者和復原模式)。
啟動資料庫。
您可以選擇性地備份還原的資料庫,特別是當它使用完整 (或大量記錄) 復原模式時。如需有關備份資料庫的資訊,請參閱<如何:備份資料庫 (SQL Server Management Studio)>或<如何:建立完整資料庫備份 (Transact-SQL)>。
範例
本節包含還原資料庫到資料庫快照集的範例。
A. 在 AdventureWorks2008R2 資料庫上還原快照集
此範例假設 AdventureWorks2008R2 資料庫上目前只有一個快照集。如需建立還原資料庫之快照的範例,請參閱<如何:建立資料庫快照集 (Transact-SQL)>。
USE master;
-- Reverting AdventureWorks2008R2 to AdventureWorks2008R2_dbss1800
RESTORE DATABASE AdventureWorks2008R2 from
DATABASE_SNAPSHOT = 'AdventureWorks2008R2_dbss1800';
GO
B. 還原 Sales 資料庫上的快照集
此範例假設 Sales 資料庫中目前有兩個快照集:sales_snapshot0600 和 sales_snapshot1200。此範例會刪除較舊的快照集,並將資料庫還原到較新的快照集。
如需建立範例資料庫與此範例使用之快照的程式碼,請參閱:
對於 Sales 資料庫與 sales_snapshot0600 快照集,請參閱<CREATE DATABASE (Transact-SQL)>中的「使用檔案群組建立資料庫」和「建立資料庫快照集」。
對於 sales_snapshot1200 快照集,請參閱<如何:建立資料庫快照集 (Transact-SQL)>中的「在 Sales 資料庫上建立快照集」。
--Test to see if sales_snapshot0600 exists and if it
-- does, delete it.
IF EXISTS (SELECT dbid FROM sys.databases
WHERE NAME='sales_snapshot0600')
DROP DATABASE SalesSnapshot0600;
GO
-- Reverting Sales to sales_snapshot1200
USE master;
RESTORE DATABASE Sales FROM DATABASE_SNAPSHOT = 'sales_snapshot1200';
GO