SQL Server 2012データベースがあります。データベース内のすべてのテーブルの最後の切り捨て時間を取得することは可能ですか?
注:私のシナリオでは、回復モードはSIMPLE
です。 FULL
に変更すれば可能ですか?
Truncateは 効率的にログに記録される操作 であることに注意してください。
シンプルリカバリモードで実行していて、Tログが切り捨てられていない場合は、文書化されていないfn_dblog
を使用して取得できます。
SELECT [Current LSN]
,[Operation]
,[Begin Time]
,[Transaction ID]
,[Transaction Name]
,[Transaction SID]
,SUSER_SNAME([Transaction SID]) as UserWhoIssuedTruncate
FROM fn_dblog(NULL, NULL)
WHERE Operation = 'LOP_BEGIN_XACT' and
[Transaction ID] IN (
SELECT [Transaction ID]
FROM fn_dblog(NULL, NULL)
WHERE [Transaction Name] = 'TRUNCATE TABLE'
)
GO
または、サーバー側のトレースを実行するか、SQL監査をオンにすることもできます。
常に最小限の権限(最小限の特権の原則)をユーザーに与えます。
FULLに変更すれば可能ですか?
はい、あります(復旧モデルはビジネスで定義する必要があります。ポイントインタイムのリストアを行いますか?ビジネスが失うことのできるデータの量は?など)。通常のログを実行して、Tログの維持を開始する必要があります。バックアップ。これにより、Tログが適切なサイズに保たれます。
Editedクエリでは、サブクエリの複数の結果が可能になるため、「=」の代わりに「IN」を使用します。
イベントを事前にキャプチャするための何かを設定しないと、テーブルが最後に切り捨てられた時刻を知ることは不可能だと思います。
デフォルトのトレースはtruncate
イベントの情報を保持しておらず、sys.dm_dm_index_usage_stats
もここでは役立ちません。
オプションは次のとおりです。
2番目の質問に関する限り、通常、本番データベースの復旧モデルはFULL
です。これは、特定の時点でデータベースを復元することが一般的に必要条件であるためです。他のデータソースから簡単かつ迅速に再構築できるデータのみを含むデータベースは、通常、特定の時点で復元する必要がないため、SIMPLE
復旧モデルに含まれることがよくあります。