日志文件不断增长

原文:日志文件不断增长

先了解SQLServer需要保存的日志记录:

1、  所有没有经过“检查点”的日志记录:

SQLServer定时执行(Checkpoint),保证“脏页”被写入硬盘。没做Checkpoint的,可能是只在内存中修改,数据文件还没同步。SQLServer要在硬盘的日志文件中有记录,一边异常重启后重新修改。

2、  所有没有提交的事务所产生的日志及其后续的日志记录:

所有日志都有严格顺序,不能有跳跃。

3、  要做备份的日志记录:

如果恢复模式不是简单模式,那么SQLServer会认为用户是要去备份日志记录的。所有没备份的记录都会保留。

4、  有其他需要读取日志的数据库功能:

如事务型复制(Transactional Replication)和镜像。

除以上的类型之外,其他类型会在Checkpoint时做截断把占用的空间标志为可重用。如果重用空间足够,是不会报告日志空间已满。Checkpoint的频率由服务器的“Recovery Interval”决定,默认为一分钟左右。

通常日志不断增长的原因有:

1、  数据库恢复模式不是简单,但是没有做日志备份:

在这种模式下,做完整备份和差异备份是不会截断日志的。

2、  数据库上有一个很长时间都没有提交的事务:

SQLServer不会干预前端程序的连接遗留事务在SQLServer中的行为。只要不退出,事务会一直存在,直到(此处原为知道,谢谢kalagooooo的细心发现,现以改正过来)前端主动提交或者回滚。此时做日志备份也没用了。

3、  数据库上有一个很大的事务在运行:

如建立、重建索引。或者insert/delete大量数据。或者是服务器端游标没有把数据及时取走。

4、 数据库复制或镜像出了异常

要避免上述现象,来防止日志不断增长。对于不会做日志备份的数据库,设为简单模式即可。如果是完整模式,一定要定期做日志备份。如果镜像或复制除了问题,要及时处理,如果没有处理,那么要暂时拆除复制或镜像。程序设计时,也要避免事务时间过长、过多。

对于日志增长处理:

步骤1:检查日志现在使用情况和数据库状态:

检查日志使用百分比、恢复模式和日志重用等待状态。从2005以后,sys.databases加入了log_reuse_wait(log_reuse_wait_desc)来反映不能阶段日志的原因


Log_reuse_wait


Log_reuse_wait_desc


说明


0


NOTHING


有可重用的虚拟日志文件


1


CHECKPOINT


上次日志截断后,未出现检查点,或者日志头部尚未跨一个虚拟日志文件移动范围(所有模式)


2


LOG_BACKUP


要求日志备份将日志表头前移(非简单模式)。日志备份完成后,日志标头将前移,并一些空间可能会变成可重用。


3


ACTIVE_BACKUP_OR_RESTORE


数据库备份或还原正在进行(所有模式)


4


ACTIVE_TRANSACTION


事务处于活动状态(所有模式)


5


DATABASE_MIRRORING


数据库镜像滞后(完整模式)


6


REPLICATION


在事务复制中,与发布相关的事务仍未传递到分发数据库(仅限于完整模式)


7


DATABASE_SNAPSHOT_CREATEION


正在创建数据库快照(所有模式)


8


LOG_SCAN


正在进行日志扫描(所有模式)


9


OTHER_TRANSIENT


此值当前未使用

使用以下脚本检查:

DBCC SQLPERF(LOGSPACE)
GO
SELECT name,recovery_model_desc,log_reuse_wait,log_reuse_wait_desc
FROM sys.databases
GO

如果Log Space Used(%)很高,就要马上定位为什么不能被清除。如果状态为:LOG_BACKUP,就意味(此处原为以为,感谢kalagooooo的细心发现,现以改正过来)着SQLServer,意味着SQLServer等待着日志备份。要检查是否需要做日志备份。

步骤2:检查最久的活动事务:

如果大部分日志都在使用中且重用状态为:ACTIVE_TRANSACTION,那么要看看最久的事务是谁申请的:

DBCC OPENTRAN
GO
SELECT  *
FROM    sys.dm_exec_sessions AS t2 ,
        sys.dm_exec_connections AS t1
        CROSS APPLY sys.dm_exec_sql_text(t1.most_recent_sql_handle) AS st
WHERE   t1.session_id = t2.session_id
        AND t1.session_id > 50

执行后返回:

找出最久的事务之后,先要检查是否有问题,如果有问题,那么最好从应用层面把事务提交或回滚。如果实在不行,那就使用KILL SPID来杀掉进程。

时间: 2024-10-12 07:04:15

日志文件不断增长的相关文章

每天自动分割Nginx日志文件

资料来源:https://www.centos.bz/2011/03/split-nginx-logfile-eveyday/ Nginx产生的日志都是存在一个文件,随着网站运行时间越长,日志文件的大小也在不断增长,这对我们想分析当天日志非常的不方便,所以需要每天把日志文件分割出来,并以时间命名. 创建日志分割脚本 1.登录SSH,创建cut_logs.sh文件 vi /root/cut_logs.sh 2.粘贴下面代码到cut_logs.sh,并保存 #!/bin/bash # The Ngi

SQL存储过程删除数据库日志文件的方法

--日志文件收缩至多少M DECLARE @DBLogSise AS INT SET @DBLogSise=0 --查询出数据库对应的日志文件名称 DECLARE @strDBName AS NVARCHAR(500) DECLARE @strLogName AS NVARCHAR(500) DECLARE @strSQL AS VARCHAR(1000) SELECT @strLogName=B.name, @strDBName=A.name FROM master.sys.databases

expdp导出遇到ORA-39064: 无法写入日志文件

. . 导出了 "USER_XXXX"."TAB_YYYY" 0 KB 0 行 ORA-39064: 无法写入日志文件 ORA-29285: 文件写入错误 经过搜索mos,有如下的文章给出了解决方案: Error ORA-39064 Might Be Encountered By DataPump Export (EXPDP) When NLS_LANG Is Different From Database Character Set (Doc ID 1321034

windows服务器清理系统垃圾日志文件

Windows服务器的系统盘如果是2003系统的话那么我们默认给10G的空间就够了,但是有时候我们不经意去查看系统盘的时候发现已经使用了9.9G,其实多是垃圾日志文件占用系统盘空间,使用如下批处理将这些文件删除. 在桌面新建一个文本文档,将如下代码复制进去: @echo off echo 正在清除系统垃圾文件,请稍等...... del /f /s /q %systemdrive%\*.tmp del /f /s /q %systemdrive%\*._mp del /f /s /q %syst

MySQL日志文件与分析

1.查询日志.慢查询日志.二进制日志对比 查询日志 general_log 会记录用户的所有操作,其中包含增删查改等 可以指定输出为表 慢查询日志 slow_log 只要超过定义时间的所有操作语句都记录 可以指定输出为表 二进制日志 log_bin 记录可能执行更改的所有操作 mysqlbinlog查看 2.日志的分析 2.1日志的存储 数据操作过程中,Mysqld是将接收到的语句按照接收的顺序(注意不是执行顺序)写到查询日志文件中.一条一条就类似这样: # Time: 070927 8:08:

用于监控日志文件的是否被修改的脚本

最近一段需要监控观察web服务器上的日志文件是否有写入,用来判断是否服务进程是否是正常,为此就简单写了一个脚本: #!/bin/bash #check_logfile_io.sh #Used to monitor logs I/O #writer jim #histor #2017.3.22 log_file_path=/usr/local/apache/log/access.log First_md5sum=$(/usr/bin/md5sum $log_file_path | awk '{pr

IIS 7 出现日志文件时间与服务器时间不符

最近在分析web日志,发现IIS7日志中时间与系统时间不一致,即本该上班时间才产生 的产并发访问日志,全部发生在凌晨至上班前. 本以为是系统时间设置错误,检查后一切正常.后查询资料,原来是这个原因: 日志的格式有IIS.NCSA.W3C三种: 1.IIS是固定的基于 ASCII 文本的格式,无法自定义记录的字段,字段由逗号分隔, 记录的时间为本地时间文件名前缀为u_in. 2.NCSA是美国国家超级计算技术应用中心 (NCSA) 公用日志文件格式,也是固定的基 于 ASCII 文本的格式,无法自

windows 日志文件查找符合条件的列并统计

因为要将windows每天登陆失败的次数统计, "wevtutil el  "           //列出日志名称 "wevtutil  gl  日志名称" //获取日志配置信息. 你可以使用短(如 ep /uni)或长(如enum-publishers /unicode)形式的命令和选项名称. 命令.选项和选项值不区分大小写. 变量均使用大写形式. wevtutil COMMAND [ARGUMENT [ARGUMENT] ...] [/OPTION:VALUE

log4net 既要按日期分割日志文件,又要按文件大小分割。

<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender"> <file value="log\debug\"/> <appendToFile value="true" /> <rollingStyle value="Composite" /> <datePatte