MSSQL 清理日志

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
--清理所有数据库
IF NOT EXISTS (SELECT *
FROM dbo.sysobjects
WHERE id = object_id(N'DatabaseLogSize') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
    BEGIN
CREATE TABLE [DatabaseLogSize]
(
[dbname] [nvarchar](100) NULL,
[dbid] [int] NULL,
[log_logical_name] [nvarchar](100) NULL,
[logsize] [decimal](30, 2) NULL,
[logused] [decimal](30, 2) NULL,
[status] [int] NULL
) ON [PRIMARY]
END
    ELSE
    BEGIN
DELETE FROM [DatabaseLogSize]
END
    GO

--借助dbcc sqlperf(logspace)将数据插入上面新建的表
INSERT INTO [DatabaseLogSize]
([dbname],[logsize],[logused],[status])
EXECUTE('dbcc sqlperf(logspace)')
GO

UPDATE [DatabaseLogSize]
SET
[dbid]=T_DB_ID.[dbid]
FROM [DatabaseLogSize]
INNER JOIN
(
SELECT [dbid], [name]
FROM master..sysdatabases
) AS T_DB_ID
ON [DatabaseLogSize].[dbname]=T_DB_ID.[name]
GO

UPDATE [DatabaseLogSize]
SET [log_logical_name]=T_DB_LOGNAME.[name]
FROM [DatabaseLogSize]
INNER JOIN
(
SELECT [name], database_id
FROM sys.master_files
WHERE type = 1
) AS T_DB_LOGNAME
ON [DatabaseLogSize].[dbid]=T_DB_LOGNAME.database_id
GO

CREATE TABLE #LogNeedShrink
(
[dbname] NVARCHAR(100)
,
[log_logical_name] NVARCHAR(100)
)
GO

INSERT INTO #LogNeedShrink
SELECT [dbname], [log_logical_name]
FROM [DatabaseLogSize]
WHERE [logsize]>50
--收缩超过50MB大小的日志文件
GO

WHILE (SELECT COUNT(1)
FROM #LogNeedShrink)>0
BEGIN
DECLARE @CurrentDbName NVARCHAR(100)
DECLARE @CurrentlogName NVARCHAR(100)
SELECT TOP 1
@CurrentDbName=[dbname], @CurrentlogName=[log_logical_name]
FROM #LogNeedShrink
DECLARE @ShrinkScript NVARCHAR(1000);
SET @ShrinkScript=N'
USE[master] '+N'
ALTER DATABASE '+QUOTENAME(@CurrentDbName,N'[')+' SET RECOVERY SIMPLE WITH NO_WAIT '+N'
ALTER DATABASE '+QUOTENAME(@CurrentDbName,N'[')+' SET RECOVERY SIMPLE '+N'
USE '+QUOTENAME(@CurrentDbName,N'[')+' '+N'
DBCC SHRINKFILE (N'''+@CurrentlogName+N''' , 2, TRUNCATEONLY)'+N'
USE[master] '+N'
ALTER DATABASE '+QUOTENAME(@CurrentDbName,N'[')+' SET RECOVERY FULL WITH NO_WAIT '+N'
ALTER DATABASE '+QUOTENAME(@CurrentDbName,N'[')+' SET RECOVERY FULL '
    print(@ShrinkScript)
EXEC sp_sqlexec @ShrinkScript
DELETE FROM #LogNeedShrink WHERE [dbname]=@CurrentDbName AND [log_logical_name]=@CurrentlogName
END
GO

DROP TABLE #LogNeedShrink
GO
​

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值