たとえば、ログバックアップを実行していて、そのログバックアップが完了するまでに10分かかるとします。その10分の間に、さらにトランザクションが実行されます。以下の例で、ログバックアップには実際にどのトランザクションが含まれていますか?
- トランザクションAがコミット
- トランザクションBが開く
- ログのバックアップが開始されます
- トランザクションCが開く
- トランザクションBコミット
- ログのバックアップが完了しました
- トランザクションCコミット
ログバックアップファイルには、バックアップの実行が終了するまでのすべてのトランザクション(まだコミットされていないトランザクションを含む)が含まれ、次のように確認できます。
CREATE DATABASE MyDB;
ALTER DATABASE MyDB SET RECOVERY FULL;
USE MyDB;
CREATE TABLE LogTest (numbers int);
テストで使用するデータベースとテーブルを作成したら、最初の完全バックアップを実行して、後でログバックアップを実行できるようにします。
BACKUP DATABASE MyDB
TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\MyDB_FULL.bak';
完全バックアップが取られたので、テーブルにデータを挿入します。
USE MyDB;
INSERT INTO LogTest(numbers) VALUES (1);
BEGIN TRAN
INSERT INTO LogTest(numbers) VALUES (2);
2番目の挿入がまだコミットされていないBEGIN TRAN
の下にあることを確認します。次に、関数[fn_dblog]を使用して、ログバックアップを取る前にログファイルの内容を確認します。
SELECT [Current LSN], [Operation], [SPID], [Transaction Name], [Begin Time], [End Time] FROM fn_dblog(NULL, NULL);
画像では、最初と2番目のINSERTに関連するLSNを確認できます
BACKUP LOG MyDB
TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\MyDB_LOG.trn';
ログのバックアップが取得され、次のクエリを使用して、関数 fn_dump_dblog でその内容を読み取ることができます。
SELECT [Current LSN], [Transaction ID], [Transaction Name], [Operation], [Begin Time]
FROM fn_dump_dblog (NULL, NULL, N'DISK', 1, N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\MyDB_LOG.trn',
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT);
未完了のトランザクションに関連するこれらのLSNが実際に確認できるようにコミットされていなくても、トランザクションログバックアップにあります。キャッチは Microsoftによると
トランザクションログは、データベースの重要なコンポーネントです。システム障害が発生した場合は、データベースを一貫した状態に戻すためにそのログが必要になります。
したがって、そのログバックアップの復元を実行した後、それらの未完了のトランザクションに関連するデータはロールバックされ、データベースをconsistent状態に保ちます。コミットされたすべてのトランザクションを安全(復元可能)と見なすことができます。データベースMyDBを削除し、上記の手順で生成されたバックアップを復元することで確認できます。
トランザクションログには、トランザクションログが終了するまでに完全にコミットされたトランザクションが含まれます。
上記の例を使用すると、トランザクションログにはAとBが含まれます。これは、バックアップの完了時にコミットされたすべてのトランザクションのログ末尾のバックアップを含む完全バックアップに似ています。
このサイトはさらに読むのに優れています。 https://sqlbak.com/academy/transaction-log-backup