如何从SQL Server 2008中删除.ldf文件?

时间:2011-04-27 09:05:58

标签: sql-server sql-server-2008

先谢谢

如果我停止SQL-server然后将.LDF文件(transactionlog文件)删除到数据库,会发生什么?将数据库标记为可疑还是SQL-server会自动创建新的? SQL Server 2008 R2 而我的.LDF文件大小太大,所以如何管理它,我是否可以收缩或删除 Plz在查询表格中建议

由于

6 个答案:

答案 0 :(得分:46)

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

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

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

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

也可以切换回完全恢复:

ALTER DATABASE myDatabase SET RECOVERY FULL

关于SHRINKDATABASE的更新 - 或回答此问题时我不知道的事情:

虽然上面的方法摆脱了一些未使用的空间,但它在数据库文件(MDF)上有一些严重的缺点 - 它会损坏你的索引,因为它们会使数据库的性能恶化。因此,您需要在之后重建索引以消除shrink命令导致的碎片。

如果您只想缩小日志文件,则可能只想使用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

答案 1 :(得分:28)

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

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

答案 2 :(得分:18)

我是通过

做到的
  • 分离数据库(包括Drop Connections)
  • 删除* .ldf文件
  • 附加数据库,但删除预期的* .ldf文件

对于SQL 2012中的4个不同的数据库,我应该对SQL 2008是相同的

答案 3 :(得分:5)

正如您可以阅读评论一样,删除日志并不是一个好方法。但是,如果您确定不会丢失任何内容,则可以将数据库恢复模式更改为简单,然后使用

DBCC shrinkdatabase ('here your database name')

清除日志。

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

清除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,从而一劳永逸地摆脱日志问题。特别是当我们每天备份数据(或服务器)时,从安全角度来看,白天的变化并不重要。