web-dev-qa-db-ja.com

SQL Serverでトランザクションログの使用状況を監視する方法

以下のすべての点に関して、トランザクションログの使用状況を監視したいと思います。

  • どのタスク\ジョブ\クエリがドライブ\ファイルを埋めているか。

  • ログファイルの使用率。

  • トランザクションが発生した時間。

これをテストする適切な方法があれば役立つでしょう。

2
DBOn

最も簡単な方法は、市販の監視ツールを購入することです。これらはすべてこの種の情報を提供します。IderaSQL DM、Quest Spotlight、SentryOne SQL Sentryは、これらの種類のことを非常に低い影響で実行します。

次の最も簡単な方法は、自分で何かを構築することです。そのルートを使用する場合は、まず sp_WhoIsActive をテーブルに記録します。特に @ get_transaction_info = 1 スイッチを使用します。

自分でロールする方法を試す場合は、クエリだけがトランザクションログの増大を引き起こすわけではないことに注意する必要があります。たとえば、レプリケーション、データベースミラーリング、またはAlways On可用性グループを使用している場合、SQL Serverはこれらのレプリカの1つがオフラインのときに履歴を保持する必要があります。原因の詳細については、 log_reuse_wait_desc を確認してください:

SELECT name, log_reuse_wait_desc FROM sys.databases;
8
Brent Ozar

Windowsパフォーマンスモニターは、各SQL Serverデータベースの時間に対する現在使用中のトランザクションログの割合を示すグラフを表示します。このカウンターは「使用済みログの割合」と呼ばれ、「SQL Server:Databases」カテゴリにあります。

ログが一杯になるまでの時間を監視したり、自動拡張イベントを検出したりするのに役立ちます。トランザクションログアクティビティを直感的に視覚的に示します。

Percent Log Used performance counter

4
BagOfSpanners

簡単な方法は、すでに含まれているデフォルトのトレースを使用することです。

タイプ「ログファイルの自動拡張」または「ログファイルの自動圧縮」のイベントを読み取ると、好奇心を養うのに十分な情報が得られます。

サンプルスクリプト:

DECLARE @filename NVARCHAR(200)

SELECT  @filename = CAST(value AS NVARCHAR(4000))
FROM    ::FN_TRACE_GETINFO(DEFAULT)
WHERE   traceid = 1
        AND property = 2

SELECT
    TE.name AS [EventName]
    , t.DatabaseName
    , t.FileName
    , t.ApplicationName
    , t.HostName
    , t.LoginName
    , t.SPID
    , t.ClientProcessId
    , t.Duration
    , t.StartTime
    , t.EndTime

FROM sys.fn_trace_gettable(@filename,DEFAULT) T
JOIN sys.trace_events TE ON T.EventClass = TE.trace_event_id
WHERE   te.name = 'Log File Auto Grow'
     OR te.name = 'Log File Auto Shrink'

ただし、1つのインスタンスに制限されます。複数のインスタンスを一度にチェックする場合は、いくつかの自動化(または外部ツール)を使用する必要があります。

3
Marian

DMVを可能な限り使用しようとしている人として、簡単に説明できるスクリプトはほとんどありません。

1)

これは、フルバックアップとトランログバックアップ、それがかかった時間、バックアップのサイズ、場所、有効期限(ある場合)、論理デバイス(存在する場合)に関する情報を提供しますよく)、そしてサーバー名。

過去7日間のバックアップがフィルター処理され、サーバー上のすべてのデータベースが表示されることに注意してください。ただし、必要に応じて並べ替えることができます。

SELECT 
CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, 
msdb.dbo.backupset.database_name, 
msdb.dbo.backupset.backup_start_date, 
msdb.dbo.backupset.backup_finish_date, 
msdb.dbo.backupset.expiration_date, 
CASE msdb..backupset.type 
WHEN 'D' THEN 'Database' 
WHEN 'L' THEN 'Log' 
END AS backup_type, 
msdb.dbo.backupset.backup_size, 
msdb.dbo.backupmediafamily.logical_device_name, 
msdb.dbo.backupmediafamily.physical_device_name, 
msdb.dbo.backupset.name AS backupset_name, 
msdb.dbo.backupset.description 
FROM msdb.dbo.backupmediafamily 
INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id 
WHERE (CONVERT(datetime, msdb.dbo.backupset.backup_start_date, 102) >= GETDATE() - 7) 
ORDER BY 
msdb.dbo.backupset.database_name, 
msdb.dbo.backupset.backup_finish_date 

2)

これは、ログバッファーに配置されたレコード、トランザクションの状態、ログに記録されたレコードの数、バイト単位のサイズ、およびそれを実行したクエリを示します。要約すると、アクティブなトランザクションからのすべての挿入/削除/更新が、まだコミット/ロールバックされていない状態で表示されます

SELECT DTST.[session_id],
DES.[login_name] AS [Login Name],
DB_NAME (DTDT.database_id) AS [Database],
DTDT.[database_transaction_begin_time] AS [Begin Time],
-- DATEDIFF(ms,DTDT.[database_transaction_begin_time], GETDATE()) AS [Durationms],
CASE DTAT.transaction_type
WHEN 1 THEN 'Read/write'
WHEN 2 THEN 'Read-only'
WHEN 3 THEN 'System'
WHEN 4 THEN 'Distributed'
END AS [Transaction Type],
CASE DTAT.transaction_state
WHEN 0 THEN 'Not fully initialized'
WHEN 1 THEN 'Initialized, not started'
WHEN 2 THEN 'Active'
WHEN 3 THEN 'Ended'
WHEN 4 THEN 'Commit initiated'
WHEN 5 THEN 'Prepared, awaiting resolution'
WHEN 6 THEN 'Committed'
WHEN 7 THEN 'Rolling back'
WHEN 8 THEN 'Rolled back'
END AS [Transaction State],
DTDT.[database_transaction_log_record_count] AS [Log Records],
DTDT.[database_transaction_log_bytes_used] AS [Log Bytes Used],
DTDT.[database_transaction_log_bytes_reserved] AS [Log Bytes RSVPd],
DEST.[text] AS [Last Transaction Text],
DEQP.[query_plan] AS [Last Query Plan]
FROM sys.dm_tran_database_transactions DTDT
INNER JOIN sys.dm_tran_session_transactions DTST
ON DTST.[transaction_id] = DTDT.[transaction_id]
INNER JOIN sys.[dm_tran_active_transactions] DTAT
ON DTST.[transaction_id] = DTAT.[transaction_id]
INNER JOIN sys.[dm_exec_sessions] DES
ON DES.[session_id] = DTST.[session_id]
INNER JOIN sys.dm_exec_connections DEC
ON DEC.[session_id] = DTST.[session_id]
LEFT JOIN sys.dm_exec_requests DER
ON DER.[session_id] = DTST.[session_id]
CROSS APPLY sys.dm_exec_sql_text (DEC.[most_recent_sql_handle]) AS DEST
OUTER APPLY sys.dm_exec_query_plan (DER.[plan_handle]) AS DEQP
ORDER BY DTDT.[database_transaction_log_bytes_used] DESC;
-- ORDER BY [Duration ms] DESC;

3)

そして最後の1つはIOすべてのデータベースの情報に関連する:ログの読み取り、書き込み、読み取りと書き込みのストール(SQLサーバーがログの書き込みまたは読み取りを待機する時間)および読み取りログおよびデータファイルの/書き込み比率これらは累積的な統計であり、再起動後にのみリセットされることに注意してください。ただし、テーブルにスナップショットを挿入して追跡することができます。

select
fs.database_id as [DB ID], fs.file_id as [File Id], mf.name as [File Name]
,mf.physical_name as [File Path], mf.type_desc as [Type], fs.sample_ms as [Time]
,fs.num_of_reads as [Reads], fs.num_of_bytes_read as [Read Bytes]
,fs.num_of_writes as [Writes], fs.num_of_bytes_written as [Written Bytes]
,fs.num_of_reads + fs.num_of_writes as [IO Count]
,convert(decimal(5,2),100.0 * fs.num_of_bytes_read /
(fs.num_of_bytes_read + fs.num_of_bytes_written)) as [Read %]
,convert(decimal(5,2),100.0 * fs.num_of_bytes_written /
(fs.num_of_bytes_read + fs.num_of_bytes_written)) as [Write %]
,fs.io_stall_read_ms as [Read Stall], fs.io_stall_write_ms as [Write Stall]
,case when fs.num_of_reads = 0
then 0.000
else convert(decimal(12,3),1.0 * fs.io_stall_read_ms / fs.num_of_reads)
end as [Avg Read Stall]
,case when fs.num_of_writes = 0
then 0.000
else convert(decimal(12,3),1.0 * fs.io_stall_write_ms / fs.num_of_writes)
end as [Avg Write Stall]
from
sys.dm_io_virtual_file_stats(null,null) fs join
sys.master_files mf with (nolock) on
fs.database_id = mf.database_id and fs.file_id = mf.file_id
join sys.databases d with (nolock) on
d.database_id = fs.database_id
where
fs.num_of_reads + fs.num_of_writes > 0;

上司がサードパーティのツールに投資したくない場合や、データコレクターツールを設定したくない場合に備えて、いくつかのスタートアップポイントが提供されることを願っています

3
S4V1N

SQL Serverには、データコレクターと呼ばれる、それを行うことができる組み込みツールがあります。セットアップが混乱し、カスタマイズが難しく、トラブルシューティングがほとんど不可能であるため、ほとんどすべての専門家がそれを嫌っています。ただし、機能する場合は、この種の基本的な監視には十分です。

データコレクターの詳細については、こちらをご覧ください。 https://docs.Microsoft.com/en-us/sql/relational-databases/data-collection/data-collection

ブレントが言うように、いつでも商用ツールを購入できます。それは無料ではありません。サーバーのパフォーマンスの複数の側面を監視する必要がある場合は良い投資ですが、このような基本的なことを行うとやり過ぎになります。たぶん、SQLエージェントジョブを使用したカスタムコレクションプロセスで十分ですが、データコレクターはすぐにそれを行うので、最初にそれを試してみませんか?

1
spaghettidba