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 @   不是豆豆  阅读(1641)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
友情链接:迷途


点击右上角即可分享
微信分享提示