トランザクションログファイルの内容の詳細


11

トランザクションログ(略してLDFと呼ぶ)の内容について質問があります。完全復旧モデルのデータベースを想定しています。

私は、LDFファイルに(ログ)データベースへのすべての操作(つまり、完全復旧モード)が含まれていることを読みました。ロギング中とどう違うのBEGIN TRAN; COMMAND(s); COMMITですか?どうやらトランザクションはロールバックできますが、標準コマンド(完全復旧モード)はロールバックできないので、私は尋ねています。

トランザクション中にLDFファイルに記録される内容は、通常の完全復旧ロギングの場合とは異なると思います。そうですか?どう違うの?各アクションに「元に戻す」操作が含まれているだけですか?

関連するメモとして、完全復旧LDFファイルを使用して標準クエリを「ロールバック/元に戻す」ための商用ツールがあると聞きました。どうやってやっているの?彼らはLDFの内容を分析し、逆/元に戻す操作を考え出そうとしますか?


回答:


11

違いは、「標準コマンド」と呼ばれるものには暗黙的なトランザクションがあるため(「明示的ではない」とは異なり、実際の暗黙的なトランザクションではありません)、INSERT明示的なトランザクションなしでコマンドを発行するたびに、トランザクションが開かれます。データを挿入して自動的にコミットします。これは自動コミットトランザクションと呼ばれます。

これは、これをロールバックできない理由でもありますINSERT。すでにコミットされています。したがって、ルールは明示的なトランザクションと同じです一度コミットされると、ロールバックできません

SQL Serverの内部から直接、私が何を意味するかを確認できます。

Microsoft sys.fn_dblogは、指定されたデータベースのトランザクションログ内を調べるために使用できるDMFという名前のSQL Serverを出荷しています。

この簡単な実験では、AdventureWorksデータベースを使用します。

USE AdventureWorks2008;
GO

SELECT TOP 10 *
FROM dbo.Person;
GO

INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;

BEGIN TRAN;
INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;
GO

SELECT *
FROM sys.fn_dblog(NULL, NULL);
GO

ここでは、2つの挿入を行っています。1つは明示的なトランザクションあり、もう1つはなしです。

ログファイルでは、2つの間にまったく違いがないことがわかります。

自動コミットと明示的なトランザクション

赤はINSERT自動コミットトランザクション内、青はINSERT明示的トランザクションありです。

サードパーティのツールについては、データベースログを分析し、操作を「元に戻す」または「やり直す」ための通常のT-SQLコードを生成します。通常は、ログファイルの内容とは正反対の動作を行うスクリプトを生成する以外、特別なことは何もしません。


7

ApexSQLログの例で、商用ツールの仕組みを説明します

また、関連する注意事項として、完全復旧LDFファイルを使用して標準クエリを「ロールバック/元に戻す」ための商用ツールがあると聞きました。どうやってやっているの?彼らはLDFの内容を分析し、逆/元に戻す操作を考え出そうとしますか?

はい、彼らはLDFファイル(オンラインまたはデタッチ)およびtrnファイル(トランザクションログのバックアップ)を読み取り、発生したトランザクションを見つけ、同じまたは逆のスクリプトを作成します。

ただし、元に戻すおよびやり直しのスクリプトは、実行されるスクリプトと正確に同じである必要はありませんが、効果はまったく同じです。

たとえば、実行されたスクリプトが次の場合:

DELETE FROM [Person].[AddressType] WHERE Name  = 'New Loc22'

トランザクションログは、列値9、「New Loc22」、「41BC2FF6-F0FC-475F-8EB9-CEC1805AA0F6」、および「2002/06/01 00:00:00.000」を含むテーブルの行が削除されたことを記録します。テーブル構造から、ツールは主キーがAddressType列であることを読み取り、次のREDOスクリプトを作成します。

DELETE FROM [Person].[AddressType] WHERE [AddressTypeID] = 9

トランザクションは、元のwhere句で使用されている列ではなく、主キー列に関連付けられていることに注意してください。同様に、元に戻すスクリプトは次のようになります。

INSERT INTO [Person].[AddressType] ([AddressTypeID], [Name], [rowguid], [ModifiedDate]) VALUES (9, N'New loc22' COLLATE SQL_Latin1_General_CP1_CI_AS, '41bc2ff6-f0fc-475f-8eb9-cec1805aa0f6', '20020601 00:00:00.000')

ここに画像の説明を入力してください

免責事項:私はApexSQLでサポートエンジニアとして働いています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.