Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Esplorazione dei log degli errori di SQL Server

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.\MSSQL\Log insieme a file di traccia e file di dump. I registri degli errori di SQL Server sono denominati ERRORLOG.x (dove x è un numero) mentre i registri di SQL Agent sono denominati SQLAGENT.x.

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