我正在支持一个antedeluvian的Web应用程序(即将停用(,它仍然使用"aspnetdb"作为其身份验证系统。 我正在为在我的测试环境中停用它做一些准备工作,当我发现我的测试服务器抱怨以下错误时:
数据库"aspnetdb"的事务日志由于"无"而已满。
现在,通常我会假设问题来自数据库事务日志......但是这个数据库最近切换到了简单恢复模式(这是一台测试计算机(。
我尝试了一些实验,但没有运气,并做了相当多的谷歌搜索。 以前有人见过这个错误吗? 处于简单恢复模式的数据库上的完整事务日志?
它在SQL Server 2016上,以2008兼容模式运行,因为aspnetdb很旧。
知道了,从堆栈交换获得帮助。
https://dba.stackexchange.com/questions/241172/transaction-log-is-full-due-to-nothing-but-this-database-is-in-simple-recov?noredirect=1#comment475763_241172
自动增长设置为 0。 遗憾的是,无法在 SSMS 中看到这一点,因为它隐藏了有关恢复模式简单数据库的此类设置。
查询以查看自动增长的真正价值,这要归功于@HandyD:
SELECT
db.name AS [Database],
mf.name AS [File],
CASE mf.[type_desc]
WHEN 'ROWS' THEN 'Data File'
WHEN 'LOG' THEN 'Log File'
END AS [FileType],
CAST(mf.[size] AS BIGINT)*8/1024 AS [SizeMB],
CASE
WHEN mf.[max_size] = -1 THEN 'Unlimited'
WHEN mf.[max_size] = 268435456 THEN 'Unlimited'
ELSE CAST(mf.[max_size]*8/1024 AS NVARCHAR(25)) + ' MB'
END AS [MaxSize],
CASE [is_percent_growth]
WHEN 0 THEN CONVERT(VARCHAR(6), CAST(mf.growth*8/1024 AS BIGINT)) + ' MB'
WHEN 1 THEN CONVERT(VARCHAR(6), CAST(mf.growth AS BIGINT)) + '%'
END AS [GrowthIncrement]
FROM sys.databases db
LEFT JOIN sys.master_files mf ON mf.database_id = db.database_id
where mf.name like 'aspnetdb%'
另一个问题是,在这种状态下,您无法更改自动增长。 但是您可以更改大小。 因此,通过增加大小,然后引入自动增长,您可以解决问题。
ALTER DATABASE aspnetdb MODIFY FILE (
NAME = aspnetdb_log
, SIZE = 1GB
) --this fixes the problem
GO
ALTER DATABASE aspnetdb MODIFY FILE (
NAME = aspnetdb_log
, SIZE = 1025MB
, MAXSIZE = UNLIMITED
, FILEGROWTH = 10MB
) -- now we have autogrowth
GO
USE aspnetdb
DBCC SHRINKFILE(aspnetdb_log,1) --now we can shrink the DB back to a sane minimum since autogrowth is in place
GO
即使在简单的恢复模式下,您仍然可以获取完整的事务日志。简单恢复模式仅意味着事务日志在每个完成的事务后被截断。
事务日志仍需要空间来容纳所有活动事务和正在回滚的所有事务。
因此,一个可能的原因是您的数据库上仍有打开的事务。如果发生这种情况,事务日志不会被截断。
另一个角度是实际的空间可用性。如果已将日志文件配置为最大文件大小,或者磁盘空间不足,则可能会遇到此问题。