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

c86crjj0  于 2023-01-01  发布在  SQL Server
关注(0)|答案(6)|浏览(494)

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

yyyllmsg

yyyllmsg1#

您不应该删除任何数据库文件,因为这可能会严重损坏您的数据库!
如果磁盘空间不足,您可能需要将数据库拆分为多个部分。这可以在数据库属性中完成。因此,您可以将数据库的每个部分放到不同的存储卷中。
如果将恢复模式从完整模式更改为简单模式,也可以使用以下命令收缩事务日志文件:

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
nwlqm0z1

nwlqm0z12#

不要冒险手动删除LDF文件!如果您不需要事务处理文件或希望将其减小到您选择的任意大小,请执行以下步骤:(注意,这将影响您的备份,因此请确保在执行此操作之前)
1.右键单击数据库
1.选择属性
1.单击"选项"选项卡。
1.将恢复模式设置为SIMPLE
1.接下来,选择"FILES"选项卡
1.现在确保你选择了日志文件并向右滚动。在"自动增长"标题下点击圆点...。
1.然后禁用自动增长(这是可选的,将限制额外的增长)
1.然后点击确定,并设置"初始大小"的大小,你希望有(我设置我的20MB)
1.单击"确定"保存更改
1.然后再次右键单击DB,选择"任务〉收缩〉数据库",按OK。
1.现在比较您的文件大小!:)

enyaitl3

enyaitl33#

我是通过

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

在SQL 2012中为4个不同的数据库执行此操作,对于SQL 2008,i应该相同

h5qlskok

h5qlskok4#

正如你可以阅读评论,这不是很好的解决方案,以消除日志.但如果你确定你不会失去任何东西,你可以只是改变你的数据库恢复模式简单,然后使用
第一个月
清除您的日志。
最糟糕的事情,你可以做的是从磁盘删除日志文件。如果你的服务器有未完成的事务在服务器停止的时刻,这些事务将不会回滚后重新启动,你会得到损坏的数据。

3vpjnl9f

3vpjnl9f5#

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

k97glaaz

k97glaaz6#

清除MS SQL Server中所有数据库中的所有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://learn.microsoft.com/en-us/sql/relational-databases/backup-restore/recovery-models-sql-server
有时候,在某些数据库上永久启用RECOVERY MODEL = SIMPLE是值得的,这样就可以一劳永逸地解决日志问题。特别是当我们每天备份数据(或服务器)时,从安全的Angular 来看,白天的更改并不重要。

相关问题