SQL SERVER 日志文件过大导致磁盘空间不足产生错误:事务日志已满,起因为"LOG_BACKUP"。

转自:https://www.cnblogs.com/haibing0107/p/10836045.html

https://bbs.51cto.com/thread-1023360-1.html

根本的解决办法应该是根据日志增长速度分配好足够的磁盘空间,或者通过检查修改控制一下日志的增长速度。

比较紧急处理且对日志保留不进行要求的话,可以按如下操作直接主动缩小日志文件体积:

USE [master]
GO
ALTER DATABASE 要清理的数据库名称 SET RECOVERY SIMPLE WITH NO_WAIT
GO
ALTER DATABASE 要清理的数据库名称 SET RECOVERY SIMPLE   --简单模式
GO
USE 要清理的数据库名称
GO
DBCC SHRINKFILE (N'要清理的数据库名称_log' , 2, TRUNCATEONLY)  --设置压缩后的日志大小为2M,可以自行指定
GO
USE [master]
GO
ALTER DATABASE 要清理的数据库名称 SET RECOVERY FULL WITH NO_WAIT
GO
ALTER DATABASE 要清理的数据库名称 SET RECOVERY FULL  --还原为完全模式
GO

可以少修改脚本的版本:

-- 请将以下 dbxxx 改为数据库名称
DECLARE @DatabaseName NVARCHAR(255) = 'dbxxx';

USE [master]

-- 设置数据库为简单恢复模式
EXEC('ALTER DATABASE ' + @DatabaseName + ' SET RECOVERY SIMPLE WITH NO_WAIT');
EXEC('ALTER DATABASE ' + @DatabaseName + ' SET RECOVERY SIMPLE'); 

-- 获取目标数据库的日志文件名称
DECLARE @SQL NVARCHAR(MAX)
DECLARE @LogFileName NVARCHAR(255)
SET @SQL = N'
    SELECT @LogFileName = name FROM sys.master_files
    WHERE database_id = DB_ID(@DatabaseName)
    AND type_desc = ''LOG''
';
-- 执行动态 SQL,并传递数据库名称变量,传出日志文件名称
EXEC sp_executesql @SQL, N'@DatabaseName NVARCHAR(255), @LogFileName NVARCHAR(255) OUTPUT', @DatabaseName, @LogFileName OUTPUT;

-- 检查是否找到了日志文件
IF @LogFileName IS NOT NULL
BEGIN
    -- 执行日志收缩操作
    EXEC('USE ' + @DatabaseName + '; DBCC SHRINKFILE (N''' + @LogFileName + ''', 2, TRUNCATEONLY);');
    PRINT '日志文件收缩成功: ' + @LogFileName;
END
ELSE
BEGIN
    PRINT '未找到日志文件,无法执行收缩操作';
END

USE [master]
GO
posted @ 2020-09-22 13:56  不是豆豆  阅读(1707)  评论(0)    收藏  举报
友情链接:迷途