请选择需要收缩的账套后再执行脚本!!!
请选择需要收缩的账套后再执行脚本!!!
请选择需要收缩的账套后再执行脚本!!!


-- 定义数据库名称参数,只需修改这里
DECLARE @DBName NVARCHAR(100) = DB_NAME();
DECLARE @SQL NVARCHAR(MAX);  -- 用于拼接动态SQL语句
DECLARE @LogName NVARCHAR(200);  -- 存储日志文件名称

--- 1. 查询数据库log名称
SELECT 
    name AS LogFileName, 
    physical_name AS LogFilePath
FROM sys.master_files
WHERE database_id = DB_ID(@DBName) AND type_desc = 'LOG';

--- 2. 设置为简单恢复模式(动态SQL执行)
SET @SQL = N'ALTER DATABASE ' + QUOTENAME(@DBName) + N' SET RECOVERY SIMPLE WITH NO_WAIT;';
EXEC sp_executesql @SQL;

SET @SQL = N'ALTER DATABASE ' + QUOTENAME(@DBName) + N' SET RECOVERY SIMPLE;';
EXEC sp_executesql @SQL;

--- 3. 清理日志文件
SELECT @LogName = name
FROM sys.master_files
WHERE database_id = DB_ID(@DBName) AND type_desc = 'LOG';

-- 拼接收缩日志的动态SQL(指定压缩后大小为1M)
SET @SQL = N'DBCC SHRINKFILE (''' + @LogName + N''', 1, TRUNCATEONLY);';
EXEC sp_executesql @SQL;

--- 4. 还原为完整恢复模式(动态SQL执行)
SET @SQL = N'ALTER DATABASE ' + QUOTENAME(@DBName) + N' SET RECOVERY FULL WITH NO_WAIT;';
EXEC sp_executesql @SQL;

SET @SQL = N'ALTER DATABASE ' + QUOTENAME(@DBName) + N' SET RECOVERY FULL;';
EXEC sp_executesql @SQL;

PRINT '数据库 [' + @DBName + '] 日志收缩完成!';

评论已关闭