[转]SQLServer2008日志文件无法收缩处理方法

问题描述
    发现有的数据库日志文件太大,无论如何收缩执行几次SQL语句都不行。事务日志达30+G,而且使用常规的截断、收缩方法均无法减小日志物理文件的尺寸,经过一番寻找,终于找到了解决方法。

查看日志信息  
    在查询分析器中执行如下代码来查看日志信息:      DBCC LOGINFO(‘数据库名称‘)  
    我们看到status=0的日志,代表已经备份到磁盘的日志文件;而status=2的日志还没有备份。当我们收缩日志文件时,收缩掉的空间其实就是status=0的空间,如果日志物理文件无法减小,这里一定能看到非常多status=2的记录。接下来分析为什么会有这么多status=2的记录

查看日志截断延迟原因  
    活跃(active)的日志无法通过收缩来截断,有各种原因会使日志截断延迟,具体表现就是事务日志的物理文件无法通过截断、收缩来减小,通过下面的代码可以看到实例上每个数据库的日志截断延迟原因:

USE master
go

SELECT name, database_id, log_reuse_wait, log_reuse_wait_desc
FROM sys.databases
go

各种原因及解释如下: log_reuse_wait_desc 值说明  
NOTHING 
    当前有一个或多个可重复使用的虚拟日志文件。 
   
CHECKPOINT 
    自上次日志截断之后,尚未出现检查点,或者日志头部尚未跨一个虚拟日志文件移动(所有恢复模式)。 
    这是日志截断延迟的常见原因。有关详细信息,请参阅检查点和日志的活动部分。

LOG_BACKUP 
    需要日志备份,以将日志的头部前移(仅适用于完整恢复模式或大容量日志恢复模式)。 
    注意:日志备份不会妨碍截断。 完成日志备份后,日志的头部将前移,一些日志空间可能变为可重复使用。

ACTIVE_BACKUP_OR_RESTORE 
    数据备份或还原正在进行(所有恢复模式)。 
    数据备份与活动事务的运行方式相同。数据备份在运行时,将阻止截断。

ACTIVE_TRANSACTION 
    事务处于活动状态(所有恢复模式)。 一个长时间运行的事务可能存在于日志备份的开头。在这种情况下,可能需要进行另一个日志备份才能释放空间。有关详细信息,请参阅本主题后面的“长时间运行的活动事务”部分。 
    事务被延迟(仅适用于 SQL Server 2005 Enterprise Edition 及更高版本)。“延迟的事务 ”是有效的活动事务,因为某些资源不可用,其回滚受阻。有关导致事务延迟的原因以及如何使它们摆脱延迟状态的信息,请参阅延迟的事务。  
   
DATABASE_MIRRORING 
    数据库镜像暂停,或者在高性能模式下,镜像数据库明显滞后于主体数据库(仅限于完整恢复模式)。

REPLICATION 
    在事务复制过程中,与发布相关的事务仍未传递到分发数据库(仅限于完整恢复模式)。 有关详细信息,请参阅本主题后面的“事务复制与事务日志”部分。 
   
DATABASE_SNAPSHOT_CREATION 
    正在创建数据库快照(所有恢复模式)。 这是日志截断延迟的常见原因,通常也是主要原因。 
   
LOG_SCAN 
    正在进行日志扫描(所有恢复模式)。 这是日志截断延迟的常见原因,通常也是主要原因。

针对延迟日志截断原因的部分解决方案 
LOG_BACKUP  
    备份日志后再执行收缩即可backup log [database] with nolog 
   
REPLICATION 
    这种情况我遇到过两次,但我根本没有启用过REPLICATION,据查,这好像是SQLSERVER2008的一个BUG,解决方法是给标有“REPLICATION”的数据库任意一个表创建数据库事务复制(TRANSACTION REPLICATION),然后再删除,执行数据库与日志备份后,就可以收缩了。

附,sqlserver收缩日志:

http://www.cnblogs.com/zhaoguan_wang/p/4949176.html

时间: 2024-10-12 09:29:21

[转]SQLServer2008日志文件无法收缩处理方法的相关文章

SQL Server日志文件庞大收缩方法(实测好用)

原文:SQL Server日志文件庞大收缩方法(实测好用) 这两个命令连续执行,间隔时间越少越明显(可多次运行),直到达到效果 --截断 BACKUP LOG CloudMonitor TO DISK='NUL' --收缩 DBCC SHRINKFILE('CloudMonitor_log') 以后就可以采用常规的定期备份日志(比如一小时一次)来防止日志文件无限增长. SQL Server日志文件庞大收缩并非易事, 文章中提到: 由于首日志.尾日志和空间重复利用的原因,当备份日志后产生了日志截断

sqlserver日志文件太大解决方法

SQL Server 的事务日志意外增大或充满的处理方法 事务日志文件Transaction Log File是用来记录数据库更新情况的文件,扩展名为ldf. 在 SQL Server 7.0 和 SQL Server 2000 中,如果设置了自动增长功能,事务日志文件将会自动扩展. 一般情况下,在能够容纳两次事务日志截断之间发生的最大数量的事务时,事务日志的大小是稳定的,事务日志截断由检查点或者事务日志备份触发. 然而,在某些情况下,事务日志可能会变得非常大,以致用尽空间或变满.通常,在事务日

SQL SERVER2008 数据库日志文件的收缩方法

最近公司的数据库随着业务量的增多,日志文件巨大(超过300G),造成磁盘空间不够用,进而后来的访问数据库请求无法访问. 网上类似的方法也很多,但不可行,如下是我实践过,可行的,将日志文件收缩至任意指定大小的方法: 第一步: 在SQL SERVER Management Studio 中右击数据库选择"属性"--->"选项",将恢复模式由默认的"完整"改为"简单". 第二步:再次右键选择数据库的"任务"

Apache access.log error.log日志文件太大优化方法

有没有发现Apache生成的日志文件一天比一天大,不是一般大,若你apache安装在C盘,那可惨了,不几天硬盘就满了,太恐怖了,有没有办法优化一下日志,让它不那么大?答案是有的. 一.停止Apache服务,删除Apache下/logs/目录中的error.log和access.log文件. 二.打开Apache的conf/httpd.conf配置文件,找到以下配置信息: ErrorLog logs/error.log CustomLog logs/access.log common 请在上述两行

对日志文件进行收缩

第一步: alter database dbName set recovery simple; 第二步: dbcc shrinkfile('dbName_log'); 第三步: alter database dbName set recovery full; ------------------------------------------------------------------------------------------------------------------------

Logstash处理json格式日志文件的三种方法

假设日志文件中的每一行记录格式为json的,如: {"Method":"JSAPI.JSTicket","Message":"JSTicket:kgt8ON7yVITDhtdwci0qeZg4L-Dj1O5WF42Nog47n_0aGF4WPJDIF2UA9MeS8GzLe6MPjyp2WlzvsL0nlvkohw","CreateTime":"2015/10/13 9:39:59",&

sqlserver2008 日志文件压缩的完整解决办法

在项目中数据库创建了一个本地发布和订阅,造成日志文件飞涨,想把日志文件缩小. 1:最初使用了最常用的方法: USE [master] GO ALTER DATABASE 库名 SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE 库名 SET RECOVERY SIMPLE --简单模式 GO USE 库名 GO DBCC SHRINKFILE (N'库名_log' , 11, TRUNCATEONLY) GO --这里的DNName_Log 如果

数据库日志文件的收缩

SqlServer 2008 R2 就不发网上那些眼花缭乱的代码了.. 说一个本人经过测试可行的 首先运行代码 --先设定为简单模式 ALTER DATABASE [数据库名称] SET RECOVERY SIMPLE 因为文件的收缩只有在简单模式下才可以使用.. 不进入简单模式..文件的收缩操作无效的. 然后 数据库 -->  右键  --> 任务 --> 收缩 --> 文件 --> 打开一下页面 写这个文章的时候已经操作过了..这个数据库原来的日志文件将近  20个G..

MS Sql Server 数据库或表修复(Log日志文件损坏的修复方法)

----------------- [1] use master go sp_configure 'allow updates',1 reconfigure with override go ----------------- [2] update sysdatabases set status=-32768 where dbid=DB_ID('zc_post') ----------------- [3] dbcc rebuild_log('zc_post','d:\zc_post_log.l