什么是错误日志?
错误日志是数据库管理系统的一个组件,它可以记录系统运行期间发生的各种错误和警告信息,帮助管理员了解系统运行的情况,诊断和解决各种问题。
在SQL Server中,错误日志通常包含以下信息:
服务器启动和关闭的时间
用户登录和注销的信息
SQL Server错误、警告和消息
系统性能参数的修改和其他事件
错误日志的位置可以通过SQL Server Management Studio中的“服务器属性”窗口获得,也可以通过以下查询语句获取:
SELECT SERVERPROPERTY('ErrorLogFileName')
为什么要分析错误日志?
错误日志是数据库管理员诊断和解决各种问题的重要依据。通过错误日志分析,管理员可以快速了解系统的健康状况,找出并解决系统出现的各种故障。
值得注意的是,SQL Server的错误日志可以记录使用过去7天的所有错误信息。在某些情况下,日志文件可能会非常大,因此需要管理员定期归档和清理日志,以便系统正常工作。
如何分析MSSQL错误日志?
1. 找到错误日志文件
在SQL Server Management Studio中,可以通过“管理”节点下的“日志文件”选项访问错误日志,也可以通过以下查询语句获取错误日志文件的位置:
EXEC SP_READERRORLOG
此外,SQL Server的错误日志也可以在Windows事件查看器中找到,打开路径为:应用程序和服务日志\Microsoft\SQL Server\MSSQL{版本号.实例名称}\错误日志。
2. 了解错误日志的格式
SQL Server的错误日志是一个文本文件,其中包含了很多有用的信息。每个日志条目都是一个段落,包含了时间戳、错误类型、事件信息和错误代码等关键信息。
2019-04-04 10:02:16.40 Logon Error: 18456, Severity: 14, State: 38.
2019-04-04 10:02:16.40 Logon Login failed for user 'myuser'. Reason: Failed to open the explicitly specified database 'mydatabase'. [CLIENT: 10.10.10.1]
上面的例子显示了一个登录失败的错误消息,告诉我们出现了状态码为38的错误,原因是连接的数据库不存在。
3. 根据错误代码查找帮助
某些错误代码可能很常见,可以在互联网上找到对应的帮助。例如,代码18456表示登录失败,通过在搜索引擎中输入“SQL Server Error 18456解决方法”,可以获得大量的相关文章。
4. 使用系统视图和函数
SQL Server提供了一些视图和函数,可以帮助管理员从错误日志中提取特定信息。例如,SUSER_SNAME()函数可以获取登录的用户名,ERROR_LINE()函数可以获取出错的行号。
以下的查询语句可以从错误日志中查找所有的登录事件并显示对应的用户名:
SELECT
CAST(REPLACE(REPLACE(LogText, CHAR(9), ''), CHAR(13), '') AS DATETIME) AS Logdate,
Substring(LogText, CHARINDEX('(', LogText, CHARINDEX('login', LogText)) + 1, CHARINDEX(')', LogText, CHARINDEX('login', LogText)) - CHARINDEX('(', LogText, CHARINDEX('login', LogText)) - 1) AS LoginName
FROM
::fn_trace_gettable(CONVERT(VARCHAR(150), (SELECT TOP 1 s.value FROM sys.server_configuration s WHERE s.name ='TraceFile')), DEFAULT)
WHERE
EventClass = 14
5. 使用过滤功能
错误日志可能会包含大量的信息,因此对于特定的问题,管理员可以使用过滤器来筛选相关的信息。例如,过滤掉一些常见的信息,如登录和注销事件,可以通过以下查询实现:
SELECT *
FROM sys.fn_xe_file_target_read_file('C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log\ERRORLOG', null, null, null)
WHERE (object_name IS NULL OR object_name NOT LIKE 'Logon%')
AND (object_name IS NULL OR object_name NOT LIKE 'Logout%')
AND (object_name IS NULL OR object_name NOT LIKE 'Audit%');
6. 使用SQL Server Profiler
如果错误日志无法提供足够的信息,管理员可以使用SQL Server Profiler组件进行更详细的跟踪和诊断。通过分析数据库的常规行为,可以检测一些隐藏的问题并识别优化机会。
总结
通过分析错误日志可以大大简化系统故障的排查过程。管理员需要了解每种错误的含义和可能的原因,逐步剖析错误发生的原因和过程,采取适当的解决方案。对于常见的问题,可以使用SQL Server提供的系统视图和函数来搜索和过滤信息,加快排查问题。