Wprowadzenie
Jedną z kluczowych umiejętności, których potrzebujesz jako administrator baz danych lub informatyk, jest generalnie umiejętność bardzo dokładnego monitorowania systemów. Brak tej kluczowej umiejętności może prowadzić do błędnej diagnozy podczas rozwiązywania problemów. SQL Server udostępnia szereg narzędzi, które mogą pomóc administratorowi DBA w rozwiązywaniu problemów występujących w środowisku produkcyjnym. Dziennik błędów programu SQL Server i dziennik agenta programu SQL Server to dwa najważniejsze narzędzia do rozwiązywania problemów z programem SQL Server. W tym artykule omówimy sposoby manipulowania dziennikami serwera i agenta.
Domyślne zachowanie
Domyślnie SQL Server przechowuje w instancji ostatnie sześć dzienników błędów i dziewięć ostatnich dzienników agenta. Domyślnie nowy plik dziennika jest generowany za każdym razem, gdy instancja agenta jest restartowana. Liczbę przechowywanych plików logów można modyfikować dla logów SQL Server za pomocą poniższego zestawienia równoważnego GUI (rys. 1). Aby otworzyć ten GUI w Eksploratorze obiektów, kliknij prawym przyciskiem myszy Zarządzanie , wybierz Dziennik błędów serwera SQL i kliknij Konfiguruj .
Rys 1. Ostatnie sześć dzienników błędów
Każdy plik dziennika jest generowany po ponownym uruchomieniu i fizycznie przechowywany w C: \Program Files\ Microsoft SQL Server\MSSQL14.
Podczas uruchamiania instancji silnik zapisuje kluczowe informacje w dzienniku błędów, które obejmują:
Szczegóły wersji serwera SQL Producent systemu
- Identyfikator procesu serwera SQL
- Numer portu w użyciu
- Tryb uwierzytelniania
- Parametry uruchamiania rejestru
- Konto usługi
- Wykryto rozmiar procesora i pamięci
- Status kluczowych opcji, np. Duże strony, rozszerzenie puli buforów, OLTP w pamięci itp.
Te informacje mogą być bardzo przydatne, gdy chcesz po prostu szybko dowiedzieć się o którymkolwiek z nich z przedstawionej Ci instancji.
Konfigurowanie opcji dziennika błędów
Jak wspomniano wcześniej, niektóre aspekty dziennika błędów SQL i dziennika agenta można konfigurować. W moim środowisku ustawiamy NumErrorLogs do 30, ponieważ chcemy codziennie zachowywać dzienniki z ostatnich trzydziestu dni. Zapewniamy, że każdy plik dziennika zawiera dane z dnia, uruchamiając sp_cycle_errorlog (i sp_cycle_agent_errorlog) o północy przy użyciu zadania agenta. Listing 3 pokazuje szczegóły tego zadania. Te procedury składowane mogą być również bardzo przydatne do jawnego przełączania dziennika błędów, gdy chcesz odtworzyć problem i obserwować jego rozwój (tj. przed eskalacją do programu SQL Profiler lub zdarzeń rozszerzonych).
-- 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
Rys 2. Ustawianie maksymalnej liczby plików dziennika błędów
Dziennik błędów agenta SQL można skonfigurować na pewnym poziomie szczegółowości, klikając prawym przyciskiem myszy Agent serwera SQL , a następnie Dzienniki błędów i wybierz Konfiguruj z menu. Listing 2 i Rys. 2 pokazują, jak zmodyfikować poziom rejestrowania.
-- Listing 2: Setting Error Logging Level USE [msdb] GO EXEC msdb dbo.sp_set_sqlagent_properties @errorlogging_level 7 GO
Rys 3. Ustawianie opcji dziennika błędów agenta 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
„Przelewanie się” przez dzienniki
Zapoznanie się z dziennikiem błędów jest przydatne do identyfikacji takich rzeczy, jak elementy wymienione w drugiej sekcji lub monitorowania takich zdarzeń, jak odzyskiwanie dużej bazy danych. Ale podczas wyszukiwania konkretnego elementu, takiego jak niepowodzenia logowania lub podobne błędy ukryte w morzu dzienników, możesz użyć filtra lub wyszukaj możliwości.
Rys 4. Filtrowanie i wyszukiwanie
wyszukiwanie przyda się przy szukaniu konkretnego numeru lub tekstu błędu. Wyszukiwanie zwraca na raz wystąpienia elementu wymaganego według wiersza. Kiedy musisz zawęzić dziennik błędów za pomocą określonych kryteriów, użyj filtra. Możesz filtrować według połączenia , data lub ogólne szczegóły.
Rys 5. Kryterium wyszukiwania
Rys 6. Kryterium filtrowania
Gdy instancja ulegnie awarii
Jednym z dobrych pytań, które zadałby wnikliwy czytelnik, jest to, co się dzieje, gdy SQL Server nie uruchamia się? Jak badamy dzienniki? Otóż tak się składa, że oprócz tego, że logi błędów są zapisywane do płaskich plików, których ścieżka została wcześniej określona, można również przeglądać logi serwera i agenta w Podglądzie zdarzeń systemu Windows. Wszystko, co musisz zrobić, to przefiltrować dzienniki aplikacji Podglądu zdarzeń pod kątem zdarzeń ze źródłem MSSQLSERVER. W bardziej zaawansowanych środowiskach dzienniki SQL Server, podobnie jak inne dzienniki systemu Windows, mogą być przechowywane w narzędziu innej firmy, takim jak SEIM lub Splunk. To znacznie ułatwia sprawę. Począwszy od SQL Server 2012, możliwe jest również przeglądanie dzienników błędów offline z całkowicie innej instancji, przy użyciu zarejestrowanych serwerów, a także przy użyciu WMI i WQL.
Rys 7. Przeglądanie logów SQL Server w Podglądzie zdarzeń
Wniosek
Dziennik błędów programu SQL Server można uznać za punkt wyjścia do rozwiązywania typowych błędów. Inne dzienniki, takie jak pliki śledzenia wygenerowane przez narzędzie SQL Trace lub przechwycone przez program SQL Profiler lub sesję rozszerzonych zdarzeń, zawierają znacznie więcej szczegółów na temat tego, co dzieje się w silniku. Istnieją również określone dzienniki, takie jak te związane z pocztą bazy danych lub replikacją. Chociaż są one bardzo przydatne przy rozwiązywaniu problemów w SQL Server, polecam logi błędów SQL Server jako świetny punkt wyjścia.
Referencje
Przeglądanie dziennika błędów serwera SQL
Przeglądanie plików dziennika offline
Dziennik błędów cyklu Sp
Dziennik błędów agenta cyklu Sp
Domyślna ścieżka instalacji serwera SQL