データベース スナップショットの作成 (Transact-SQL)

適用対象: SQL Server

SQL Server データベース スナップショットを作成する唯一の方法は、 を使用することです。 SQL Server Management Studio では、データベース スナップショットの作成はサポートされていません。

前提条件

任意の復旧モデルを使用できるソース データベースは、次の前提条件を満たす必要があります。

  • サーバー インスタンスで、データベース スナップショットをサポートする SQL Server のエディションが実行されている必要があります。 データベース スナップショットの SQL Server のサポートについては、「SQL Server 2022 の各エディションとサポートされている機能」を参照してください。

  • ソース データベースは、データベース ミラーリング セッション内のミラー データベースである場合を除き、オンラインである必要があります。

  • ミラー データベースにデータベース スナップショットを作成するには、データベースは同期済みの ミラーリング状態になっている必要があります。

  • ソース データベースは、スケーラブルな共有データベースとして構成できません。

  • SQL Server 2019 (15.x) より前では、ソース データベースに MEMORY_OPTIMIZED_DATA ファイルグループを含めることができませんでした。 メモリ内データベース スナップショットのサポートは、SQL Server 2019 (15.x) で追加されました。

重要

その他の重要な考慮事項については、「Database Snapshots (SQL Server)を参照してください。

推奨事項

このセクションでは、次のベスト プラクティスについて説明します。

ベスト プラクティス: データベース スナップショットの名前付け

スナップショットを作成する前に、名前付けの方法を検討することが重要です。 各データベース スナップショットでは、一意のデータベース名が必要になります。 管理を容易にするために、次のようなデータベースを識別する情報を、スナップショット名に含めることができます。

  • ソース データベースの名前。

  • 新しい名前がスナップショット用であるという指示

  • 任意のデータベース上のシーケンシャル スナップショットを区別するための、スナップショットの作成日や作成時刻、シーケンス番号、日時などの他のいくつかの情報

たとえば、 AdventureWorks2022 データベースの一連のスナップショットについて考えてみます。 24 時間形式のクロックに基づいて、午前 6 時から午後 6 時までの間に、毎日 3 つのスナップショットが作成されます。 毎日の各スナップショットは、24 時間保持された後削除され、同じ名前の新しいスナップショットに置き換えられます。 各スナップショット名は、次のように時刻を示しますが、日付は示しません。

AdventureWorks_snapshot_0600
AdventureWorks_snapshot_1200
AdventureWorks_snapshot_1800

しかし、毎日のスナップショットの作成時刻が日によって異なる場合、あまり明確でない名前付け規則が適している場合もあります。たとえば次のような名前にします。

AdventureWorks_snapshot_morning
AdventureWorks_snapshot_noon
AdventureWorks_snapshot_evening

ベスト プラクティス: データベース スナップショット数の制限

一連のスナップショットを長期にわたって作成することで、ソース データベースのシーケンシャルなスナップショットがキャプチャされます。 各スナップショットは、明示的に削除されるまで保持されます。 元のページが更新されるにつれて、各スナップショットが継続的に拡張されるので、新しいスナップショットの作成後に古いスナップショットを削除するとディスク領域を節約できます。

Note

データベース スナップショットに戻すには、そのデータベースから他のすべてのスナップショットを削除する必要があります。

ベスト プラクティス: データベース スナップショットへのクライアント接続

データベース スナップショットを使用するには、クライアントはそのスナップショットを見つける場所を認識している必要があります。 ユーザーは、あるデータベース スナップショットが作成または削除されている間でも、他のデータベース スナップショットから読み取ることができます。 ただし、既存のスナップショットを新しいスナップショットに置き換えるときに、クライアントを新しいスナップショットにリダイレクトする必要があります。 ユーザーは、SQL Server Management Studio または Azure Data Studio を使用してデータベース スナップショットに手動で接続できます。 ただし、実稼働環境をサポートするには、ユーザーが意識しないうちにレポート作成クライアントをデータベースの最新のデータベース スナップショットにリダイレクトするような、プログラム ソリューションを作成する必要があります。

アクセス許可

データベースを作成できるすべてのユーザーが、データベース スナップショットを作成できます。ただし、ミラー データベースのスナップショットを作成するには、 sysadmin 固定サーバー ロールのメンバーであることが必要です。

データベース スナップショットの作成方法 (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
    [;]
    

    引数は、次のとおりです。

    引数 説明
    database_snapshot_name データベースを戻す対象になるスナップショットの名前。
    logical_file_name ファイルを参照する際に SQL Server が使用する ソース データベースの論理名。
    os_file_name ファイルを作成する際にオペレーティング システムが使用するパスとファイル名。
    source_database_name ソース データベース

    この構文の詳しい説明については、「CREATE DATABASE (SQL Server Transact-SQL)」を参照してください。

    Note

    データベース スナップショットを作成する場合、ログ ファイル、オフラインのファイル、復元中のファイル、および機能していないファイルを CREATE DATABASE ステートメントで使用することはできません。

これらの例で使用される .ss 拡張機能は便宜上のものであり、必須ではありません。 複数のファイルを含むデータベースでは、構文に従ってすべてのファイルを指定する必要があります。 ファイル グループが指定されていません。

A. AdventureWorks データベースのスナップショットを作成する

この例では、 AdventureWorks データベースのデータベース スナップショットを作成します。 スナップショット名 AdventureWorks_dbss_1800 と、そのスパース ファイルの名前 AdventureWorks_data_1800.ssは、作成時間が午後 6 時 (1,800 時間) であることを示しています。

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_snapshot1200Sales データベース上に作成します。これは、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