【问题标题】:How to delete .ldf file from SQL Server 2008?如何从 SQL Server 2008 中删除 .ldf 文件?
【发布时间】:2011-08-13 16:29:10
【问题描述】:

提前致谢

如果我停止 SQL-server 然后将 .LDF 文件(事务日志文件)删除到数据库中,会发生什么?数据库会被标记为可疑数据库还是 SQL-server 会自动创建一个新数据库? SQL Server 2008 R2 而且我的.LDF文件太大了,怎么管理,可以缩小还是删除 请在查询表中提出建议

谢谢

【问题讨论】:

  • 不要那样做!您会丢失整个事务日志。为什么要删除事务日志?它是您数据库的组成部分!不要只删除 SQL Server 背后的文件 - 绝不!

标签: sql-server sql-server-2008


【解决方案1】:

您不应该删除任何数据库文件,因为它会严重损坏您的数据库!

如果您的磁盘空间不足,您可能希望将数据库拆分为多个部分。这可以在数据库的属性中完成。因此,您可以将数据库的每个部分放到不同的存储卷中。

如果您将恢复模式从完全更改为简单,您还可以使用以下命令缩小事务日志文件:

ALTER DATABASE myDatabase SET RECOVERY SIMPLE
DBCC SHRINKDATABASE (myDatabase , 5)

也可以切换回完全恢复:

ALTER DATABASE myDatabase SET RECOVERY FULL

关于 SHRINKDATABASE 的更新 - 或者我在回答这个问题时不知道的:

虽然上面的方法消除了一些未使用的空间,但它对数据库文件 (MDF) 有一些严重的缺点 - 它会通过将索引碎片化而损害您的索引,从而恶化数据库的性能。所以你需要在之后重建索引,以摆脱收缩命令造成的碎片。

如果您只想缩小日志文件,可能只想使用SHRINKFILE。我从 MSDN 复制了这个例子:

USE AdventureWorks2012;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2012
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2012_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2012
SET RECOVERY FULL;
GO

【讨论】:

    【解决方案2】:

    不要冒险手动删除您的 LDF 文件!如果您不需要事务文件或希望将它们减小到您选择的任何大小,请按照以下步骤操作: (注意这会影响你的备份,所以在这样做之前一定要确定)

    1. 右键数据库
    2. 选择属性
    3. 点击“选项”标签。
    4. 将恢复模式设置为 SIMPLE
    5. 接下来,选择“文件”选项卡
    6. 现在确保选择 LOG 文件并向右滚动。在“自动增长”标题下,点击圆点 ....
    7. 然后禁用自动增长(这是可选的,会限制额外增长)
    8. 然后点击确定,将“初始大小”设置为您希望的大小(我设置为 20MB)
    9. 点击确定保存更改
    10. 然后再次右键单击数据库,选择“任务 > 收缩 > 数据库”,按确定。
    11. 现在比较您的文件大小!:)

    【讨论】:

    • 当您在第 9 步中点击“确定”时,似乎第 10 步会自动发生。
    【解决方案3】:

    我做到了

    • 分离数据库(包括丢弃连接)
    • 删除 *.ldf 文件
    • 附加数据库,但删除预期的 *.ldf 文件

    在 SQL 2012 中为 4 个不同的数据库做了它,我在 SQL 2008 中应该是一样的

    【讨论】:

    • +1 为您服务!我不知道为什么人们倾向于忽略这个问题,把你当作婴儿一样对待(例如,那些答案“不要这样做,因为它很危险”)。我从客户那里收到 SAMPLE 和 TEST DB。我只需要临时访问他们的数据。有时他们有一个 40 或 50 Gb 的 LDF 文件!我不关心恢复这个数据库,我只需要摆脱我硬盘中的那些 40 Gb!
    • 这是我一直在寻找的答案,也是我登陆此页面的原因。谢谢
    【解决方案4】:

    由于您可以阅读 cmets,因此删除日志并不是一个好的解决方案。但是如果你确定你不会丢失任何东西,你可以将你的数据库恢复模式更改为简单,然后使用

    DBCC shrinkdatabase ('here your database name')

    清除您的日志。

    您能做的最糟糕的事情是从磁盘中删除日志文件。如果您的服务器在服务器停止时有未完成的事务,则这些事务在重新启动后不会回滚,您将获得损坏的数据。

    【讨论】:

    • dbcc 收缩数据库太大了。如果您只想缩小一个文件,请使用 dbcc shrinkfile
    【解决方案5】:

    您应该备份您的事务日志,然后会有可用空间来缩小它。更改为简单模式然后缩小意味着您将丢失所有在还原时有用的事务数据。

    【讨论】:

    • 也许是,也许不是。这完全取决于数据库等待重用日志空间的内容。检查相关数据库的 sys.databases 中的 log_reuse_wait_desc 列会告诉你。
    【解决方案6】:

    在 MS SQL 服务器中清除所有数据库中的所有 ldf 文件(事务日志文件)的最佳方法当然是提前备份所有数据库:

    USE MASTER
    print '*****************************************'
    print '************ Czyścik LDF ****************'
    print '*****************************************'
    
    declare
       @isql varchar(2000),
       @dbname varchar(64),
       @logfile varchar(128),
       @recovery_model varchar(64)
    
       declare c1 cursor for 
       SELECT  d.name, mf.name as logfile, d.recovery_model_desc  --, physical_name AS current_file_location, size
       FROM sys.master_files mf
          inner join sys.databases d
          on mf.database_id = d.database_id
       --where recovery_model_desc <> 'SIMPLE'
       and d.name not in ('master','model','msdb','tempdb') 
       and mf.type_desc = 'LOG'
       and d.state_desc = 'online'   
       open c1
       fetch next from c1 into @dbname, @logfile, @recovery_model
       While @@fetch_status <> -1
          begin
    
          print '----- OPERATIONS FOR: ' + @dbname + ' ------'
    
          print 'CURRENT MODEL IS: ' + @recovery_model
    
          select @isql = 'ALTER DATABASE ' + @dbname + ' SET RECOVERY SIMPLE'
          print @isql
          exec(@isql)
          select @isql='USE ' + @dbname + ' checkpoint'
          print @isql
          exec(@isql)
          select @isql='USE ' + @dbname + ' DBCC SHRINKFILE (' + @logfile + ', 1)'
          print @isql
          exec(@isql)
          select @isql = 'ALTER DATABASE ' + @dbname + ' SET RECOVERY ' + @recovery_model
          print @isql
          exec(@isql)
    
          fetch next from c1 into @dbname, @logfile, @recovery_model
          end
       close c1
       deallocate c1
    

    这是一个改进的代码,基于:https://www.sqlservercentral.com/Forums/Topic1163961-357-1.aspx

    我推荐阅读这篇文章:https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/recovery-models-sql-server

    有时值得在某些数据库上永久启用 RECOVERY MODEL = SIMPLE,从而一劳永逸地摆脱日志问题。尤其是当我们每天备份数据(或服务器)时,从安全的角度来看,白天的更改并不重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      相关资源
      最近更新 更多