建立資料庫快照集 (Transact-SQL)

適用於:SQL Server

建立 SQL Server 資料庫快照集的唯一方法是使用 Transact-SQL。 SQL Server Management Studio 不支援建立資料庫快照集。

必要條件

可使用任何復原模式的來源資料庫必須符合下列必要條件:

  • 伺服器執行個體必須在支援資料庫快照集的 SQL Server 版本上執行。 如需 SQL Server 中資料庫鏡像支援的相關資訊,請參閱 SQL Server 2022 的版本和支援功能

  • 除非來源資料庫是資料庫鏡像工作階段中的鏡像資料庫,否則該資料庫必須處於線上狀態。

  • 若要在鏡像資料庫上建立資料庫快照集,資料庫必須處於同步處理的鏡像狀態

  • 來源資料庫無法設定為可擴充的共用資料庫。

  • 在 SQL Server 2019 (15.x) 之前,來源資料庫不能包含 MEMORY_OPTIMIZED_DATA 檔案群組。 SQL Server 2019 (15.x) 已新增記憶體內部資料庫快照集的支援。

重要

如需其他重要考量的相關資訊,請參閱資料庫快照集 (SQL Server)

建議

本節討論下列最佳做法:

最佳做法:為資料庫快照集命名

建立快照集之前,請務必考慮如何為快照集命名。 每個資料庫快照集都需要唯一的資料庫名稱。 為了簡化管理,快照集的名稱可包含識別資料庫的資訊,例如:

  • 來源資料庫的名稱。

  • 指示新名稱用於快照集。

  • 快照集的建立日期和時間、序號或某些其他資訊,例如一天中的時間,以區分指定資料庫上的循序快照集。

例如,考慮 AdventureWorks2022 資料庫的一系列快照集。 依 24 小時制,在上午 6 時到下午 6 時之間建立三個每日快照集。 每個每日快照集都會保留 24 小時後再卸除,並以相同名稱的新快照集取代。 每個快照集名稱指示小時,而不是日期:

AdventureWorks_snapshot_0600
AdventureWorks_snapshot_1200
AdventureWorks_snapshot_1800

或者,如果這些每日快照集的建立時間每天有所差異,則較不精確的命名慣例可能更好,例如:

AdventureWorks_snapshot_morning
AdventureWorks_snapshot_noon
AdventureWorks_snapshot_evening

最佳做法:限制資料庫快照集的數目

一段時間建立一系列的快照集,會擷取來源資料庫的循序快照集。 每個快照集都會保存,直至明確卸除。 由於每個快照集會隨原始頁面更新而繼續增長,因此您可在建立新快照集之後刪除較舊的快照集,以節省磁碟空間。

注意

若要還原為資料庫快照集,您需要從該資料庫刪除任何其他快照集。

最佳做法:與資料庫快照集建立用戶端連線

若要使用資料庫快照集,用戶端必須知道該快照集的位置。 使用者可在建立或刪除另一個資料庫快照集時,從其中一個資料庫快照集讀取。 然而,當您以新的快照集替代現有快照集時,必須將用戶端重新導向至新的快照集。 使用者可使用 SQL Server Management Studio 或 Azure Data Studio,手動連線至資料庫快照集。 但是,若要支援實際執行環境,您應建立程式設計解決方案,以透明方式將報告寫入用戶端導向至資料庫的最新資料庫快照集。

權限

任何可建立資料庫的使用者都能建立資料庫快照集;但是,若要建立鏡像資料庫的快照集,您必須是系統管理員固定伺服器角色的成員。

使用 Transact-SQL 建立資料庫快照集

  1. 根據來源資料庫目前的大小,請確定您有足夠的磁碟空間來保存資料庫快照集。 資料庫快照集的大小上限是建立快照集時來源資料庫的大小。 如需詳細資訊,請參閱檢視資料庫快照集的疏鬆檔案大小 (Transact-SQL)

  2. 使用 AS SNAPSHOT OF 子句對檔案發出 CREATE DATABASE 陳述式。 建立快照集需要指定來源資料庫每個資料庫檔案的邏輯名稱。 語法如下所示:

    CREATE DATABASE database_snapshot_name
    ON
    (
        NAME = logical_file_name
        , FILENAME = 'os_file_name'
    ) [ , ...n ]
    
    AS SNAPSHOT OF source_database_name
    [;]
    

    引數定義如下:

    Argument 描述
    database_snapshot_name 您想要還原資料庫的快照集名稱。
    logical_file_name 參考檔案時,來源資料庫在 SQL Server 中使用的邏輯名稱。
    os_file_name 您建立檔案時作業系統使用的路徑和檔案名稱。
    source_database_name 來源資料庫。

    如需此語法的完整描述,請參閱 CREATE DATABASE(SQL Server Transact-SQL)

    注意

    當您建立資料庫快照集時,CREATE DATABASE 陳述式中不允許記錄檔、離線檔案、還原檔案,以及已解除功能的檔案。

範例

這些範例中使用的 .ss 副檔名是為了方便起見,而且並非必要。 在包含多個檔案的資料庫中,必須指定所有檔案,且符合語法。 未指定檔案群組。

A. 在 AdventureWorks 資料庫上建立快照集

此範例會在 AdventureWorks 資料庫上建立資料庫快照集。 快照集名稱 AdventureWorks_dbss_1800,及其疏鬆檔案的檔案名稱 AdventureWorks_data_1800.ss,指示下午 6 時的建立時間 (1800 小時)。

CREATE DATABASE AdventureWorks_dbss1800 ON (
    NAME = AdventureWorks,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Data\AdventureWorks_data_1800.ss'
    ) AS SNAPSHOT OF AdventureWorks;
GO

B. 在 Sales 資料庫上建立快照集

此範例會在 Sales 資料庫上建立資料庫快照集 sales_snapshot1200,這是與在 CREATE DATABASE建立具有檔案群組的資料庫相同的範例資料庫。

--Create sales_snapshot1200 as snapshot of the Sales database:
CREATE DATABASE sales_snapshot1200 ON (
    NAME = SPri1_dat,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SPri1dat_1200.ss'
    ),
    (
    NAME = SPri2_dat,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SPri2dt_1200.ss'
    ),
    (
    NAME = SGrp1Fi1_dat,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\mssql\data\SG1Fi1dt_1200.ss'
    ),
    (
    NAME = SGrp1Fi2_dat,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SG1Fi2dt_1200.ss'
    ),
    (
    NAME = SGrp2Fi1_dat,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SG2Fi1dt_1200.ss'
    ),
    (
    NAME = SGrp2Fi2_dat,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SG2Fi2dt_1200.ss'
    ) AS SNAPSHOT OF Sales;
GO