マイクロソフトSQL Serverのエラーログについてまとめてます。
「SQLのログ」という表現の場合、エラーログを指す場合と、トランザクションのコミットやロールバックに必要になるトランザクションログを表す場合とがあります。
この記事では、SQLのエラーログに関する情報をまとめています。
SQLのエラーログの取得方法
SQL Serverのエラーログには、バックアップ操作および復元操作、バッチ コマンド、その他のスクリプトやプロセスなどが正常終了したかどうか、その他発生したカーネルメッセージなどのシステム系のエラー情報などが含まれます。
ログファイルを参照するには、管理ツールのSQL Server Management Studio(SSMS)を使用すると便利です。「ログファイルの表示」で、監査コレクション、データ収集、データベース メール、ジョブ履歴、SQL Server、SQL Server エージェント、Windows イベントのログを表示できます。
【関連記事】
▶SQL Server Management Studioの使い方を徹底解説!
ログファイル自体を参照したい場合は、以下のパスにエラーログファイルがあります。
Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\LOG\ERRORLOG
古いエラーログは、ERRORLOG.nというファイル名にリネームされ、一番古いものから上書きされていきます。なお、デフォルトではSQL Serverのインスタンスを起動するたびにエラーログが生成され、ログがバックアップ(ERRORLOG.nにリネーム)されていきます。
バックアップはデフォルトで6個までしか保持されないため、頻繁にインスタンスの再起動をする場合はsp_cycle_errorプロシジャなどを使って、エラーログを使いまわすことも検討しましょう。
参考)SQL Server エラー ログの表示 – SQL Server | Microsoft Docs
SQL Serverのトレースログを取得する方法
エラーは出ていないけど、遅いクエリの原因をつきとめたいときなどに役立つのがトレースログ。稼動環境を監視して、どのストアド プロシージャの実行が遅く、パフォーマンスに影響を与えているかなどを特定するのに使います。
参考)SQL Serverで「トレースログ」を採取する:SQL Serverトラブルシューティング(38) – @IT
トレースログは、管理ツールSQL Server Management Studioから、SQL Serverプロファイラーを起動して使用します。
トレースログではログインの接続、失敗、解除状況や、select、insert、update、deleteステートメント、ストアドプロシジャやSQLバッチ、データベースオブジェクトで取得・開放されたロック、オープンされたカーソル、セキュリティ権限の確認などのイベントが記録されています。
公式サイトによると、SQL トレースと SQL Server プロファイラーは、非推奨となっています。Microsoft SQL Server の将来のバージョンで削除されるので、 新規開発では使わないようにしたほうが良さそうですね。また、すでにこの機能を使用しているアプリケーションは修正することを検討しましょう。
SQL Server拡張イベントでトレースログを取得
SQL Serverプロファイラーの代替機能として、SQL Server拡張イベントが推奨されています。
参考)クイック スタート:SQL Server の拡張イベント – SQL Server | Microsoft Docs
SQL Server拡張イベントは、汎用的なイベント処理システム。ログツールやトレースツールとして利用できます。また、SQL Serverプロファイラと比べても軽量でリソースをあまり食わないんですよね。サーバ上で動作するツールとしてはありがたいところ。
使い方は、セッションを開始して、SQLを別窓などで実行すると、トレースデータをキャプチャしてくれるんですね。
各種イベントごとに、CPU時間、対象データ数、遅延などをリアルタイムに表示してくれます。
イベントセッションの開始は、SQL Server Management StudioのGUI操作だけではなくT-SQLでバッチ処理的に実行することも可能です。
以下は、重くなりがちなHAVINGを使ったSELECT文のイベントをキャプチャするためのイベントセッションスクリプトです。
CREATE EVENT SESSION [YourSession] ON SERVER ADD EVENT sqlserver.sql_statement_completed ( ACTION(sqlserver.sql_text) WHERE ( [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%SELECT%HAVING%') ) ) ADD TARGET package0.event_file (SET filename = N'C:\Junk\YourSession_Target.xel', max_file_size = (2), max_rollover_files = (2) ) WITH ( MAX_MEMORY = 2048 KB, EVENT_RETENTION_MODE = ALLOW_MULTIPLE_EVENT_LOSS, MAX_DISPATCH_LATENCY = 3 SECONDS, MAX_EVENT_SIZE = 0 KB, MEMORY_PARTITION_MODE = NONE, TRACK_CAUSALITY = OFF, STARTUP_STATE = OFF ); GO
このSQLを実行後に、HAVNGを使ったSQLを実行することでイベントのキャプチャが開始できます。「SELECT」「HAVING」を含まないSQLは対象外になります。
なお、繰り返し使用する場合は、同名のイベントセッションが存在する場合に備えて、以下のスクリプトを事前に実行する必要があります。
IF EXISTS (SELECT * FROM sys.server_event_sessions WHERE name = 'YourSession') BEGIN DROP EVENT SESSION YourSession ON SERVER; END go
また、CREATE EVENT SESSIONは定義をおこなうだけで、実行はしません。以下のように、ALTER EVENTでSTATE=STARTで起動、STATE=STOPで停止する必要があります。
ALTER EVENT SESSION [YourSession] ON SERVER --ON DATABASE STATE = START; -- STOP;
まとめ
- SQL Serverのエラーログは、SQL Server Management Studioから参照可能
- 遅いクエリの特定などはSQL Serverのトレースログを調査する
- トレースログ調査には、SQL Server Management Studioの拡張イベントからイベントをキャプチャする