Introduzione
Una delle competenze chiave di cui hai bisogno come amministratore di database o persona IT è generalmente la capacità di monitorare i sistemi con molta attenzione. La mancanza di questa abilità chiave può portare a diagnosi errate durante la risoluzione dei problemi. SQL Server espone numerosi strumenti che possono aiutare il DBA nella risoluzione dei problemi che si verificano in produzione. Il registro degli errori di SQL Server e il registro di SQL Server Agent sono due delle funzionalità più importanti per la risoluzione dei problemi di SQL Server. In questo articolo esploreremo i modi in cui possiamo manipolare i registri del server e dell'agente.
Comportamento predefinito
Per impostazione predefinita, SQL Server conserva gli ultimi sei registri degli errori e gli ultimi nove registri dell'agente nell'istanza. Per impostazione predefinita, viene generato un nuovo file di registro ogni volta che viene riavviata l'istanza dell'agente. Il numero di file di registro conservati può essere modificato per i registri di SQL Server utilizzando l'istruzione della GUI equivalente di seguito (Fig. 1). Per aprire questa GUI in Esplora oggetti, fai clic con il pulsante destro del mouse su Gestione , seleziona Registro errori di SQL Server e fai clic su Configura .
Fig 1. Ultimi sei registri degli errori
Ogni file di registro viene generato al riavvio e archiviato fisicamente in C: \Programmi\ Microsoft SQL Server\MSSQL14.
Durante l'avvio dell'istanza, il motore scrive le informazioni chiave nel registro degli errori che includerà:
Dettagli sulla versione di SQL Server Produttore del sistema
- ID processo di SQL Server
- Numero di porta in uso
- Modalità di autenticazione
- Parametri di avvio del registro
- Account di servizio
- Dimensioni della CPU e della memoria rilevate
- Stato delle opzioni chiave es. Pagine di grandi dimensioni, estensione del pool di buffer, OLTP in memoria ecc.
Queste informazioni possono essere molto utili quando vuoi semplicemente scoprire rapidamente una di esse dall'istanza che ti viene presentata.
Configurazione delle opzioni del registro degli errori
Come accennato in precedenza, alcuni aspetti del registro degli errori SQL e del registro dell'agente sono configurabili. Nel mio ambiente, impostiamo NumErrorLogs a 30 perché vogliamo che gli ultimi trenta giorni di registri vengano conservati quotidianamente. Ci assicuriamo che ogni file di registro contenga i dati di un giorno eseguendo sp_cycle_errorlog (e sp_cycle_agent_errorlog) a mezzanotte utilizzando un processo agente. Il Listato 3 mostra i dettagli di questo lavoro. Queste procedure memorizzate possono anche essere molto utili per ciclare in modo esplicito il registro degli errori quando si desidera riprodurre un problema e guardarlo svolgersi (ad esempio prima dell'escalation a SQL Profiler o agli eventi estesi).
-- 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
Fig 2. Impostazione del numero massimo di file di registro degli errori
Il registro degli errori di SQL Agent può essere configurato con un certo livello di dettaglio facendo clic con il pulsante destro del mouse su SQL Server Agent , e poi Registri errori e seleziona Configura dal menu. Il Listato 2 e la Fig. 2 mostrano come modificare il livello di registrazione.
-- Listing 2: Setting Error Logging Level USE [msdb] GO EXEC msdb dbo.sp_set_sqlagent_properties @errorlogging_level 7 GO
Fig 3. Impostazione delle opzioni del registro errori di SQL Agent
-- 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
"Versare" attraverso i registri
Conoscere il registro degli errori è utile per identificare elementi come gli elementi elencati nella seconda sezione o per monitorare eventi come il ripristino di un database di grandi dimensioni. Ma quando cerchi un elemento specifico come errori di accesso o errori simili nascosti nel mare di log, potresti voler utilizzare il filtro o cerca capacità.
Fig 4. Filtra e cerca
La cerca sarebbe utile quando si cerca un numero o un testo di errore specifico. La ricerca restituisce le occorrenze dell'elemento richiesto per riga alla volta. Quando è necessario restringere il registro degli errori utilizzando criteri specifici, utilizzare il filtro. Puoi filtrare per connessione , data o generale dettagli.
Fig 5. Criterio di ricerca
Fig 6. Criterio di filtro
Quando l'istanza non riesce
Una buona domanda che farebbe un lettore appassionato è cosa succede quando SQL Server non si avvia? Come esaminiamo i registri? Ebbene, succede che oltre al fatto che i registri degli errori vengono scritti in file flat il cui percorso è stato precedentemente specificato, puoi anche visualizzare i registri del server e dell'agente nel Visualizzatore eventi di Windows. Tutto quello che devi fare è filtrare i registri dell'applicazione del Visualizzatore eventi per gli eventi con un MSSQLSERVER di origine. In ambienti più avanzati, i registri di SQL Server, come qualsiasi altro registro di Windows, possono essere archiviati in uno strumento di terze parti come SEIM o Splunk. Questo rende le cose molto più facili. A partire da SQL Server 2012, è anche possibile visualizzare i log degli errori offline da un'altra istanza interamente, utilizzando server registrati e WMI e WQL.
Fig 7. Visualizzazione dei registri di SQL Server nel Visualizzatore eventi
Conclusione
Il registro degli errori di SQL Server può essere considerato il punto di partenza per la risoluzione degli errori comuni. Altri registri, come i file di traccia generati da SQL Trace o acquisiti da SQL Profiler o Extended Events Session, forniscono molti più dettagli su ciò che sta accadendo all'interno del motore. Esistono anche registri specifici come quelli relativi a Posta elettronica database o Replica. Sebbene siano tutti molto utili per la risoluzione dei problemi in SQL Server, consiglierei i log degli errori di SQL Server come ottimo punto di partenza.
Riferimenti
Visualizzazione del log degli errori di SQL Server
Visualizzazione dei file di registro offline
Registro errori ciclo sp
Registro degli errori dell'agente del ciclo sp
Percorso di installazione predefinito di SQL Server