## Kedy použiť Ranná kontrola, po reštarte, po incidente úložiska (823 / 824 / 825), pri chybách prihlásenia (18456) alebo keď hľadáš, kedy sa niečo stalo. ## Ako čítať výsledok Prvá sada: riadky logu od najnovšieho. `HideNoise = 1` skryje bežné hlášky (zálohy, CHECKDB s 0 chybami, Login succeeded…). Druhá sada: koľkokrát sa v logu vyskytlo ktoré číslo chyby (`Error: 18456, Severity: 14…`) – rýchly prehľad, čo sa opakuje. Pri chybe 18456 hľadaj `State` v nasledujúcom riadku – hovorí presný dôvod zlyhania prihlásenia. > [!WARNING] > Veľký error log (bez pravidelného `sp_cycle_errorlog`) sa načítava dlho a zaťaží `tempdb`. `sys.sp_readerrorlog` je dokumentovaná, ale procedúra `xp_readerrorlog`, ktorú volá, nie. Čísla logov (0, 1, 2…) sa pri každom recykle posúvajú. Pre SQL Agent log (`LogType = 2`) obsahuje druhý stĺpec úroveň chyby namiesto ProcessInfo. **Oprávnenia:** SQL Server 2016–2019: člen `securityadmin` alebo `VIEW SERVER STATE`. SQL Server 2022: `securityadmin`, `VIEW ANY ERROR LOG` alebo `VIEW SERVER STATE`. **Režim:** READ ONLY · **Verzia:** SQL Server 2016 – 2022 ## Súvisiace recepty - [Suspect pages – evidované poškodené stránky](script.php?id=32&s=suspect-pages-evidovane-poskodene-stranky) - [SQL Agent – joby, ktoré naposledy zlyhali](script.php?id=40&s=sql-agent-joby-ktore-naposledy-zlyhali) - [CHECKDB našiel chybu – čo ďalej](script.php?id=61&s=checkdb-nasiel-chybu-co-dalej-823-824-825) ## Zdroje - [sys.sp_readerrorlog](https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-readerrorlog-transact-sql) _Skript je staticky overený proti dokumentácii Microsoft Learn (názvy DMV, stĺpcov a hodnôt), nie spustený na živom serveri. Pred použitím na PROD ho vyskúšaj na TEST._
Error log s filtrom
Načíta SQL Server alebo SQL Agent error log (aktuálny aj staršie), voliteľne filtruje text a skryje bežný šum (úspešné zálohy, CHECKDB bez chýb, prihlásenia). Plus prehľad čísel chýb.
/* DeadlockCafe | Error log s filtrom
Účel: Načíta SQL Server alebo SQL Agent error log (aktuálny aj staršie), voliteľne filtruje text a skryje bežný šum (úspešné zálohy, CHECKDB bez chýb, prihlásenia). Plus prehľad čísel chýb.
Režim: READ ONLY | SQL Server 2016 – 2022, on-premises
*/
SET NOCOUNT ON;
DECLARE @LogNumber int = {{LogNumber:0|Číslo logu: 0 = aktuálny, 1 = predošlý…}};
DECLARE @LogType int = {{LogType:1|1 = SQL Server, 2 = SQL Agent}};
DECLARE @Search nvarchar(4000) = N'{{Search:*|Hľadaný text, * = bez filtra}}';
DECLARE @HideNoise bit = {{HideNoise:1|1 = skryť bežné hlášky, 0 = zobraziť všetko}};
IF @Search = N'*' SET @Search = NULL;
IF OBJECT_ID(N'tempdb..#log') IS NOT NULL DROP TABLE #log;
CREATE TABLE #log
(
id int IDENTITY(1,1) PRIMARY KEY,
log_date datetime NULL,
process_info nvarchar(100) NULL, -- pri Agent logu: ErrorLevel
message nvarchar(max) NULL
);
INSERT INTO #log (log_date, process_info, message)
EXEC sys.sp_readerrorlog @LogNumber, @LogType, @Search;
-- 1) riadky logu
SELECT l.log_date, l.process_info, l.message
FROM #log AS l
WHERE @HideNoise = 0
OR NOT ( l.message LIKE N'Log was backed up%'
OR l.message LIKE N'Database backed up%'
OR l.message LIKE N'Database differential changes were backed up%'
OR l.message LIKE N'BACKUP DATABASE successfully%'
OR l.message LIKE N'BACKUP DATABASE WITH DIFFERENTIAL successfully%'
OR l.message LIKE N'BACKUP LOG successfully%'
OR l.message LIKE N'DBCC CHECKDB (%found 0 errors and repaired 0 errors%'
OR l.message LIKE N'Login succeeded%'
OR l.message LIKE N'This instance of SQL Server has been using a process ID%'
OR l.message LIKE N'Setting database option%')
ORDER BY l.log_date DESC, l.id DESC;
-- 2) ktoré chyby sa opakujú
SELECT TRY_CONVERT(int, SUBSTRING(l.message, 8, CHARINDEX(N',', l.message) - 8)) AS error_number,
COUNT(*) AS occurrences,
MIN(l.log_date) AS first_seen,
MAX(l.log_date) AS last_seen
FROM #log AS l
WHERE l.message LIKE N'Error: %,%'
GROUP BY TRY_CONVERT(int, SUBSTRING(l.message, 8, CHARINDEX(N',', l.message) - 8))
ORDER BY occurrences DESC;