【转】SQL SERVER日志满或过大的处理方法

原文转自:http://blog.chinaunix.net/uid-7953959-id-2543262.html

事务日志文件Transaction Log File是用来记录数据库更新情况的文件,扩展名为ldf。

在 SQL Server 7.0 和 SQL Server 2000 中,如果设置了自动增长功能,事务日志文件将会自动扩展。

一般情况下,在能够容纳两次事务日志截断之间发生的最大数量的事务时,事务日志的大小是稳定的,事务日志截断由检查点或者事务日志备份触发。然而,在某些情况下,事务日志可能会变得非常大,以致用尽空间或变满。通常,在事务日志文件占尽可用磁盘空间且不能再扩展时,您将收到如下错误消息:

Error:9002, Severity:17, State:2

The log file for database ‘%.*ls‘ is full.

除了出现此错误消息之外,SQL Server 还可能因为缺少事务日志扩展空间而将数据库标记为 SUSPECT。有关如何从此情形中恢复的其他信息,请参见 SQL Server 联机帮助中的“磁盘空间不足”主题。

另外,事务日志扩展可能导致下列情形:

· 非常大的事务日志文件。

· 事务可能会失败并可能开始回滚。

· 事务可能会用很长时间才能完成。

· 可能发生性能问题。

· 可能发生阻塞现象。

原因

事务日志扩展可能由于以下原因或情形而发生:

· 未提交的事务

· 非常大的事务

· 操作:DBCC DBREINDEX 和 CREATE INDEX

· 在从事务日志备份还原时

· 客户端应用程序不处理所有结果

· 查询在事务日志完成扩展之前超时,您收到假的“Log Full”错误消息

· 未复制的事务

解决方法

日志文件满而造成SQL数据库无法写入文件时,可用两种方法:

一种方法:清空日志。

1.打开查询分析器,输入命令

DUMP TRANSACTION 数据库名 WITH NO_LOG

2.再打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了。

另一种方法有一定的风险性,因为SQL SERVER的日志文件不是即时写入数据库主文件的,如处理不当,会造成数据的损失。

1: 删除LOG

分离数据库 企业管理器->服务器->数据库->右键->分离数据库

2:删除LOG文件

附加数据库 企业管理器->服务器->数据库->右键->附加数据库

此法生成新的LOG,大小只有500多K。

注意:建议使用第一种方法。

如果以后,不想要它变大。

SQL2000下使用:

在数据库上点右键->属性->选项->故障恢复-模型-选择-简单模型。

或用SQL语句:

alter database 数据库名 set recovery simple

不过这种方式要小心,在恢复时只能恢复到最后一次完整备份

另外,数据库属性有两个选项,与事务日志的增长有关:

Truncate log on checkpoint

(此选项用于SQL7.0,SQL 2000中即故障恢复模型选择为简单模型)

当执行CHECKPOINT 命令时如果事务日志文件超过其大小的70% 则将其内容清除在开发数据库时时常将此选项设置为True

Auto shrink

定期对数据库进行检查当数据库文件或日志文件的未用空间超过其大小的25%时,系统将会自动缩减文件使其未用空间等于25% 当文件大小没有超过其建立时的初始大小时不会缩减文件缩减后的文件也必须大于或等于其初始大小对事务日志文件的缩减只有在对其作备份时或将Truncate log on checkpoint 选项设为True 时才能进行。

注意:一般立成建立的数据库默认属性已设好,但碰到意外情况使数据库属性被更改,请用户清空日志后,检查数据库的以上属性,以防事务日志再次充满。

时间: 2024-08-05 19:45:07

【转】SQL SERVER日志满或过大的处理方法的相关文章

(转) SQL Server中 ldf 文件过大的解决方法

原文地址:http://blog.itpub.net/35489/viewspace-616459/ 在SQL Server中经常遇到事务日志变大的情况,除了将数据库设置为“自动收缩”外,还可以使用下面的SQL命令进行快速清除数据库中的事务日志,命令如下:  - 第一步:清空日志  DUMP TRANSACTION   databasename   WITH   NO_LOG  -- 第二步:截断事务日志  BACKUP LOG   databasename   WITH   NO_LOG  -

SQL SERVER LDF日志文件太大的解决方法

如何压缩日志及数据库文件大小 /*--特别注意 请按步骤进行,未进行前面的步骤,请不要做后面的步骤 否则可能损坏你的数据库. 一般不建议做第4,6两步 第4步不安全,有可能损坏数据库或丢失数据 第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复. --*/ --下面的所有库名都指你要处理的数据库的库名 1.清空日志 DUMP     TRANSACTION     库名     WITH     NO_LOG 2.截断事务日志: BACKUP   LOG   库名   WIT

如何处理SQL Server事务复制中的大事务操作

如何处理SQL Server事务复制中的大事务操作 事务复制的工作机制 事务复制是由 SQL Server 快照代理.日志读取器代理和分发代理实现的.快照代理准备快照文件(其中包含了已发布表和数据库对象的架构和数据),然后将这些文件存储在快照文件夹中,并在分发服务器中的分发数据库中记录同步作业. 日志读取器代理监视为事务复制配置的每个数据库的事务日志,并将标记为要复制的事务从事务日志复制到分发数据库中,分发数据库的作用相当于一个可靠的存储-转发队列. 分发代理将快照文件夹中的初始快照文件和分发数

XenDesktop 5 SQL Server Mirror事务日志比较大的原因分析

在实施XenDesktop5项目过程中,发现XenDesktop5版本的数据库镜像事务日志很大,在XenDesktop4和XenApp版本中不存在该问题:于是我根据该现象探究XenDesktop5及以上版本镜像数据库事务日志为何如此之大以及我们今后实施的过程中该如何来维护这么庞大的数据库事务日志. 在XenDesktop解决方案中,对数据的处理是由专门的数据库来进行数据存储处理的,而对于数据库的高可用,有3种方式: SQL Mirror Virtual Machine HA(VMware FT)

SQL Server 2005 日志文件过大处理

由于安装的时候没有计划好空间,默认装在系统盘,而且又没有做自动备份.截断事务日志等,很快LDF文件就达到十几G,或者几十G ,此时就不得不处理了. 备份和计划就不说了,现在就说下怎么把它先删除吧: 1:先分离数据库 2:为了保险,先不要删除,把LDF文件重命名下 3:附件数据库. 4:OK. 以上可能遇到的问题: 1:有用户连接,无法分离(勾选“断开所有连接”) 2:附件数数据库的时候提示找不到LDF文件,不要慌,在附件的时候,把LDF的路径一项删除,然后点击"确定",这样就附件成功了

SQL Server 中关于EXCEPT和INTERSECT的使用方法

熟练使用SQL Server中的各种使用方法会给查询带来非常多方便.今天就介绍一下EXCEPT和INTERSECT.注意此语法仅在SQL Server 2005及以上版本号支持. EXCEPT是指在第一个集合中存在,可是不存在于第二个集合中的数据. INTERSECT是指在两个集合中都存在的数据. 測试例如以下: create table t1(id int,mark char(2)) go create table t2(id int,mark char(2)) go insert into

java连接sql server 2008的问题(jdbc驱动的方法)

这是程序代码,我是按照网上和视频讲解的步骤写的代码:import java.sql.*;public class jdbc {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubConnection ct = null;PreparedStatement ps = null;ResultSet rs = null;try {//第一步,加载驱动Class.forNa

SQL Server 2008 R2 里迁移系统数据库的方法

针对不同的场景,采用不同的步骤. 对非master以及resource系统数据库而言,分两种情况. 1.非master以及resource系统数据库正常. 这里以迁移msdb为例,将msdb从D:\SQL2K8_DATA\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\迁移到D:\SQL2K8_DATA\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\system\目录下. 首先我们检查当前msdb的路径 ? 1 2 3 SELECT name, phys

SQL Server、Oracle和MySQL判断NULL的方法

SQL Server.Oracle和MySQL判断NULL的方法 本文讲述SQL Server.Oracle.MySQL查出值为NULL的替换. 在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1.MSSQL: ISNULL() 语法 Java代码 复制代码代码如下: ISNULL ( check_expression , replacement_value ) ISNULL ( check_expression , replacement_value )