SQL Server数据库有2个日志文件,我想删除一个。怎么样?

时间:2012-05-31 18:42:23

标签: sql-server logfile

我是新手。我有一个有2个.ldf文件的数据库(由其他人创建)。 (blah_log.ldf和blah_log2.ldf)。我的经理让我删除其中一个日志文件,但我不能。我该怎么做呢?我试图把它放在另一台服务器上,分离,删除日志文件,附加,但它给出了一个错误。我认为它会创造一个,但它想要两者。然后我试图右键单击属性并删除文件,不会让我删除。它说日志文件不是空的。我怎么做到这一点。我只想把它放在dang数据库有一个怪异的日志文件而不是两个的地方。这不应该是这么复杂。我是初学者,一无所知,也许不是真的。请帮忙!

我刚试过这个: 空SQL Server数据库事务日志文件

使用truncate_only备份日志[dbname] 走 DBCC SHRINKDATABASE([dbname],10,TRUNCATEONLY) 去

然后我删除了第二个日志文件并单击确定。我想这就是我需要做的一切?我在恢复时在测试服务器上尝试过它。

1 个答案:

答案 0 :(得分:4)

This MSDN article describes how to accomplish this at a high-level

  

您无法将事务日志数据从一个日志文件移动到另一个日志文件   清空事务日志文件。从a中删除非活动事务   事务日志文件,必须截断或支持事务日志   起来。当事务日志文件不再包含任何活动或   不活动的事务,可以从数据库中删除日志文件。

And this blog post shows the actual T-SQL that will accomplish this task

USE master 
IF DB_ID('rDb') IS NOT NULL DROP DATABASE rDb 
GO 

CREATE DATABASE rDb 
ON  
PRIMARY  
 ( NAME = N'rDb', FILENAME = N'C:\rDb.mdf' , SIZE = 50MB , 
     FILEGROWTH = 1024KB ) 
LOG ON  
 (NAME = N'rDb_log2', FILENAME = N'C:\rDb_log2.ldf', SIZE = 3MB, 
     FILEGROWTH = 2MB) 
,(NAME = N'rDb_log3', FILENAME = N'C:\rDb_log3.ldf', SIZE = 3MB, 
     FILEGROWTH = 2MB) 
,(NAME = N'rDb_log4', FILENAME = N'C:\rDb_log4.ldf', SIZE = 3MB, 
     FILEGROWTH = 2MB) 
GO 

ALTER DATABASE rDb SET RECOVERY FULL 
BACKUP DATABASE rDb TO DISK = 'C:\rDb.bak' WITH INIT 
CREATE TABLE rDb..t(c1 INT IDENTITY, c2 CHAR(100)) 

INSERT INTO rDb..t 
SELECT TOP(15000) 'hello' 
FROM syscolumns AS a 
  CROSS JOIN syscolumns AS b 

--Log is now about 46% full 
DBCC SQLPERF(logspace) 

--Check virtual log file layout 
DBCC LOGINFO(rDb) 
--See that file 4 isn't used at all (Status = 0 for all 4's rows) 

--We can remove file 4, it isn't used 
ALTER DATABASE rDb REMOVE FILE rDb_log4 

--Check virtual log file layout 
DBCC LOGINFO(rDb) 

--Can't remove 3 since it is in use 
ALTER DATABASE rDb REMOVE FILE rDb_log3 

--What if we backup log? 
BACKUP LOG rDb TO DISK = 'C:\rDb.bak' 

--Check virtual log file layout 
DBCC LOGINFO(rDb) 
--3 is still in use (status = 2) 

--Can't remove 3 since it is in use 
ALTER DATABASE rDb REMOVE FILE rDb_log3 

--Shrink 3 
USE rDb 
DBCC SHRINKFILE(rDb_log3) 
USE master 

--... and backup log? 
BACKUP LOG rDb TO DISK = 'C:\rDb.bak' 

--Check virtual log file layout 
DBCC LOGINFO(rDb) 
--3 is no longer in use 

--Can now remove 3 since it is not in use 
ALTER DATABASE rDb REMOVE FILE rDb_log3 

--Check explorer, we're down to 1 log file 

--See what sys.database_files say? 
SELECT * FROM rDb.sys.database_files 
--Seems physical file is gone, but SQL Server consider the file offline 

--Backup log does it: 
BACKUP LOG rDb TO DISK = 'C:\rDb.bak' 
SELECT * FROM rDb.sys.database_files 

--Can never remove the first ("primary") log file 
ALTER DATABASE rDb REMOVE FILE rDb_log2 
--Note error message from above