web-dev-qa-db-ja.com

SQL Serverデータベースの各テーブルの最後の切り捨て時間を取得する方法

SQL Server 2012データベースがあります。データベース内のすべてのテーブルの最後の切り捨て時間を取得することは可能ですか?

注:私のシナリオでは、回復モードはSIMPLEです。 FULLに変更すれば可能ですか?

7
LCJ

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

拡大するにはここをクリック

enter image description here

または、サーバー側のトレースを実行するか、SQL監査をオンにすることもできます。

常に最小限の権限(最小限の特権の原則)をユーザーに与えます。

FULLに変更すれば可能ですか?

はい、あります(復旧モデルはビジネスで定義する必要があります。ポイントインタイムのリストアを行いますか?ビジネスが失うことのできるデータの量は?など)。通常のログを実行して、Tログの維持を開始する必要があります。バックアップ。これにより、Tログが適切なサイズに保たれます。

Editedクエリでは、サブクエリの複数の結果が可能になるため、「=」の代わりに「IN」を使用します。

12
Kin Shah

イベントを事前にキャプチャするための何かを設定しないと、テーブルが最後に切り捨てられた時刻を知ることは不可能だと思います。

デフォルトのトレースはtruncateイベントの情報を保持しておらず、sys.dm_dm_index_usage_statsもここでは役立ちません。

オプションは次のとおりです。

  1. 痕跡
  2. 拡張イベントセッション
  3. 監査(TRUNCATEイベントをキャプチャできるかどうかは100%わかりません)

2番目の質問に関する限り、通常、本番データベースの復旧モデルはFULLです。これは、特定の時点でデータベースを復元することが一般的に必要条件であるためです。他のデータソースから簡単かつ迅速に再構築できるデータのみを含むデータベースは、通常、特定の時点で復元する必要がないため、SIMPLE復旧モデルに含まれることがよくあります。

4
spaghettidba