sql 2008 清理tempdb库的日志

时间:2022-02-10 17:14:00
现在日志有   6G多了  

DUMP     TRANSACTION     tempdb     WITH     NO_LOG   
语法错误
DUMP TRANSACTION dbname WITH NO_LOG
此语句不支持一个或多个选项(no_log)。请查阅文档以了解所支持的选项。


求个正确的语法  在线等

9 个解决方案

#1


各位老大   救救小的吧

#2


--收缩SQL2008日志文件
USE 数据库名
GO
ALTER DATABASE 数据库名 SET RECOVERY SIMPLE  --设置简单恢复模式
GO
DBCC SHRINKFILE (逻辑文件名, 1)
GO
ALTER DATABASE 数据库名 SET RECOVERY FULL  --恢复为原模式
GO 

#3


引用 2 楼 leftie 的回复:
--收缩SQL2008日志文件
USE 数据库名
GO
ALTER DATABASE 数据库名 SET RECOVERY SIMPLE  --设置简单恢复模式
GO
DBCC SHRINKFILE (逻辑文件名, 1)
GO
ALTER DATABASE 数据库名 SET RECOVERY FULL  --恢复为原模式
GO


消息 5058,级别 16,状态 1,第 1 行
在数据库 'tempdb' 中无法设置选项 'RECOVERY'。
消息 8985,级别 16,状态 1,第 1 行
在 sys.database_files 中找不到数据库 'tempdb' 的文件 'D:\DB'。该文件不存在或者已被删除。 
消息 5058,级别 16,状态 1,第 1 行
在数据库 'tempdb' 中无法设置选项 'RECOVERY'。

#4


Look at this url address: http://support.microsoft.com/kb/307487

#5



刚刚运行了下以前不知道哪里得来的代码,好像有用,你要不试试:
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
 @MaxMinutes INT,
 @NewSize INT

USE ZHH -- 要操作的数据库名
SELECT  @LogicalFileName = 'ZHH_Log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
 @NewSize = 1  -- 你想设定的日志文件的大小(M)
--Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size 
 FROM sysfiles
 WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' + 
 CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + 
 CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
 FROM sysfiles
 WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
 (DummyColumn char (8000) not null)

DECLARE @Counter    INT,
 @StartTime DATETIME,
 @TruncLog   VARCHAR(255)
SELECT @StartTime = GETDATE(),
 @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
 AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  
 AND (@OriginalSize * 8 /1024) > @NewSize  
 BEGIN -- Outer loop.
SELECT @Counter = 0
 WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
 BEGIN -- update
 INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans
 SELECT @Counter = @Counter + 1
 END
 EXEC (@TruncLog)  
 END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
 CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 
 CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
 FROM sysfiles 
 WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF 

#6


才6G,不用清理,TEMPDB本身就SIMPLE的。。。若很必要清理,应该SHRINK它

#7


SQL Server会自动创建一个名为tempdb的数据库作为工作空间使用,当您在存储过程中创建一个临时表格时,比如(CREATE TABLE #MyTemp),无论您正在使用哪个数据库,SQL数据库引擎都会将这个表格创建在tempdb数据库中。


SQL Server会自动创建一个名为tempdb的数据库作为工作空间使用,当您在存储过程中创建一个临时表格时,比如(CREATE TABLE #MyTemp),无论您正在使用哪个数据库,SQL数据库引擎都会将这个表格创建在tempdb数据库中。

而且,当您对大型的结果集进行排序,比如使用ORDER BY或GROUP BY或UNION或执行一个嵌套的SELECT时,如果数据量超过了系统内存容量,SQL数据库引擎就会在tempdb中创建工作表格。在您运行DBCC REINDEX或者向现有的表格中添加集群序列时, SQL数据库引擎同样会使用tempdb。实际上,任何针对大型表格的ALTER TABLE命令都会在tempdb中吃掉大量的磁盘空间。

在理想状态下,SQL会在完成指定操作后自动清理,并销毁这些临时表格,但是,很多问题都会导致错误。比如,您的代码创建了一个事务,但是却没能执行或重新运行,那么这些孤儿对象将遗留在tempdb中。而且,对大型数据库运行DBCC CHECK时,它还会消耗掉大量的空间,您往往会发现tempdb比设想的要大很多,甚至还会收到SQL即将用完磁盘空间的出错信息。

您有很多方法可以来修正这一情况,但从长远看来,您需要执行其它的步骤来保证正常使用。

为tempdb“减肥”最简单的办法就是关闭SQL数据库引擎然后重新启动,但是在重要的任务中,这样做可能难度很大;另一方面,如果您已经处于无法承受的状态,那么我的建议就是将这个坏消息告知您的上司,然后开始操作。

如果您幸运拥有另外一块磁盘可以用来放置tempdb,可以进行如下的操作:

USE master

GO

ALTER DATABASE tempdb modify file (name = tempdev, filename = NewDrive:Pathtempdb.mdf )

GO

ALTER DATABASE tempdb modify file (name = templog, filename = NewDrive:Pathtemplog.ldf )

GO

还有三项关于tempdb的属性应该检查:自动增长标记,初始大小和恢复模式,以下是关于这些属性的小窍门:

自动增长标记:记住将这个标记设为True。

初始大小:tempdb的初始大小要根据常用的工作负载来设定,如果有很多用户在使用GROUP BY、ORDER BY或者对大型表格进行聚合操作,那么您的常用工作负载会相当大。如果服务器脱机时,您可能需要检查日志文件与数据文件是否位于同一磁盘,如果这样的话,应当将需要将它们转移到新的磁盘上,您只需指明相应的数据库并使用相同的命令即可。

恢复模式:将恢复模式设定为True意味着让SQL自动截去tempdb的日志文件(在使用了每个表格之后),要找出tempdb所使用的恢复模式,可以使用如下命令:

SELECT DATABASEPROPERTYEX( tempdb , recovery )

恢复模式有三种选择:简单、完整或大量记录(bulk-logged),如要改变设置,可以使用以下命令:

ALTER DATABASE tempdb SET RECOVERY SIMPLE

这些步骤可以优化您系统中使用的tempdb,除了解决磁盘空间问题外,您还会发现SQL Server系统性能的提升。

#8


引用 3 楼 jainfei_li 的回复:
引用 2 楼 leftie 的回复:

--收缩SQL2008日志文件
USE 数据库名
GO
ALTER DATABASE 数据库名 SET RECOVERY SIMPLE --设置简单恢复模式
GO
DBCC SHRINKFILE (逻辑文件名, 1)
GO
ALTER DATABASE 数据库名 SET RECOVERY FULL --恢复为原模式
GO



S……


我也遇到同样问题,我的log文件有17G,数据库数据只有200M,想压缩log文件
同样出现消息 8985,级别 16,状态 1,第 1 行的问题

#9


80G了,没有叫。。。

#1


各位老大   救救小的吧

#2


--收缩SQL2008日志文件
USE 数据库名
GO
ALTER DATABASE 数据库名 SET RECOVERY SIMPLE  --设置简单恢复模式
GO
DBCC SHRINKFILE (逻辑文件名, 1)
GO
ALTER DATABASE 数据库名 SET RECOVERY FULL  --恢复为原模式
GO 

#3


引用 2 楼 leftie 的回复:
--收缩SQL2008日志文件
USE 数据库名
GO
ALTER DATABASE 数据库名 SET RECOVERY SIMPLE  --设置简单恢复模式
GO
DBCC SHRINKFILE (逻辑文件名, 1)
GO
ALTER DATABASE 数据库名 SET RECOVERY FULL  --恢复为原模式
GO


消息 5058,级别 16,状态 1,第 1 行
在数据库 'tempdb' 中无法设置选项 'RECOVERY'。
消息 8985,级别 16,状态 1,第 1 行
在 sys.database_files 中找不到数据库 'tempdb' 的文件 'D:\DB'。该文件不存在或者已被删除。 
消息 5058,级别 16,状态 1,第 1 行
在数据库 'tempdb' 中无法设置选项 'RECOVERY'。

#4


Look at this url address: http://support.microsoft.com/kb/307487

#5



刚刚运行了下以前不知道哪里得来的代码,好像有用,你要不试试:
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
 @MaxMinutes INT,
 @NewSize INT

USE ZHH -- 要操作的数据库名
SELECT  @LogicalFileName = 'ZHH_Log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
 @NewSize = 1  -- 你想设定的日志文件的大小(M)
--Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size 
 FROM sysfiles
 WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' + 
 CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + 
 CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
 FROM sysfiles
 WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
 (DummyColumn char (8000) not null)

DECLARE @Counter    INT,
 @StartTime DATETIME,
 @TruncLog   VARCHAR(255)
SELECT @StartTime = GETDATE(),
 @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
 AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  
 AND (@OriginalSize * 8 /1024) > @NewSize  
 BEGIN -- Outer loop.
SELECT @Counter = 0
 WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
 BEGIN -- update
 INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans
 SELECT @Counter = @Counter + 1
 END
 EXEC (@TruncLog)  
 END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
 CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 
 CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
 FROM sysfiles 
 WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF 

#6


才6G,不用清理,TEMPDB本身就SIMPLE的。。。若很必要清理,应该SHRINK它

#7


SQL Server会自动创建一个名为tempdb的数据库作为工作空间使用,当您在存储过程中创建一个临时表格时,比如(CREATE TABLE #MyTemp),无论您正在使用哪个数据库,SQL数据库引擎都会将这个表格创建在tempdb数据库中。


SQL Server会自动创建一个名为tempdb的数据库作为工作空间使用,当您在存储过程中创建一个临时表格时,比如(CREATE TABLE #MyTemp),无论您正在使用哪个数据库,SQL数据库引擎都会将这个表格创建在tempdb数据库中。

而且,当您对大型的结果集进行排序,比如使用ORDER BY或GROUP BY或UNION或执行一个嵌套的SELECT时,如果数据量超过了系统内存容量,SQL数据库引擎就会在tempdb中创建工作表格。在您运行DBCC REINDEX或者向现有的表格中添加集群序列时, SQL数据库引擎同样会使用tempdb。实际上,任何针对大型表格的ALTER TABLE命令都会在tempdb中吃掉大量的磁盘空间。

在理想状态下,SQL会在完成指定操作后自动清理,并销毁这些临时表格,但是,很多问题都会导致错误。比如,您的代码创建了一个事务,但是却没能执行或重新运行,那么这些孤儿对象将遗留在tempdb中。而且,对大型数据库运行DBCC CHECK时,它还会消耗掉大量的空间,您往往会发现tempdb比设想的要大很多,甚至还会收到SQL即将用完磁盘空间的出错信息。

您有很多方法可以来修正这一情况,但从长远看来,您需要执行其它的步骤来保证正常使用。

为tempdb“减肥”最简单的办法就是关闭SQL数据库引擎然后重新启动,但是在重要的任务中,这样做可能难度很大;另一方面,如果您已经处于无法承受的状态,那么我的建议就是将这个坏消息告知您的上司,然后开始操作。

如果您幸运拥有另外一块磁盘可以用来放置tempdb,可以进行如下的操作:

USE master

GO

ALTER DATABASE tempdb modify file (name = tempdev, filename = NewDrive:Pathtempdb.mdf )

GO

ALTER DATABASE tempdb modify file (name = templog, filename = NewDrive:Pathtemplog.ldf )

GO

还有三项关于tempdb的属性应该检查:自动增长标记,初始大小和恢复模式,以下是关于这些属性的小窍门:

自动增长标记:记住将这个标记设为True。

初始大小:tempdb的初始大小要根据常用的工作负载来设定,如果有很多用户在使用GROUP BY、ORDER BY或者对大型表格进行聚合操作,那么您的常用工作负载会相当大。如果服务器脱机时,您可能需要检查日志文件与数据文件是否位于同一磁盘,如果这样的话,应当将需要将它们转移到新的磁盘上,您只需指明相应的数据库并使用相同的命令即可。

恢复模式:将恢复模式设定为True意味着让SQL自动截去tempdb的日志文件(在使用了每个表格之后),要找出tempdb所使用的恢复模式,可以使用如下命令:

SELECT DATABASEPROPERTYEX( tempdb , recovery )

恢复模式有三种选择:简单、完整或大量记录(bulk-logged),如要改变设置,可以使用以下命令:

ALTER DATABASE tempdb SET RECOVERY SIMPLE

这些步骤可以优化您系统中使用的tempdb,除了解决磁盘空间问题外,您还会发现SQL Server系统性能的提升。

#8


引用 3 楼 jainfei_li 的回复:
引用 2 楼 leftie 的回复:

--收缩SQL2008日志文件
USE 数据库名
GO
ALTER DATABASE 数据库名 SET RECOVERY SIMPLE --设置简单恢复模式
GO
DBCC SHRINKFILE (逻辑文件名, 1)
GO
ALTER DATABASE 数据库名 SET RECOVERY FULL --恢复为原模式
GO



S……


我也遇到同样问题,我的log文件有17G,数据库数据只有200M,想压缩log文件
同样出现消息 8985,级别 16,状态 1,第 1 行的问题

#9


80G了,没有叫。。。