【发布时间】:2013-07-14 12:59:30
【问题描述】:
我有一个长时间运行的进程,该进程在整个持续时间内保持打开事务。
我无法控制它的执行方式。
由于事务在整个持续时间内保持打开状态,当事务日志填满时,SQL Server 无法增加日志文件的大小。
因此进程失败并出现错误"The transaction log for database 'xxx' is full"。
我试图通过增加数据库属性中事务日志文件的大小来防止这种情况发生,但我得到了同样的错误。
不知道接下来我应该尝试什么。该过程会运行几个小时,因此试错并不容易。
有什么想法吗?
如果有人有兴趣,该过程是Microsoft Dynamics CRM 4.0.中的组织导入
有足够的磁盘空间,我们有简单日志模式的日志,并在启动进程之前备份了日志。
-=-=-=-=- 更新 -=-=-=-=-
到目前为止,感谢所有 cmets。以下是让我相信日志不会因为打开的事务而增长的原因:
我收到以下错误...
Import Organization (Name=xxx, Id=560d04e7-98ed-e211-9759-0050569d6d39) failed with Exception:
System.Data.SqlClient.SqlException: The transaction log for database 'xxx' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases
所以按照这个建议,我去了“log_reuse_wait_desc column in sys.databases”,它的值是“ACTIVE_TRANSACTION”。
根据微软: http://msdn.microsoft.com/en-us/library/ms345414(v=sql.105).aspx
意思如下:
事务处于活动状态(所有恢复模式)。 • 日志备份开始时可能存在长时间运行的事务。在这种情况下,释放空间可能需要另一个日志备份。有关详细信息,请参阅本主题后面的“长时间运行的活动事务”。
• 事务被延迟(仅限 SQL Server 2005 企业版和更高版本)。延迟事务实际上是一个活动事务,其回滚由于某些不可用资源而被阻止。有关延迟事务的原因以及如何将它们移出延迟状态的信息,请参阅延迟事务。
我是不是误会了什么?
-=-=-=- 更新 2 -=-=-=-
刚刚启动进程,初始日志文件大小设置为 30GB。这需要几个小时才能完成。
-=-=-=- 最终更新 -=-=-=-
这个问题实际上是由日志文件消耗了所有可用磁盘空间引起的。在最后一次尝试中,我释放了 120GB,但它仍然使用了所有空间,最终失败了。
我之前没有意识到这会发生,因为当进程在一夜之间运行时,它会在失败时回滚。这次我能够在回滚之前检查日志文件的大小。
感谢大家的意见。
【问题讨论】:
-
re "...并且已经备份了日志"....如果数据库处于简单模式,您将无法备份日志,日志备份不适用于简单模式。它是批量记录的吗?
-
我备份了整个数据库并将其缩小,导致日志缩小到 1MB。然后,我最初将日志文件的大小增加到 20GB,现在增加到 30GB。
标签: sql sql-server sql-server-2008 dynamics-crm