4

我们有一些测试数据库,我们将测试索引放入其中,并且由于我们删除表的内容并重新填充它,日志文件很快变得臃肿。

多亏了 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

问题是日志文件名。有没有一种方法可以获取日志文件名,而无需手动查找并将其包含在脚本中,以使这部分自动化?

顺便说一句,我们从来没有打算恢复这个数据库。这些是临时索引。

谢谢!

4

3 回答 3

10
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
于 2013-03-04T18:16:17.917 回答
0

您可以使用它来生成用于截断特定服务器上所有数据库的日志文件的脚本。要坚持特定的数据库,请使用过滤器。

SELECT
' USE [' + name + ']; GO

-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE [' + name + '] SET RECOVERY SIMPLE;
GO

-- Shrink the truncated log file to 1 MB.
DECLARE @logname varchar(128);
SELECT TOP 1 @logname=[name] FROM [' + name + '].[sys].[database_files] WHERE [type] = 1;
DBCC SHRINKFILE (@logname, 1);
GO

-- Reset the database recovery model.
ALTER DATABASE [' + name + '] SET RECOVERY FULL;
GO

' AS qry FROM master.dbo.sysdatabases
WHERE dbid > 6

于 2016-06-28T06:13:44.673 回答
0

警告!!!:您应该只在测试数据库服务器上执行此操作。生产数据库通常希望具有完整的恢复模式。测试您通常不关心的数据库。

扩展 Abdul 的答案(我很难让它在新行中显示)和 Dis 的答案,这会找到第一个恢复 FULL 的数据库,将其设置为简单并缩小它......只需继续单击执行,直到它返回 null

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
于 2020-07-17T02:57:01.487 回答