MS SQL的日志信息/日志记录,可能对你来说,既熟悉又陌生,熟悉是因为你可能一直都在使用,查看、关注一些日志信息/记录,例如,作业历史记录;陌生是因为你可能从不关注日志信息/记录的管理,这里我一直用日志信息/记录这个词,而没有用日志文件这个词来阐述,是想让大家把它和事务日志文件(ldf)区分开来,网上你用日志文件做搜索关键词,可能搜出来的都是事务日志相关的信息。其实它真的也叫日志文件,这篇文章我大概从日志记录分类、如何查看日志记录、日志记录的位置、日志记录的设置、为什么错误日志会暴增、如何清除日志记录等方面来讲述。

日志记录分类

按日志文件查看器,习惯将错误日志归为SQL SERVER、 SQL SERVER 代理, Windows应用程序日志,数据库邮件等四类错误日志记录。如果还考虑维护计划、远程维护计划、作业历史记录日志信息,总共是7类日志信息文件。

其中Windows应用程序日志类型又分为系统日志(System)、安全日志(Security)、应用程序日志(Application), PatchLink日志等几种,我在服务器(Windows Server  2008 R2 Standard)上打开SSMS,居然发现又多了HardwareEvents, Internet Explorer、Windows PowerShell等日志文件。这些都是系统的日志文件。你不必太纠结有多少种。

日志记录位置

SQL SERVER日志记录、 SQL SERVER代理记录的位置如下所示, SQL SERVER日志记录一般存储在ERRORLOG.n(n为数字)文件里, SQL SERVER代理日志记录位于SQLAGENT.n这类的文件里。当然这跟数据库的版本也有关系:

版本

路径

SQL SERVER 2005

Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\LOG

SQL SERVER 2008

Program Files\Microsoft SQL Server\MSSQL10.实例名\MSSQL\LOG

SQL SERVER 2008 R2

Program Files\Microsoft SQL Server\MSSQL10_50.实例名\MSSQL\LOG

SQL SERVER 2005,默认情况下,错误日志位于 Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\LOG\ERRORLOG 和 ERRORLOG.n 文件中。其中MSSQL.n的区分为:

MSSQL.1:SQLSERVER

MSSQL.2:SSAS

MSSQL.3:SQLExpress

MSSQL.4:SSRS

所以,一般情况下,你只需要关注MSSSQL.1目录下的日志文件

那么,数据库邮件日志记录位于哪里呢?作业历史记录日志信息、Windows应用程序日志又位于哪里呢?是不是从没考虑过这些?

数据库邮件日志记录信息可以从视图msdb.dbo.sysmail_event_log查询得到,实质保存在[dbo].[sysmail_log]表里面。

sysmail_event_log
  1. SELECT log_id ,
  2. CASE event_type
  3. WHEN 0 THEN 'success'
  4. WHEN 1 THEN 'information'
  5. WHEN 2 THEN 'warning'
  6. ELSE 'error'
  7. END AS event_type ,
  8. log_date ,
  9. description ,
  10. process_id ,
  11. sl.mailitem_id ,
  12. account_id ,
  13. sl.last_mod_date ,
  14. sl.last_mod_user
  15. FROM[dbo].[sysmail_log] sl
  16. WHERE   ( ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0) = 1 )
  17. OR( EXISTS( SELECT    mailitem_id
  18. FROM      [dbo].[sysmail_allitems] ai
  19. WHERE     sl.mailitem_id = ai.mailitem_id ) )

作业历史记录日志信息都保存在msdb.dbo.sysjobhistory的表里面,其中run_status字段代表作业执行状态

0 = 失败

1 = 成功

2 = 重试

3 = 已取消

4= 正在进行

所有Windows应用程序日志其实都位于同一位置%SystemRoot%\System32\Winevt\Log。像Application日志文件位于%SystemRoot%\System32\Winevt\Logs\Application.evtx,如下所示,

查看日志记录

查看日志记录可以确保进程(例如,备份和还原操作、批处理命令或其他脚本和进程)成功完成。此功能可用于帮助检测任何当前或潜在的问题领域,包括自动恢复消息(尤其是在 SQL Server 实例已停止并重新启动时)、内核消息或其他服务器级错误消息。

方式1: 查看错误日志文件

对SQL SERVER、SQL SERVER AGENT日志记录信息,你可以直接去log目录下找到ERRORLOG、SQLAGENT日志文件,直接打开查看;而像Windows应用程序日志记录,去到%SystemRoot%\System32\Winevt\Log目录,找到对应的日志文件,直接打开查看。

方式2:通过SSMS来查看日志记录

查看与常规 SQL Server 活动相关的日志

  1. 在对象资源管理器中,依次展开“管理”“SQL Server 日志”,再双击“当前<日期/时间>,将显示 SQL Server“SQL 代理”“Windows 事件”日志。

查看与作业相关的日志

  1. 在对象资源管理器中,展开“SQL Server 代理”,右键单击“作业”,再单击“查看历史记录”,此时将显示“作业历史记录”“SQL 代理”日志。

查看与维护计划相关的日志

  1. 在对象资源管理器中,展开“管理”,右键单击“维护计划”,再单击“查看历史记录”,此时将显示“维护计划”“作业历史记录”“SQL 代理”日志。

方式3:用脚本查看

3.1 对于SQL SERVER日志文件,可以通过下面脚本查看:

   --查看日志文件的存档号

EXEC master.dbo.sp_enumerrorlogs

用这个命令可以查看日志文件的大小,这个非常有用,你可以把大小异常的文件给排查出来。

--根据存档号查看该档日志内容

EXEC master.dbo.xp_readerrorlog 1

--根据job_id查看SQL SERVER日志记录

SELECT * FROM  msdb.dbo.sysjobhistory WHERE job_id='36E9232B-CD5B-4646-9BED-B8242090FFF9'

3.2 对于作业历史记录日志信息,你既可以通过下面存储过程查看,也可以直接查询对应的表。

例如,我要查看作业“ServerDiskCapacityCheck”的历史记录

Code Snippet
  1. USE msdb ;
  2. GO
  3. EXEC dbo.sp_help_jobhistory
  4. @job_name = N'ServerDiskCapacityCheck' ;
  5. GO
  6. »ò
  7. SELECT      j.name AS  [JOB_NAME] ,
  8. h.step_id AS  [Step] ,
  9. h.step_name AS  [STEP_NAM] ,
  10. h.MESSAGE AS  [Message] ,
  11. [Status]    = CASE WHEN h.run_status = 0 THEN 'Failed'
  12. WHEN h.run_status = 1 THEN 'Succeeded'
  13. WHEN h.run_status = 2 THEN 'Retry'
  14. WHEN h.run_status = 3 THEN 'Canceled'
  15. END,
  16. h.run_date AS  [RunDate] ,
  17. h.run_time AS  [RunTime] ,
  18. h.run_duration  AS  [RunDuration]
  19. FROM        sysjobs j
  20. INNER JOIN  sysjobhistory h ON h.job_id = j.job_id
  21. WHERE h.run_date>=CONVERT(CHAR(8),GETDATE()-1,112) AND h.run_status<>1
  22. /* WHERE    j.name = 'Job_Name' */
  23. ORDER BYh.run_date, h.run_time

3.3数据库邮件记录查看

SELECT * FROM  msdb.dbo.sysmail_event_log;

日志记录管理

设置最大错误日志文件数

1:在对象资源管理器中,连接到 SQL Server 数据库引擎实例,再展开该实例。

2:在”管理“选项,选择”SQL SERVER日志”,单击右键选择配置。 顺便说一下,很多网上资料说,SQL SERVER默认保留前6个日志文件,但是我查看了SQL SERVER 2005和SQL SERVER 2008,都是默认保留30个,有时候需要自己去验证、实验,不要人人亦云。估计这个说法是SQL SERVER 2000时的配置了。

当然,你也可以用命令设置:

USE [master]
 
GO
 
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'NumErrorLogs', REG_DWORD, 10
 
GO
 

设置错误日志文件存放目录

1:在对象资源管理器中,连接到 SQL Server 数据库引擎实例,再展开该实例。

2:展开“SQL SERVER”代理。

3:右键单击”错误日志“,然后选择配置选项,如下所示:

4:在”错误日志文件“选项中,输入新的路径和文件名,或使用浏览(...)按钮进行查找。重新启动SQL SERVER代理服务后,SQL SERVER代理才写入到新的日志文件。

设置作业历史记录日志

  1. 对象资源管理器中,连接到 SQL Server 数据库引擎 实例,再展开该实例。
  2. 右键单击“SQL Server 代理”,再单击“属性”
  3. “SQL Server 代理属性”对话框中,选择“历史记录”页。
  4. 从下列选项中选择:
    • 选中“限制作业历史记录日志的大小”,然后键入作业历史记录日志的最大行数和每个作业的最大行数。
    • 选中“自动删除代理历史记录”,然后指定时间段。这样,早于此时间段的历史记录将从日志中清除。

为什么错误日志文件暴增?

这里我说的不仅仅指某个错误日志记录文件暴增,也指目录Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\LOG所占空间暴增,如果你平时都不关注这些错误日志,也从不维护错误日志记录文件,那么很有可能它所占的空间非常大,大到让你吃惊的地步。几十G的我也见过,那么具体原因可能有以下种(如果大家还碰到过其它情况,欢迎补充):

1:SQL 内部错误的时候会产生非常多的DUMP文件,如下所示

2:高可用的数据库服务器可能很少停机,而你又没有定期清理、清空这些错误日志信息,那么ERRORLOG.n/SQLAGENT.n文件增长会非常大。这样对于DBA使用错误日志查找信息就会比较困难,而且日志大了加载、写入以后性能也会受到影响。

3:其实还有一个情况,如果你数据库IP地址曝露在外网时,会遭到大量尝试登录sa的攻击,也会产生大量的审核失败日志信息。

4:就是一些SQL SERVER PROFILE文件没有删除,当然,这个本质跟日志文件暴增没啥关系,但是跟LOG文件夹的大小有些关系。

如何清理错误日志:

对于SQL SERVER日志、SQL SERVER AGENT日志记录,微软提供了一个存储过程sp_cycle_errorlog可以实现日志的循环。 这个存储过程的作用是关闭当前的错误日志文件,并循环错误日志扩展编号(就像重新启动服务器)。每次启动SQL Server 时,都会将当前错误日志重命名为errorlog.1errorlog.1 变为errorlog.2errorlog.2 变为errorlog.3,依次类推。最后一个errorlog.n将会被删除。sp_cycle_errorlog 可使您循环访问错误日志文件,而不必停止和启动服务器。

另外:日志过大说明你没有截断错误日志,错误日志是可以截断的,进入你的数据库输入DBCC ERRORLOG

每执行一次,当前的错误日志退出,让后建立新的错误日志,你只能删除 ERRORLOGn的错误日志没有号码的是正在使用的日志,删除会报错,如果它比较大,就DBCC ERRORLOG,而后他会变成ERRORLOG+编号,你就可以删除了,另外建议你把这些ERRORLOG 放到其他盘符,比较好管理。

对于 Windows应用程序日志,一般都有默认的大小设置,以及按需要覆盖。这些配置一般也是最优的配置。所以这块除非你有特殊需求,否则不用你操心。

对于邮件日志记录,存储过程sysmail_delete_log_sp提供从数据库邮件日志中删除事件。删除日志中的所有事件或删除符合某一日期或类型条件的那些事件

sysmail_delete_log_sp [ [ @logged_before = ] 'logged_before' ]

[, [ @event_type = ] 'event_type' ]

删除参数指定的所有 SQL Server 代理作业步骤日志。使用此存储过程可维护 msdb 数据库中的 sysjobstepslogs 表。

sp_delete_jobsteplog { [ @job_id = ] 'job_id' | [ @job_name = ] 'job_name' }

[ , [ @step_id = ] step_id | [ @step_name = ] 'step_name' ]

[ , [ @older_than = ] 'date' ]

[ , [ @larger_than = ] 'size_in_bytes' ]

删除作业的历史记录

删除特定作业YourSQLDba_LogBackups的历史记录。

USE msdb ;

GO

EXEC dbo.sp_purge_jobhistory

@job_name = N'YourSQLDba_LogBackups' ;

GO

以下示例将不带参数执行此过程以删除所有的历史记录。

USE msdb ;

GO

EXEC dbo.sp_purge_jobhistory ;

GO

删除参数指定的所有 SQL Server 代理作业步骤日志。使用此存储过程可维护 msdb 数据库中的 sysjobstepslogs 表。如果你想好好维护日志记录,那么你可以整合上面的思想方法到一个存储过程,然后配置一个作业来定期清理日志记录,接下来我们看看YourSQLDba的方法吧

Code Snippet
  1. USE [YourSQLDba]
  2. GO
  3. /****** Object:  StoredProcedure [yMaint].[LogCleanup]    Script Date: 05/28/2013 18:36:21 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. -----------------------------------------------------------------------------
  9. -- yMaint.LogCleanup (for entries older than 30 days)
  10. -- Mail logs
  11. -- Backup history logs
  12. -- Job history
  13. -- Cycle SQL Server error log
  14. -----------------------------------------------------------------------------
  15. create proc [yMaint].[LogCleanup]
  16. @jobNo Int
  17. as
  18. Begin
  19. declare @d nvarchar(8)
  20. declare @lockResult int
  21. declare @sql nvarchar(max)
  22. Begin try
  23. exec yMaint.LockMaintDb@jobNo=@jobNo, @lockType='C', @DbName = 'LogCleanUpStep', @Result = @lockResult output
  24. If @lockResult > 0
  25. Return;
  26. Set @sql = 'Exec msdb.dbo.sysmail_delete_log_sp @logged_before = "<d>";'
  27. Set @sql = replace(@sql, '<d>', convert(nvarchar(8), dateadd(dd, -30, getdate()), 112))
  28. Set @sql = replace(@sql, '"', '''')
  29. Exec yExecNLog.LogAndOrExec
  30. @context = 'yMaint.LogCleanup'
  31. , @info = 'Cleanup log entries older than 30 days, begins with mail'
  32. , @sql = @sql
  33. , @JobNo = @JobNo
  34. Set @sql = 'EXECUTE msdb.dbo.sysmail_delete_mailitems_sp  @sent_before = "<d>";'
  35. Set @sql = replace(@sql, '<d>', convert(nvarchar(8), dateadd(dd, -30, getdate()), 112))
  36. Set @sql = replace(@sql, '"', '''')
  37. Exec yExecNLog.LogAndOrExec
  38. @context = 'yMaint.LogCleanup'
  39. , @info = 'Cleanup log entries older than 30 days, for mailitems'
  40. , @sql = @sql
  41. , @JobNo = @JobNo
  42. -- clean backup history
  43. Set @sql = 'exec  Msdb.dbo.sp_delete_backuphistory   @oldest_date = "<d>" '
  44. Set @sql = replace(@sql, '<d>', convert(nvarchar(8), dateadd(dd, -30, getdate()), 112))
  45. Set @sql = replace(@sql, '"', '''')
  46. Exec yExecNLog.LogAndOrExec
  47. @context = 'yMaint.LogCleanup'
  48. , @info = 'Cleanup log entries older than 30 days, for backup history'
  49. , @sql = @sql
  50. , @JobNo = @JobNo
  51. -- clean sql agent job history
  52. Set @sql = 'EXECUTE  Msdb.dbo.sp_purge_jobhistory  @oldest_date = "<d>"'
  53. Set @sql = replace(@sql, '<d>', convert(nvarchar(8), dateadd(dd, -30, getdate()), 112))
  54. Set @sql = replace(@sql, '"', '''')
  55. Exec yExecNLog.LogAndOrExec
  56. @context = 'yMaint.LogCleanup'
  57. , @info = 'Cleanup log entries older than 30 days, for job history'
  58. , @sql = @sql
  59. , @JobNo = @JobNo
  60. -- clean job maintenance job history (SQL Server own maintenance)
  61. Set @sql = 'EXECUTE  Msdb.dbo.sp_maintplan_delete_log null,null,"<d>"'
  62. Set @sql = replace(@sql, '<d>', convert(nvarchar(8), dateadd(dd, -30, getdate()), 112))
  63. Set @sql = replace(@sql, '"', '''')
  64. Exec yExecNLog.LogAndOrExec
  65. @context = 'yMaint.LogCleanup'
  66. , @info = 'Cleanup log entries older than 30 days, for SQL Server job maintenace plans'
  67. , @sql = @sql
  68. , @JobNo = @JobNo
  69. -- archive current log, and start a new one
  70. Set @sql = 'Execute sp_cycle_errorlog'
  71. Set @sql = replace(@sql, '<d>', convert(nvarchar(8), dateadd(dd, -30, getdate()), 112))
  72. Set @sql = replace(@sql, '"', '''')
  73. Exec yExecNLog.LogAndOrExec
  74. @context = 'yMaint.LogCleanup'
  75. , @info = 'Recycle Sql Server error log, start a new one'
  76. , @sql = @sql
  77. , @JobNo = @JobNo
  78. Delete H
  79. From
  80. (
  81. Select distinct JobNo --
  82. From  Maint.JobHistory
  83. Where JobStart < dateadd(dd, -30, getdate())
  84. ) as T
  85. join
  86. Maint.JobHistory H
  87. On H.JobNo = T.JobNo
  88. End try
  89. Begin catch
  90. exec yMaint.UnLockMaintDb@jobNo=@jobNo, @DbName = 'LogCleanUpStep'
  91. Exec yExecNLog.LogAndOrExec
  92. @context = 'yMaint.LogCleanup'
  93. , @Info = 'Error caught in proc'
  94. , @err = '?'
  95. , @JobNo = @JobNo
  96. End Catch
  97. exec yMaint.UnLockMaintDb@jobNo=@jobNo, @DbName = 'LogCleanUpStep'
  98. End -- yMaint.LogCleanup
  99. GO

参考资料:

http://msdn.microsoft.com/zh-cn/library/ms187885(v=sql.105).aspx

http://www.jb51.net/article/26988.htm

http://groundsel.itpub.net/post/1284/494264

http://www.canway.net/Lists/CanwayOriginalArticels/DispForm.aspx?ID=291

http://technet.microsoft.com/zh-cn/library/ms191202(v=SQL.105).aspx

http://support.microsoft.com/kb/157804/zh-cn

http://support.microsoft.com/kb/115519/zh-cn

http://blog.csdn.net/smithliu328/article/details/7843724

http://blog.csdn.net/claro/article/details/5660524

http://www.cnblogs.com/lyhabc/archive/2013/02/12/2910623.html

MS SQL 日志记录管理的更多相关文章

  1. MS SQL 需要定期清理日志文件

    前言碎语 关于对SQL SERVER 日志文件管理方面了解不多的话,可以参考我的这篇博客文章“MS SQL 日志记录管理”,不过这篇文章只是介绍对SQL SERVER日志记录的深入认知了解,并没有提出 ...

  2. MS SQL xp_instance_regwrite设置注册表疑惑

      以前写过一篇博文"MS SQL 日志记录管理",里面介绍了如何设置SQL Server的错误日志的最大归档数量,如果在SSMS的UI界面设置,可以从"Manageme ...

  3. 网站添加数据出错,原来是MS SQL Server2008日志文件占据空间过大导致的

    最近发现公司上线的八爪鱼招标网有部分功能出现问题,主要表现为无法向数据库插入数据:远程登陆到数据库服务器时,发现原本的40G空间都被数据库吃完了,于是打开MS SQL Server 2008对数据库进 ...

  4. MS SQL SERVER 数据库日志压缩方法与代码

    MS SQL性能是很不错的,但是数据库用了一段时间之后,数据库却变得很大,实际的数据量不大.一般都是数据库日志引起的!数据库日志的增长可以达到好几百M. DUMP TRANSACTION [数据库名] ...

  5. MS SQL 监控数据/日志文件增长

        前几天,在所有数据库服务器部署了监控磁盘空间的存储过程和作业后(MS SQL 监控磁盘空间告警),今天突然收到了两封告警邮件,好吧,存储规划是一方面,但是,是不是要分析一下是什么原因造成磁盘空 ...

  6. MS SQL 事物日志传送能否跨数据库版本吗?

    SQL SERVER的事物日志传送(log shipping)功能,相信很多人都使用过或正在应用,这是MS SQL提供的一个非常强大的功能,一般需要一个主数据库服务器(primary/producti ...

  7. MS SQL Server 数据库分离-SQL语句

    前言 今天在在清理数据库,是MS SQL Server,其中用到分离数据库文件.在这过程中,出现了一个小小的问题:误将数据库日志文件删除了,然后数据就打不开了,除了脱机,其他操作都报错. 数据库分离 ...

  8. [转]ms sql 2000 下批量 附加/分离 数据库(sql语句)

    这次公司要把MS SQL Server 2000 服务器上的数据库复制到新的服务器上面去,于是几百个数据库文件就交给我附加到新服务器上了   以前一直没接触过这方面的东西,于是果断谷歌了也百度了  找 ...

  9. MS SQL SERVER 中的系统表

    MS SQL SERVER 中的系统表 序号 名称 说明 备注 1 syscolumns 每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行.   2 syscomments 包含每 ...

随机推荐

  1. GBK,UNICODE,GB2312,UTF-8学习总结

    转自http://www.cnblogs.com/pannengzhi/p/5678495.html UNICODE,GBK,UTF-8区别 前言 其实这是个老生常谈的问题了,相信大家在第一次遇到Un ...

  2. [整理]HTTPS和SSL证书

    在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了.本文追本溯源围绕这个模式谈一谈. 名词解释 首先解释一下上面的几个名词: • https:在http(超 ...

  3. 优雅的处理Redis访问超时

    很长一段时间以来,一直在项目中使用Redis作为辅助存储,确切来说是利用Redis的内存存储,而不是将其作为缓存.比如常见的利用Set集合来判断某个数值是否存在,或者将来自不同请求的数据放在Redis ...

  4. vue的组件小操作

    项目技术: webpack + vue + element + axois (vue-resource) + less-loader+ ... vue的操作的方法案例: 1.数组数据还未获取到,做出预 ...

  5. Django 1.10中文文档-第一个应用Part1-请求与响应

    在本教程中,我们将引导您完成一个投票应用程序的创建,它包含下面两部分: 一个可以进行投票和查看结果的公开站点: 一个可以进行增删改查的后台admin管理界面: 我们假设你已经安装了Django.您可以 ...

  6. git>>>>1

    参考博客:http://www.cnblogs.com/wupeiqi/p/7295372.html - 版本控制,各行各业都需要 - 版本控制工具 - svn - git - git,软件帮助使用者 ...

  7. 持续更新:从零开始的php学习生活

    其实也不是真的从零开始,在此之前我还是一边研究博学(博客美化)一边学的CSS.HTML.JavaScript的,相关内容可以戳这里. 看本文之前你最好稍微熟悉一下HTML.JavaScript什么的. ...

  8. #if defined、#if !defined用法

    大型程序或者修改别人的程序时,当我们需要定义常量(源文件还是头文件 ),我们就必须返回检查原来此常量是否已经定义, if defined宏 就是用于检测的. 举个例子,如下: #define .... ...

  9. javascript 之原型、原型链-14

    原型 原型是一个对象,每个函数对象(在javascript 之对象中说过函数也是对象 )都有一个属性(prototype)指向这个对象--原型对象,这个对象的作用是让所有对象实例共享原型对象中的属性. ...

  10. 配置web.xml文件用于配置tomcat

    <Context path = "/myweb" docBase = "E:\workspace1\myweb\WebRoot" reloadable = ...