由于'LOG_BACKUP',数据库'test'的事务日志已满。 C Drive

时间:2018-02-20 12:24:36

标签: sql-server

我正在使用MSSQL存储数据。当我尝试删除表中的数据时,它显示错误

  

由于'LOG_BACKUP',数据库'test'的事务日志已满。

另外,我已经检查了C盘的大小,现在几乎已满,在执行此删除操作之前,可用空间为10GB。

当我搜索错误时,我发现备份事务日志将解决问题。我做了同样的事情,C驱动器仍然是满的。

我可以做些什么来解决这个问题?

3 个答案:

答案 0 :(得分:2)

您的数据库位于FULL恢复模式中。您的log已满,因为您不进行常规日志备份,这是唯一可以清除full恢复模式中的日志的内容。所以你现在需要的是log backup。 这将truncate您的日志。日志截断不会更改日志大小,但允许重用日志。

  

当我搜索错误时,我发现备份了该事务   日志将解决问题。我做了同样的事情,C驱动器仍然存在   满。

正如我所说,日志截断只允许记录被覆盖,它不会改变它的大小。

您的实际ldfmdf文件大小是多少?如果您的日志大于数据文件,则意味着您的备份策略错误,您需要shrink将日志文件设置为适当的大小。

您还需要计划regular log backups或评估simple恢复模式是否适合您。

答案 1 :(得分:1)

检查数据库恢复模型。它可能设置为FULL。您可以尝试更改为SIMPLE。

更多信息:

如果您不想更改恢复模式,请尝试小批量删除数据,例如:

DELETE TOP (1000) FROM table WHERE condition;
GO

编辑:

要立即压缩数据库,您可以使日志闪烁。如果将数据库恢复模型更改为SIMPLE,则会获得最佳结果。

USE [master];
GO

-- 1) Compacts all the databases in database server instance
EXEC sp_MSforeachdb 'DBCC SHRINKDATABASE (''?'' , 0, TRUNCATEONLY);DBCC SHRINKDATABASE (''?'' , 0);'
GO

-- 2) Compacts all the databases in database server instance that matches certain database name
DECLARE @SQL NVARCHAR(MAX) = '';
SELECT @SQL = @SQL + 'DBCC SHRINKDATABASE ('+ name +', 0, TRUNCATEONLY);DBCC SHRINKDATABASE ('+ name +', 0);'
    FROM sys.databases
    WHERE name LIKE '%database_name%'
    ORDER BY name ASC;
EXEC (@SQL);
GO

答案 2 :(得分:1)

谢谢大家,根据各位的意见,我缩小了事务日志文件,它释放了大约13GB。由于我的数据库的恢复模式已满,首先我已经备份了事务日志和然后将我的数据库的恢复模型更改为Simple.A之后,我缩小了我的日志文件并再次设置为Full。

 ALTER DATABASE AdventureWorks2012
    SET RECOVERY SIMPLE
    GO
    DBCC SHRINKFILE (AdventureWorks2012_log, 1)
    GO
    ALTER DATABASE AdventureWorks2012
    SET RECOVERY FULL

https://www.mssqltips.com/sqlservertutorial/3311/how-to-shrink-the-transaction-log/

感谢@sepupic,感谢您在帖子中提到的非常准确的方法。 在清理空间后,我根据@Pedro Martins的评论

小批量删除了记录