【问题标题】:Sql server - log is full due to ACTIVE_TRANSACTION [duplicate]Sql server - 由于 ACTIVE_TRANSACTION [重复],日志已满
【发布时间】:2014-07-12 07:29:47
【问题描述】:

我有一个非常大的数据库(50+ GB)。为了释放硬盘空间,我尝试从其中一张表中删除旧记录。我运行了命令:

delete from Table1 where TheDate<'2004-01-01';

但是,SQL Server 2012 说:

Msg 9002, Level 17, State 4, Line 1 
The transaction log for database 'MyDb' is full due to 'ACTIVE_TRANSACTION'.

它并没有删除任何东西。那条消息是什么意思?如何删除记录?

【问题讨论】:

  • 小 ;) 不是很大。只要它适合中端服务器的内存,绝对不会变化很大。

标签: sql sql-server sql-server-2012


【解决方案1】:

这是我最终解决该错误的方法。

首先,我将数据库恢复模型设置为 SIMPLE。更多信息here.

然后,通过删除一些旧文件,我可以腾出 5GB 的可用空间,从而使日志文件有更多空间来增长。

我成功地重新运行了 DELETE 语句,没有任何警告。

我认为通过运行 DELETE 语句,数据库会立即变小,从而释放我的硬盘空间。但事实并非如此。除非您运行以下命令,否则 DELETE 语句后释放的空间不会立即返回给操作系统:

DBCC SHRINKDATABASE (MyDb, 0);
GO

有关该命令的更多信息here

【讨论】:

  • 在我的情况下,重新启动 SQL Server 和缩小数据库都不起作用。数据库是从备份中恢复的,我认为备份本身有问题。我最终分离了数据库,删除了 LDF 文件,附加它删除了预期的 LDF 文件行并让 SQL Server 创建一个新的日志文件。这样就修好了。
【解决方案2】:

重新启动 SQL Server 将清除数据库使用的日志空间。 但是,如果这不是一个选项,您可以尝试以下方法:

* Issue a CHECKPOINT command to free up log space in the log file.

* Check the available log space with DBCC SQLPERF('logspace'). If only a small 
  percentage of your log file is actually been used, you can try a DBCC SHRINKFILE 
  command. This can however possibly introduce corruption in your database. 

* If you have another drive with space available you can try to add a file there in 
  order to get enough space to attempt to resolve the issue.

希望这将帮助您找到解决方案。

【讨论】:

  • DBCC SQLPERF('logspace') 将显示“日志大小 (MB)”和“已用日志空间 (%)”。请记住,日志大小并不表示写入日志的实际大小,而是表示磁盘上日志文件的大小。因此,要获得以 MB 为单位的日志的真实大小,请将两列相乘。例如,2.00MB 的日志大小和 70% 已使用意味着您有 1.4MB 的日志数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
相关资源
最近更新 更多