共用方式為


如何:將資料庫還原成資料庫快照集 (Transact-SQL)

資料庫快照集並不是備援儲存體,因此無法針對磁碟錯誤或其他損毀類型提供保護。但是,如果線上資料庫發生使用者錯誤,您可以將資料庫還原到發生錯誤之前的資料庫快照集。

重要事項重要事項

建立定期備份和測試還原計畫對於保護資料庫很重要。如果您必須將來源資料庫還原到您建立資料庫快照集當時的時間點,請實作可讓您執行此作業的備份原則。

還原會使用還原的資料庫覆寫原始來源資料庫。還原為快照集會卸除所有全文檢索目錄。

重要事項重要事項

在還原之前,您應該先詳讀<還原至資料庫快照集>中的資訊。

若要將資料庫還原成資料庫快照集

  1. 識別您要將資料庫還原成哪一個資料庫快照集。您可以檢視 SQL Server Management Studio 中之資料庫的快照集 (請參閱<如何:檢視資料庫快照集 (SQL Server Management Studio)>)。此外,您可以從 sys.databases (Transact-SQL) 目錄檢視的 source_database_id 資料行中,識別某個檢視的來源資料庫。

  2. 卸除任何其他資料庫快照集。

    如需有關卸除快照集的詳細資訊,請參閱<如何:卸除資料庫快照集 (Transact-SQL)>。如果資料庫使用完整復原模式,您應該在還原之前備份記錄。如需詳細資訊,請參閱<如何:備份交易記錄 (SQL Server Management Studio)>或<如何:資料庫損毀時備份交易記錄 (Transact-SQL)>。

  3. 執行還原作業。

    還原作業需要來源資料庫上的 RESTORE DATABASE 權限。若要還原資料庫,請使用以下 Transact-SQL 陳述式:

    RESTORE DATABASE <database_name> FROM DATABASE_SNAPSHOT =<database_snapshot_name>

    其中 <database_name> 是來源資料庫,而 <database_snapshot_name> 是要用來還原資料庫的快照名稱。請注意,在此陳述式中,您必須指定快照名稱,而非備份裝置。

    如需詳細資訊,請參閱<RESTORE (Transact-SQL)>。

    [!附註]

    在還原作業期間,將無法使用快照和來源資料庫。來源資料庫和快照集都會標示為「還原中」。如果還原作業期間發生錯誤,它會在資料庫重新啟動時嘗試完成還原。

  4. 如果建立資料庫快照集之後,資料庫擁有者有變更過,您可以更新所還原資料庫的資料庫擁有者。

    [!附註]

    還原的資料庫會保留資料庫快照集的權限和組態 (例如,資料庫擁有者和復原模式)。

  5. 啟動資料庫。

  6. 您可以選擇性地備份還原的資料庫,特別是當它使用完整 (或大量記錄) 復原模式時。如需有關備份資料庫的資訊,請參閱<如何:備份資料庫 (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_snapshot0600sales_snapshot1200。此範例會刪除較舊的快照集,並將資料庫還原到較新的快照集。

如需建立範例資料庫與此範例使用之快照的程式碼,請參閱:

--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