我正在使用MSSQL存储数据。当我尝试删除表中的数据时,它显示错误
由于'LOG_BACKUP',数据库'test'的事务日志已满。
另外,我已经检查了C盘的大小,现在几乎已满,在执行此删除操作之前,可用空间为10GB。
当我搜索错误时,我发现备份事务日志将解决问题。我做了同样的事情,C驱动器仍然是满的。
我可以做些什么来解决这个问题?
答案 0 :(得分:2)
您的数据库位于FULL
恢复模式中。您的log
已满,因为您不进行常规日志备份,这是唯一可以清除full
恢复模式中的日志的内容。所以你现在需要的是log backup
。
这将truncate
您的日志。日志截断不会更改日志大小,但允许重用日志。
当我搜索错误时,我发现备份了该事务 日志将解决问题。我做了同样的事情,C驱动器仍然存在 满。
正如我所说,日志截断只允许记录被覆盖,它不会改变它的大小。
您的实际ldf
和mdf
文件大小是多少?如果您的日志大于数据文件,则意味着您的备份策略错误,您需要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的评论
小批量删除了记录