同僚がSQL Serverデータベースをまだ実行しているときにバックアップできると言って驚いたとき、それがどのように可能か疑問に思いました。 SQL Serverはオンラインのままでもデータベースをバックアップできることは知っていますが、それが可能な理由を説明する方法がわかりません。私の質問は、これがデータベースにどのような影響を与えるかです。
バックアップの実行中にデータが(挿入、更新、または削除によって)変更された場合、バックアップにはそれらの変更が含まれますか、それとも後でデータベースに追加されますか?
ここではログファイルが重要な役割を果たすと想定していますが、その方法はよくわかりません。
編集:ちょうどメモとして、私のケースには、SQL Serverエージェントを使用してデータベースをバックアップすることと、このプロセス中のデータベース変更の影響が含まれます。
完全バックアップには、データとログの両方が含まれます。データの場合は、データベースの各ページをバックアップにコピーするだけです現状のまま、ページを読み取ります。次に、すべての「関連」ログをバックアップメディアに追加します。これには、少なくとも、バックアップ操作の開始時のLSNとバックアップ操作の終了時のLSNの間のすべてのログが含まれます。実際には、バックアップの開始時にすべてのアクティブなトランザクションとレプリケーションに必要なログを含める必要があるため、通常はより多くのログがあります。 データベース全体のバックアップに関するいくつかの神話を暴く を参照してください。
データベースが復元されると、すべてのデータページがデータベースファイルにコピーされ、すべてのログページがログファイルにコピーされます。相互に同期していない可能性のあるデータページ画像が含まれているため、現時点ではデータベースに一貫性がありません。しかし、通常のrecoveryが実行されます。ログにはバックアップ中のすべてのログが含まれているため、リカバリの最後にデータベースは一貫しています。
バックアップ中に、データベースのスナップショットが作成され、そのスナップショットからバックアップのためにデータが読み取られます。実際のライブDB操作は、バックアップ操作に影響しません。
質問で触れたように、データベースのコピー途中に変更が加えられる可能性があるため、単にコピーすることはできません。
これは、データベース機能を認識し、OS関数を介して「スナップショット」を取得するか、ユーティリティを使用してデータベースを安全な状態でダンプできる(mysqlを使用する場合はmysqldumpなど)エージェントで実行する必要があります。
そうしないと、破損する可能性のあるバックアップを取得し、それを復元するまでそれを知ることができません。 JoelとJeffは最近、最近のStackOverflowポッドキャストで少しそれについて話しました。
そして、あなたはログファイルが重要であるということで正しいです。ジャーナル/ログファイルが実際のデータと同期していない場合、ファイルを復元すると破損します。
要約すると、データベース対応のエージェント、スナップショットアプリケーション、またはデータダンプ中の更新を妨げずにデータをドロップするようにデータベースを適切にフックする方法を認識しているアプリケーションを介して、データベースの安全な状態を使用して作成されたバックアップになります。結果のファイルをアップします。
これを行うには多くの方法があります(一般的には、MSSQLが通常どのように行うかはわかりません)。ダンプが完了した後にコミットされるログファイルに変更を追加するだけで、データベースをファイルにダンプし、ファイルシステム固有のスナップショットを利用します。 Windows上のVSSなどの機能。