はじめに
データベース管理者またはIT担当者として必要な重要なスキルの1つは、通常、システムを非常に注意深く監視する能力です。この重要なスキルが不足していると、問題のトラブルシューティング時に誤診につながる可能性があります。 SQL Serverは、本番環境で発生する問題のトラブルシューティングでDBAを支援できる多数のツールを公開しています。 SQLServerエラーログとSQLServerエージェントログは、SQLServerのトラブルシューティングを行うための最も重要な機能の2つです。この記事では、サーバーとエージェントのログを操作する方法について説明します。
デフォルトの動作
デフォルトでは、SQLServerは最後の6つのエラーログと最後の9つのエージェントログをインスタンスに保持します。デフォルトでは、エージェントのインスタンスが再起動されるたびに新しいログファイルが生成されます。保持されるログファイルの数は、以下の同等のGUIのステートメントを使用してSQL Serverログ用に変更できます(図1)。オブジェクトエクスプローラーでこのGUIを開くには、管理を右クリックします。 、 SQLServerエラーログを選択します 構成をクリックします 。
図1.最後の6つのエラーログ
各ログファイルは再起動時に生成され、 C:に物理的に保存されます \ Program Files \ Microsoft SQL Server\MSSQL14。
インスタンスの起動時に、エンジンは次のような重要な情報をエラーログに書き込みます。
SQLServerバージョンの詳細システムメーカー
- SQLServerプロセスID
- 使用中のポート番号
- 認証モード
- レジストリの起動パラメータ
- サービスアカウント
- 検出されたCPUとメモリのサイズ
- キーオプションのステータス(例:ラージページ、バッファプール拡張、インメモリOLTPなど
この情報は、紹介されたインスタンスからそれらのいずれかをすばやく知りたい場合に非常に役立ちます。
エラーログオプションの構成
前述のように、SQLエラーログとエージェントログの特定の側面は構成可能です。私の環境では、 NumErrorLogsを設定します 過去30日間のログを毎日保存したいので30になります。エージェントジョブを使用して深夜にsp_cycle_errorlog(およびsp_cycle_agent_errorlog)を実行することにより、各ログファイルに1日のデータが含まれていることを確認します。リスト3は、このジョブの詳細を示しています。これらのストアドプロシージャは、問題を再現して展開を監視する場合(つまり、SQLプロファイラーまたは拡張イベントにエスカレーションする前)にエラーログを明示的に循環させる場合にも非常に役立ちます。
-- Listing 1: Configure NumErrorLogs USE [master] GO EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'NumErrorLogs', REG_DWORD, 30 GO
図2.エラーログファイルの最大数の設定
SQLServerエージェントを右クリックすると、SQLエージェントエラーログをある程度詳細に構成できます。 、 次にエラーログ 構成を選択します メニューから。リスト2と図2は、ロギングレベルを変更する方法を示しています。
-- Listing 2: Setting Error Logging Level USE [msdb] GO EXEC msdb dbo.sp_set_sqlagent_properties @errorlogging_level 7 GO
図3.SQLエージェントのエラーログオプションの設定
-- Listing 3 /* Create Job to Cycle Server and Agent Error Logs */ USE [msdb] GO /****** Object: Job [Cycle Error Logs] Script Date: 01/25/2015 15:40:34 ******/ BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 /****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 01/25/2015 15:40:34 ******/ IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class 1 BEGIN EXEC @ReturnCode = msdb dbo sp_add_category @class N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16 EXEC @ReturnCode = msdb dbo sp_add_job @job_name=N'Custom_Cycle_Error_Logs', @enabled 1 @notify_level_eventlog 0, @notify_level_email 0, @notify_level_netsend 0 @notify_level_page 0 @delete_level 0, @description=N'No description available.', @category_name=N'[Uncategorized (Local)]', @owner_login_name N'COMPANYDOMAIN\kigiri', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /****** Object: Step [Step 1] Script Date: 01/25/2015 15:40:35 ******/ EXEC @ReturnCode = msdb dbo sp_add_jobstep @job_id @jobId, @step_name N'Step 1', @step_id 1 @cmdexec_success_code 0 @on_success_action 1 @on_success_step_id 0, @on_fail_action 2 @on_fail_step_id 0, @retry_attempts 0 @retry_interval 0 @os_run_priority 0, @subsystem=N'TSQL', @command=N'EXEC master.sys.sp_cycle_errorlog GO EXEC msdb.dbo.sp_cycle_agent_errorlog GO', @database_name=N'master', @flags 0 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb dbo sp_update_job @job_id = @jobId @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb dbo sp_add_jobschedule @job_id @jobId @name N'Daily Schedule', @enabled 1 @freq_type 4, @freq_interval 1 @freq_subday_type 1 @freq_subday_interval 0 @freq_relative_interval 0 @freq_recurrence_factor 0 @active_start_date 20121208, @active_end_date 99991231 @active_start_time 0 @active_end_time 235959 [email protected]_uid=N'f3eb3e85-9875-4cf5-a789-8c558b772d27' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb dbo sp_add_jobserver @job_id = @jobId @server_name = N'(local)' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback COMMIT TRANSACTION GOTO EndSave QuitWithRollback: IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION EndSave: GO /* Change Maximum Number of Error Log Files to 30 */ USE [master] GO EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'NumErrorLogs', REG_DWORD, 30 GO /* Set jo history length and agent properties */ EXEC msdb dbo.sp_purge_jobhistory @oldest_date '2015-11-28T19:29:00' GO USE [msdb] GO EXEC msdb dbo.sp_set_sqlagent_properties @jobhistory_max_rows 10000, @jobhistory_max_rows_per_job 1000 GO
ログを介した「注ぐ」
エラーログをよく理解しておくと、2番目のセクションにリストされている項目などを識別したり、大規模なデータベースのリカバリなどのイベントを監視したりするのに役立ちます。ただし、ログインの失敗やログの海に隠された同様のエラーなどの特定のアイテムを検索する場合は、フィルターを使用することをお勧めします。 または検索 機能。
図4.フィルターと検索
検索 特定のエラー番号またはテキストを探すときに役立ちます。検索では、行に必要なアイテムの出現箇所が一度に返されます。特定の基準を使用してエラーログを絞り込む必要がある場合は、フィルターを使用します。 接続でフィルタリングできます 、日付 または一般 詳細。
図5.検索基準
図6.フィルター基準
インスタンスに障害が発生した場合
熱心な読者が尋ねる良い質問の1つは、SQLServerの起動に失敗するとどうなるかということです。ログをどのように調べますか?エラーログが以前にパスが指定されたフラットファイルに書き込まれるという事実に加えて、Windowsイベントビューアでサーバーログとエージェントログを表示することもできます。必要なのは、ソースMSSQLSERVER。を使用してイベントのイベントビューアアプリケーションログをフィルタリングすることだけです。 より高度な環境では、SQL Serverログは、他のWindowsログと同様に、SEIMやSplunkなどのサードパーティツールに保存できます。これは物事をとても簡単にします。 SQL Server 2012以降では、登録済みのサーバーを使用し、WMIとWQLを使用して、別のインスタンスからのオフラインエラーログを完全に表示することもできます。
図7.イベントビューアでのSQLServerログの表示
結論
SQL Serverエラーログは、一般的なエラーのトラブルシューティングの開始点と見なすことができます。 SQL Traceによって生成された、またはSQLProfilerやExtendedEvents Sessionによってキャプチャされたトレースファイルなどの他のログは、エンジン内で何が起こっているかについての詳細を提供します。データベースメールやレプリケーションに関連するログなどの特定のログもあります。これらはすべてSQLServerの問題のトラブルシューティングに非常に役立ちますが、出発点としてSQLServerエラーログをお勧めします。
参考資料
SQLServerエラーログの表示
オフラインログファイルの表示
Spサイクルエラーログ
Spサイクルエージェントエラーログ
SQLServerのデフォルトのインストールパス