データベース スナップショット (SQL Server)
適用対象: SQL Server
データベース スナップショットは、SQL Server データベース (ソース データベース) の読み取り専用の静的ビューです。 これは、スナップショットの作成時点でソース データベースとトランザクション的に一貫性があり、常にソース データベースと同じサーバー インスタンス上に存在します。 データベース スナップショットは、スナップショットが作成されたときと同じ状態でデータの読み取り専用ビューを提供しますが、ソース データベースに変更が加えられると、スナップショット ファイルのサイズは大きくなります。
データベース スナップショットは、メジャー スキーマのアップグレード中に役立ち、以前の状態に戻すことができますが、スナップショットが通常のバックアップの必要性を置き換えないことを理解することが重要です。 データベース スナップショットをバックアップまたは復元することはできません。つまり、データの損失や破損が発生した場合にデータ保護と回復を確保するために、堅牢なバックアップ戦略でデータベース スナップショットを使用する必要があります。
データベース スナップショットは、 構文を使用する AS SNAPSHOT OF
T-SQL 構文を使用して作成されます。
1 つのソース データベースには複数のスナップショットが存在できます。 各データベース スナップショットは、データベース所有者が明示的に削除するまで保持されます。
Note
データベース スナップショットは、Transact-SQL スナップショットのバックアップ、トランザクションのスナップショット分離、およびスナップショット レプリケーションとは無関係の機能です。
機能の概要
データベース スナップショットは、データ ページ レベルで動作します。 ソース データベースのページをユーザーが初めて変更する前に、元のページがソース データベースからスナップショットにコピーされます。 スナップショットには元のページが格納され、スナップショットの作成時点におけるデータ レコードの状態が保持されます。 最初に変更されるすべてのページに対して同じプロセスが繰り返されます。 データベース スナップショットに対する読み取り操作は、存在する場所に関係なく、常に元のデータ ページにアクセスするため、ユーザーに対してデータベース スナップショットが変更されることはありません。
スナップショットにより、1 つ以上の "スパース ファイル" を使用して、コピーした元のページが格納されます。 最初は、スパース ファイルは、ユーザー データを含まず、ユーザー データ用のディスク領域がまだ割り当てられていない空のファイルです。 ソース データベースで更新されるページが増えるにつれて、ファイル サイズが大きくなります。 次の図は、2 つの対照的な更新パターンがスナップショットのサイズにどのような影響を与えるかを示しています。 更新パターン A は、スナップショットの有効期間に元のページの 30% しか更新されない環境を反映し、 更新パターン B は、スナップショットの有効期間に元のページの 80% が更新される環境を反映しています。
利点
スナップショットはレポート生成に使用できます。
- クライアントはデータベース スナップショットのクエリを実行できます。これは、スナップショットの作成時にデータに基づいてレポートを書き込むのに役立ちます。
レポートの生成に関する履歴データを維持できます。
- スナップショットを使用すると、データへのユーザー アクセスを特定の時点から延長することができます。 たとえば、特定の期間の終了時 (財務四半期など) に後でレポートするためのデータベース スナップショットを作成できます。 その後、これらのスナップショットに基づいて期間末レポートを作成できます。 ディスク領域が許可されている場合は、期間の終了スナップショットを無期限に保持して、これらの期間の結果に対するクエリを許可することもできます。たとえば、組織のパフォーマンスを調査できます。
可用性のために保持するミラー データベースを使用して、レポートをオフロードします。
- データベース スナップショットをデータベース ミラーリングと共に使用すると、ミラー サーバー上のデータをレポートに使用できるようになります。 さらに、ミラー データベースでクエリを実行すると、プリンシパルのリソースを解放できます。 詳細については、「データベース ミラーリングとデータベース スナップショット (SQL Server)」を参照してください。
管理者によるエラーからデータを保護できます。
ソース データベースでユーザー エラーが発生した場合は、データベース スナップショットの作成時にその状態に戻すことができます。 失われるデータは、スナップショットの作成時点よりも後に行ったデータベースへの更新内容だけです。
たとえば、一括更新やスキーマの変更など、メジャーな更新を行う前に、データベース上にデータベース スナップショットを作成してデータを保護します。 スナップショットを使用すると、更新を間違えた場合でも、データベースをスナップショットに戻すことによってデータを復旧できます。 元に戻す方が、バックアップから復元するよりも高速です。ただし、後でロールフォワードすることはできません。
重要
オフラインのデータベースや破損したデータベースは元に戻せません。 そのため、データベースを保護するには、通常のバックアップと復元計画のテストが必要です。
Note
データベース スナップショットはソース データベースに依存します。 そのため、スナップショットを使用してデータベースを元に戻すのは、バックアップと復元の戦略に代わるものではありません。 定期的なバックアップを毎回行うことが必要なことに変わりはありません。 データベース スナップショットを作成した時点までソース データベースを復元する必要がある場合は、それを可能にするバックアップ ポリシーを実装します。
ユーザーによるエラーからデータを保護できます。
データベース スナップショットを定期的に作成することで、削除されたテーブルなどの主要なユーザー エラーの影響を軽減できます。 ユーザーによる大半のエラーを認識し、それに対応できるよう、十分な長さの期間をカバーした一連のデータベース スナップショットを作成しておくと、データの保護レベルを高めることができます。 たとえば、ディスク リソースによっては、24 時間間隔で 6 から 12 個のローリング スナップショットを保持できます。 新しいスナップショットが作成されるたびに、最も古いスナップショットが削除されるようにすることができます。
ユーザー エラーが発生する直前のスナップショットにデータベースを戻すと、エラーから復旧することができます。 元に戻す処理は、バックアップからの復元よりもはるかに高速である可能性があります。ただし、後でロールフォワードすることはできません。
または、スナップショット内の情報から削除されたテーブルまたはその他の失われたデータを手動で再構築することもできます。 たとえば、スナップショットからデータベースにデータを一括コピーし、手動でデータをデータベースにマージできます。
Note
データベースごとに必要な同時実行スナップショットの数、新規スナップショットを作成する頻度、およびスナップショットを保持する期間は、データベース スナップショットをどのような理由で使用するかによって決まります。
テスト データベースの管理。
- テスト環境では、テスト プロトコルを繰り返し実行するときに、テストの各ラウンドの開始時にデータベースに同じデータを含めると便利です。 最初のラウンドを実行する前に、アプリケーション開発者またはテスト担当者がテスト データベースのスナップショットを作成できます。 各テストの実行が完了したら、データベース スナップショットを戻すことにより、データベースを元の状態にすばやく戻すことができます。
用語と定義
SQL Server のデータベース スナップショットには、いくつかの重要な用語と定義が含まれます。 データベース スナップショット は、特定の時点でのデータベース (ソース データベースと呼ばれます) の読み取り専用の静的ビューです。 ソース データベース は、スナップショットの基になる元のデータベースであり、スナップショットを使用できるようにするには、オンラインのままでアクセス可能な状態を維持する必要があります。 スパース ファイル、スナップショットの作成後に変更されたソース データベースの元のページを格納します。 これらのファイルは最初は空であり、ソース データベースで変更が行われると大きくなります。 これらの用語を理解することは、SQL Server でデータベース スナップショットを効果的に管理および利用するために不可欠です。
データベース スナップショット
データベース (ソース データベース) の読み取り専用の静的なビュー。トランザクションの一貫性が確保されます。
ソース データベース
データベース スナップショットの場合、スナップショットの作成元となったデータベース。 データベース スナップショットはソース データベースに依存します。 データベースのスナップショットは、データベースと同じサーバー インスタンス上に格納する必要があります。 さらに、そのデータベースが何らかの理由で使用できなくなった場合、そのスナップショットは使用できなくなります。
スパース ファイル
NTFS ファイル システムには、必要なディスク領域よりもはるかに少ないディスク領域が必要なファイルが用意されています。 スパース ファイルは、データベース スナップショットにコピーされたページを保存する際に使用されます。 作成したばかりのスパース ファイルは、ディスク領域をほとんど使用しません。 データがデータベース スナップショットに書き込まれるにつれて、NTFS によって、対応するスパース ファイルにディスク領域が徐々に割り当てられます。
前提 条件
任意の復旧モデルを使用できるソース データベースは、次の前提条件を満たす必要があります。
サーバー インスタンスは、データベース スナップショットをサポートする SQL Server のエディションで実行する必要があります。
- 詳細については、「SQL Server 2016 の各エディションがサポートする機能」を参照してください。
データベース ミラーリング セッション内のミラー データベースでない限り、ソース データベースはオンラインである必要があります。
任意のプライマリ データベースまたはセカンダリ データベースの可用性グループにデータベース スナップショットを作成できます。 レプリカのロールは "プライマリ" または "セカンダリ" とし、"解決中" 状態でないことが必要です。
データベース スナップショットの作成は、データベースの同期状態が "同期中" または "同期済み" であるときに実行することをお勧めします。 ただし、状態が SYNCHRONIZING でない場合は、データベース スナップショットを作成できます。
- 詳細については、「 AlwaysOn 可用性グループを含むデータベース スナップショット (SQL Server)」を参照してください。
ミラー データベースにデータベース スナップショットを作成するには、データベースは "同期済み" のミラーリング状態になっている必要があります。
ソース データベースをスケーラブルな共有データベースとして構成することはできません。
SQL Server 2019 より前では、ソース データベースに MEMORY_OPTIMIZED_DATA ファイル グループを含めることができませんでした。 メモリ内データベース スナップショットのサポートは、SQL Server 2019 で追加されました。
すべての復旧モデルがデータベース スナップショットをサポートしています。
ソース データベースへの制限
データベース スナップショットが存在する限り、スナップショットのソース データベースには次の制限事項があります。
データベースを削除、デタッチ、または復元することはできません。
通常、ソース データベースのバックアップは機能しますが、データベース スナップショットの影響を受けられません。
ページが更新されるたびにスナップショットに対する書き込み時のコピー操作の結果、ソース データベースの I/O が増加するため、パフォーマンスが低下します。
ソース データベースまたはスナップショットからファイルを削除することはできません。
データベース スナップショットに関する制限事項
データベース スナップショットはソース データベースに依存し、ディスク エラーや破損から保護しません。 そのため、レポートの目的やスキーマの変更時に役立ちますが、通常のバックアッププラクティスを補完し、置き換えるのではなく、補完する必要があります。 データベース スナップショットを作成した時点までソース データベースを復元する必要がある場合は、それを可能にするバックアップ ポリシーを実装します。
データベース スナップショットには、次の制限事項が適用されます。
データベース スナップショットは、ソース データベースと同じサーバー インスタンスに作成および保持される必要があります。
データベース スナップショットは、常にデータベース全体に対して機能します。
データベース スナップショットはソース データベースに依存し、冗長ストレージではありません。 ディスク エラーやその他の種類の破損から保護されません。 そのため、スナップショットを使用してデータベースを元に戻すのは、バックアップと復元の戦略の代わりではありません。 定期的なバックアップを毎回行うことが必要なことに変わりはありません。 データベース スナップショットを作成した時点までソース データベースを復元する必要がある場合は、それを可能にするバックアップ ポリシーを実装します。
ソース データベースで更新されたページがスナップショットにプッシュされると、スナップショットがディスク領域を使い切ったり、他のエラーが発生したりした場合、そのページは疑わしい状態になり、削除する必要があります。
スナップショットは読み取り専用です。 これらは読み取り専用であるため、アップグレードできません。 そのため、アップグレード後にデータベース スナップショットが実行可能になることは想定されていません。
model
、master
、およびtempdb
の各データベースのスナップショットは禁止されています。データベース スナップショット ファイルの仕様は変更できません。
データベース スナップショットからファイルを削除することはできません。
データベース スナップショットをバックアップまたは復元することはできません。
データベース スナップショットをアタッチまたはデタッチすることはできません。
FAT32 ファイル システムまたは RAW パーティションにデータベース スナップショットを作成することはできません。 NTFS ファイル システムは、データベース スナップショットで使用されるスパース ファイルを提供します。
データベース スナップショットでは、フルテキスト インデックス作成はサポートされていません。 フルテキスト カタログは、ソース データベースから伝達されません。
データベース スナップショットでは、スナップショットの作成時にソース データベースのセキュリティ制約が継承されます。 スナップショットは読み取り専用であるため、継承されたアクセス許可は変更できません。また、ソースに対して行われたアクセス許可の変更は、既存のスナップショットには反映されません。
スナップショットには、常にスナップショットの作成時にファイル グループの状態が反映されます。オンライン ファイル グループはオンラインのまま、オフライン ファイル グループはオフラインのまま保持されます。 詳細については、この記事で後述する「オフライン ファイル グループを使用したデータベース スナップショット」を参照してください。
ソース データベースがRECOVERY_PENDINGになると、そのスナップショットにアクセスできなくなる可能性があります。 ただし、ソース データベースの問題が解決されると、そのスナップショットが再び使用できるようになります。
元に戻す操作は、データベース内の NTFS 読み取り専用ファイルおよび NTFS 圧縮ファイルについてはサポートされていません。 これらの種類のファイル グループのいずれかを含むデータベースを元に戻そうとすると失敗します。
ログ配布構成では、データベース スナップショットはセカンダリ データベースではなく、プライマリ データベースでのみ作成できます。 プライマリ サーバー インスタンスとセカンダリ サーバー インスタンスの間でロールを切り替えるとします。 その場合は、プライマリ データベースをセカンダリ データベースとして設定する前に、すべてのデータベース スナップショットを削除する必要があります。
データベース スナップショットをスケーラブルな共有データベースとして構成することはできません。
データベース スナップショットは FILESTREAM ファイル グループをサポートしていません。 FILESTREAM ファイル グループがソース データベースに存在する場合、そのファイル グループはデータベース スナップショットでオフラインとしてマークされ、スナップショットを使用してデータベースを元に戻すことはできません。
Note
データベース スナップショットで実行する SELECT ステートメントには、FILESTREAM 列を指定しないようにする必要があります。FILESTREAM 列が含まれていると、次のようなエラー メッセージが返されます。 Could not continue scan with NOLOCK due to data movement.
- 読み取り専用スナップショットに関する統計が欠落しているか、古くなっている場合、 データベース エンジンは、
tempdb
に一時的な統計を作成して維持します。 詳細については、「統計」を参照してください。
ディスク領域
データベース スナップショットはディスク領域を消費します。 データベース スナップショットがディスク領域を使い切った場合は、疑わしいとマークされ、削除する必要があります。 (ただし、ソース データベースは影響を受けず、それに対するアクションは通常どおり続行されます)。
ただし、スナップショットは、データベースの完全なコピーと比較して、非常にスペース効率が高いです。 スナップショットにとって必要なのは、有効期間中に変化するページを格納する領域だけです。 一般に、スナップショットは一定期間保持されるため、サイズは重要ではありません。
ただし、スナップショットを保持する時間が長いほど、使用可能な領域を使い切る可能性が高くなります。 スパース ファイルが拡張できる最大サイズは、スナップショット作成時の対応するソース データベース ファイル サイズです。 ディスク領域が不足している場合は、データベース スナップショットを削除 (削除) する必要があります。
Note
ファイル領域を除いて、データベース スナップショットはデータベースとほぼ同じくらいのリソースを消費します。
オフライン ファイル グループ
ソース データベース内のオフライン ファイル グループは、次の操作を実行しようとすると、データベース スナップショットに影響を与えます。
スナップショットを作成します。
- ソース データベースに 1 つ以上のオフライン ファイル グループが含まれている場合、ファイル グループがオフラインのときは、スナップショットを正常に作成できます。 オフライン ファイル グループにスパース ファイルは作成されません。
ファイル グループをオフラインにする
- ソース データベースのファイルはオフラインにできます。 ただし、データベース スナップショットの作成時にオンラインだったファイル グループは、データベース スナップショットでもオンラインです。 スナップショットの作成後にクエリ対象のデータが変更された場合、元のデータ ページにスナップショットからアクセスできます。 ただし、ファイル グループ内の変更されていないデータへのアクセスにスナップショットを使用するクエリは、入出力 (I/O) エラーで失敗する可能性があります。
ファイル グループをオンラインにする
- データベース スナップショットを持つデータベースにファイル グループをオンラインにすることはできません。 スナップショット作成時にファイル グループがオフラインであるか、データベース スナップショットが存在する間にオフラインになっている場合、ファイル グループはオフラインのままです。 これは、ファイルをオンラインに戻すには復元が必要であるためです。データベース スナップショットがデータベースに存在する場合は復元できません。
ソース データベースをスナップショットに戻す
- ソース データベースをデータベース スナップショットに戻すには、スナップショットの作成時にオフラインであったファイル グループを除き、すべてのファイル グループがオンラインである必要があります。