【问题标题】:SQL Server database has 2 log files and I want to remove one. HOW?SQL Server 数据库有 2 个日志文件,我想删除一个。如何?
【发布时间】:2012-05-31 18:42:23
【问题描述】:

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

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

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

然后我删除了第二个日志文件并单击确定。我想这就是我需要做的全部?我在测试服务器上通过还原尝试了它。

【问题讨论】:

    标签: sql-server logfile


    【解决方案1】:

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

    您不能将事务日志数据从一个日志文件移动到另一个日志文件 清空事务日志文件。删除非活动事务 事务日志文件,事务日志必须被截断或备份 向上。当事务日志文件不再包含任何活动或 不活动的事务,日志文件可以从数据库中删除。

    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
    

    【讨论】:

    • 还有一个问题,在上面的 t0sql 代码中,我假设我将 rDB 更改为我自己的数据库的名称。我知道...只是确定。
    • @Catahoula 我建议阅读链接的博客文章...该代码是如何完成此操作的示例,但其中很多代码是设置/演示...只有 2 - 3 个命令,您将在您的环境中实际运行。
    猜你喜欢
    • 2011-07-04
    • 2012-10-09
    • 2015-09-30
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2021-05-24
    相关资源
    最近更新 更多