我们有一些测试数据库,我们正在将测试索引投入,并且由于我们删除了表的内容并重新填充它,因此日志文件很快变得臃肿。
由于Stack Overflow,我发现了一些脚本并将它们组合在一起以完成我需要的工作。
这是脚本:
USE SSSIndexes
GO
ALTER DATABASE SSSIndexes SET RECOVERY SIMPLE WITH NO_WAIT
GO
DBCC SHRINKFILE(N'SSSIndexes_Log', 1) <-- my issue is here
GO
问题是日志文件名。有没有办法获取日志文件名而无需手动查找并将其包含在脚本中以自动执行此部分?
顺便说一下,我们从不打算恢复这个数据库。这些是临时索引。
谢谢!
答案 0 :(得分:7)
USE SSSIndexes
GO
ALTER DATABASE SSSIndexes SET RECOVERY SIMPLE WITH NO_WAIT
GO
DECLARE @Name NVARCHAR(50)
DECLARE cur CURSOR FOR
SELECT [name]
FROM [sys].[database_files]
where [type] = 1
OPEN cur
FETCH NEXT FROM cur INTO @Name
WHILE @@FETCH_STATUS = 0
BEGIN
DBCC SHRINKFILE(@Name, 1)
FETCH NEXT FROM cur INTO @Name
END
CLOSE cur
DEALLOCATE cur
答案 1 :(得分:0)
您可以使用它来生成脚本,以便截断特定服务器上所有数据库的日志文件.......坚持使用特定数据库使用过滤器.....: - )
选择
&#39; 使用[&#39; +名称+&#39;]; GO
- 通过将数据库恢复模型更改为SIMPLE来截断日志。
ALTER DATABASE [&#39; +名称+&#39;] SET RECOVERY SIMPLE;
GO
- 将截断的日志文件缩小为1 MB。
DECLARE @logname varchar(128);
SELECT TOP 1 @ logname = [name] FROM [&#39; + name +&#39;]。[sys]。[database_files] WHERE [type] = 1;
DBCC SHRINKFILE(@logname,1);
GO
- 重置数据库恢复模型。
ALTER DATABASE [&#39; +名称+&#39;] SET RECOVERY FULL;
GO
&#39; AS qry 来自master.dbo.sysdatabases
WHERE dbid&gt; 6
答案 2 :(得分:0)
警告!!:您只能在测试数据库服务器上执行此操作。生产数据库通常希望具有完整恢复模式。测试您通常不需要的数据库。
扩展Abdul的答案(我很难让它显示在新行中),Dis的答案将找到第一个恢复为FULL的数据库,将其设置为simple并缩小它...只需单击执行,直到返回空
declare @dbname nvarchar(50)
declare @logfilename nvarchar(100)
select top(1) @dbname = name from sys.databases where recovery_model_desc <> 'SIMPLE' AND name <> 'tempdb'
declare @shrinkdb nvarchar(500)
set @shrinkdb = 'USE master
ALTER DATABASE [' + @dbname + '] SET RECOVERY SIMPLE
'
select @shrinkdb
execute sp_executesql @shrinkdb
set @shrinkdb = 'USE [' + @dbname + ']
DECLARE @Name NVARCHAR(50)
DECLARE cur CURSOR FOR
SELECT [name]
FROM [sys].[database_files]
where [type] = 1
OPEN cur
FETCH NEXT FROM cur INTO @Name
WHILE @@FETCH_STATUS = 0
BEGIN
DBCC SHRINKFILE(@Name, 1)
FETCH NEXT FROM cur INTO @Name
END
CLOSE cur
DEALLOCATE cur
'
select @shrinkdb
execute sp_executesql @shrinkdb