分享

错误"数据库的事务日志已满。若要查明无法重用日志中的空间的原因"的解决方法

 庋藏天下 2015-10-26

数据库的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅sys.databases中的log_reuse_wait_desc列

到服务器上查看后发现,是因为数据库日志所在的磁盘空间满了,移出该盘部分文件后,系统就恢复正常了。又在网上查了一下该错误,如果要从日志文件本身来解决,可用以下两种方法解决:
一,清空日志:
步骤:1,备份日志文件。2,压缩日志文件。
1,备份日志文件,可使用如下sql命令:
DUMP TRANSACTION 数据库名 WITH NO_LOG
2,打开企业管理器,在数据库上点右键->属性->选项->故障恢复-模型-选择-简单模型。(也可以直接在查询分析器里执行:
alter database 数据库名 set recovery simple
3.右键点击要压缩的数据库-->所有任务-->收缩数据库-->收缩文件-->选择日志文件-->在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个一个合适的数,确定就可以了。

二,删除Log文件:
这种方法有一定的风险性,因为SQL SERVER的日志文件不是即时写入数据库主文件的,如处理不当,会造成数据的损失。
步骤:分离数据库 企业管理器-->服务器-->数据库-->右键-->分离数据库。
然后删除LOG文件,再附加数据库:
附加数据库 企业管理器-->服务器-->数据库-->右键-->附加数据库。
此法生成新的LOG,大小只有500多K。

若不想日志文件无限制的增长以至于太大,可以为日志文件设置一个最大值,方法如下:
企业管理器-->服务器-->右键数据库-->属性-->事务日志-->将文件增长限制为xM(x是你允许的最大数据文件大小)

使用SQL语句设置如下:
alter database 库名 modify file(name=逻辑文件名,maxsize=20)
附带上sys.databases表中的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 事务处于活动状态(所有恢复模式)。

·在日志备份开始时,可能存在长时间运行的事务。 在这种情况下,释放空间可能需要进行其他日志备份。 有关详细信息,请参阅本主题后面的“长时间运行的活动事务”部分。
·事务将延迟(仅适用于 SQL Server 2005 Enterprise Edition 及更高版本)。 “延迟的事务”实际上是其回滚由于某些资源不可用而受阻的活动事务。 有关导致事务延迟的原因以及如何使它们摆脱被延迟状态的信息,请参阅延迟的事务.
 
5 DATABASE_MIRRORING 数据库镜像暂停,或者在高性能模式下,镜像数据库明显滞后于主体数据库(仅限于完整恢复模式)。
有关详细信息,请参阅本主题后面的“数据库镜像与事务日志”部分。
6 REPLICATION 在事务复制过程中,与发布相关的事务仍未传递到分发数据库(仅限于完整恢复模式)。
有关详细信息,请参阅本主题后面的“事务复制与事务日志”部分。
7 DATABASE_SNAPSHOT_CREATION 正在创建数据库快照(所有恢复模式)。
这是日志截断延迟的常见原因,通常也是主要原因。
8 LOG_SCAN 正在进行日志扫描(所有恢复模式)。
这是日志截断延迟的常见原因,通常也是主要原因。
9 OTHER_TRANSIENT 此值当前未使用。


本文来自:.Net学习网 http://www./ac/ID983
======================================================
清除日志啦
USE [master]
GO
ALTER DATABASE [exam] SET RECOVERY SIMPLE WITH NO_WAIT
GO
ALTER DATABASE [exam] SET RECOVERY SIMPLE --简单模式
GO
USE [exam]
GO
DBCC SHRINKFILE (N' 日志文件名' , 1, TRUNCATEONLY) --日志文件名要完整路径
GO
USE [master]
GO
ALTER DATABASE [exam] SET RECOVERY FULL WITH NO_WAIT
GO
ALTER DATABASE [exam] SET RECOVERY FULL --还原为完全模式
GO

=======================================================

数据库 'dbname' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 lo

(2012-03-12 14:03:40)
 
数据库 'dbname' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列.

先在MSSQL查询分析器里执行一下下面的命令,如果无法解决问题再继续往下看.

backup   log   dbname   with   no_log  --dbname要清除事物日志的数据库名
go

dbcc   shrinkdatabase(dbname)
go


以下是从微软网站复制过来的文章,有耐心的朋友仔细看看,应该可以解决问题!

本主题讨论对已满事务日志可以采取的几种应对措施,并就以后如何避免出现已满事务日志给出建议。如果事务日志已满,则 SQL Server 数据库引擎会发出 9002 错误。当数据库在线或恢复时,日志可能会满。如果数据库在线时日志已满,则数据库保持在线状态,但是只能进行读取而不能更新。如果恢复过程中日志已满,则数据库引擎将数据库标记为 RESOURCE PENDING。不管哪种情况,都需要用户执行操作才能使日志空间可用。

应对已满事务日志

正确响应已满事务日志在某种程度上取决于导致日志已满的情况。若要在给定情况下查找阻止日志截断的原因,请使用 sys.database 目录视图的 log_reuse_wait 列和 log_reuse_wait_desc 列。有关详细信息,请参阅 sys.databases (Transact-SQL)。有关延迟日志截断的因素的说明,请参阅导致日志截断延迟的因素

重要提示:
如果数据库在恢复过程中出现 9002 错误,则在解决此问题后,可使用 ALTER DATABASE database_name SET ONLINE 恢复数据库。

 

 

响应已满事务日志的备选方法包括:

  • 备份日志。
  • 释放磁盘空间以便日志可以自动增长。
  • 将日志文件移到具有足够空间的磁盘驱动器。
  • 增加日志文件的大小。
  • 在其他磁盘上添加日志文件。
  • 完成或取消长时间运行的事务。

下列部分介绍了这些备选方法。请选择最适用于您情况的响应。

注意:
强行截断日志会破坏日志链,并在下次完整备份数据库之前使数据库处于容易受到攻击的状态。因此,未来版本的 SQL Server 将从 BACKUP 语句中删除 TRUNCATE_ONLY 选项。应避免使用此选项进行新的开发工作,并计划修改当前使用它的应用程序。

 

 

备份日志

在完整恢复模式或大容量日志恢复模式下,如果最近尚未备份事务日志,则请立即进行备份以免发生日志截断。如果从未备份日志,则必须创建两个日志备份,以允许数据库引擎将日志截断到上次的备份点。截断日志可释放空间以供新的日志记录使用。若要防止日志再次填满,请经常执行日志备份。

创建事务日志备份

重要提示:
如果数据库被损坏,请参阅尾日志备份

 

 

释放磁盘空间

您可以通过删除或移动其他文件的方法来释放包含数据库事务日志文件的磁盘驱动器上的磁盘空间。释放磁盘空间后,恢复系统将自动扩大日志文件。

将日志文件移至其他磁盘

如果在当前包含日志文件的驱动器上无法释放足够的磁盘空间,请考虑将该文件移至空间充足的其他驱动器上。

重要提示:
日志文件决不要放在压缩文件系统中。

 

 

移动日志文件

增加日志文件的大小

如果日志磁盘上具有可用空间,则可以增加日志文件的大小。

增加文件大小

如果禁用自动增长,数据库处于在线状态,并且磁盘上有足够的可用空间,则可采用以下方法之一:

  • 手动增加文件大小以生成单个增量。
  • 使用 ALTER DATABASE 语句启用自动增长以针对 FILEGROWTH 选项设置非零增量。
注意:
不管哪种情况,如果已达到当前大小限制,则应增加 MAXSIZE 值。

 

 

在其他磁盘上添加日志文件

使用 ALTER DATABASE <database_name> ADD LOG FILE,向具有足够空间的其他磁盘上的数据库中添加新日志文件。

添加日志文件

标识和管理长时间运行的事务

有关详细信息,请参阅管理长时间运行的事务
=====================================================================
SQLServer中事务日志已满的原因以及解决办法
2014-12-22      0 个评论    来源:邵鸿鑫 廊坊师范学院信息技术提高班第十期  
收藏    我要投稿

错误描述:数据库的事务日志已满。若要查明无法重用日志中的空间的原因 ,请参阅sys.databases 中的 log_reuse_wait_desc 列 。

首先引入一下事务日志的概念(来自百度百科):

事务日志是一个与数据库文件分开的文件。它存储对数据库进行的所有更改,并全部记录插入、更新、删除、提交、回退和数据库模式变化。事务日志还称作前滚日志或重做日志。

事务日志是备份和恢复的重要组件,也是使用 SQL Remote 或 [复制代理] 复制数据所必需的。

在缺省情况下,所有数据库都使用事务日志。事务日志的使用是可选的,但是,除非您因特殊原因而不使用,否则您应始终使用它。运行带有事务日志的数据库可提供更强的故障保护功能、更好的性能以及数据复制功能。

引发异常的原因:

a.未提交的事务

b.非常大的事务

c.操作:DBCC DBREINDEX 和 CREATE INDEX

d.在从事务日志备份还原时

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

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

g.未复制的事务

解决办法:

1.释放磁盘空间(菜鸟适用);

2.把数据库移到内存充足的磁盘(原理同上);

3.清空日志:DUMP TRANSACTION 库名 WITH NO_LOG;

4.截断事务日志:BACKUP LOG 库名 WITH NO_LOG;

遇到问题才是我们进步的机会,这些都是从网上搜索的一些解决办法,希望可以帮助到您!


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多