如何在启用镜像的情况下缩小SQL Server日志文件?

时间:2008-10-30 19:41:34

标签: sql-server

我的应用程序有几个数据库,它们使用SQL Server 2005镜像来保存其他地方的数据的良好副本。就像魅力一样,日志文件似乎正在增长和增长,一个是3GB数据库的15GB。

通常情况下,我可以缩小它 - 但是会弹出一个错误,特别是无法完成此操作。但是,似乎最终如果未经检查只会扩展以使用驱动器上的所有空间。

我看到我可以为日志文件设置最大文件大小,这是答案吗?日志是否会在达到最大值时滚动,或者数据库是否会停止运行?

由于

10 个答案:

答案 0 :(得分:3)

我们在从日志传送切换到镜像后遇到了同样的问题。您必须创建一个定期备份事务日志的作业(每15或30分钟左右),以防止日志大小失控。

如果已经失控,请运行BACKUP LOG TO DISK ='Nul',然后运行DBCC SHRINKFILE命令。然后你可以设置你的工作。

请注意,'Nul'不是拼写错误,它是一个旧的DOS技巧,其行为就像您正在编写文件一样,但实际上只是将信息转储到以太网中,因此它不占用空间机。

此外,您的日志将会增长,直到您的空间不足,然后整个过程停止工作。您的应用将收到事务日志已满的错误。

编辑:David正确指出此操作会破坏日志链并降低从失败中恢复的能力。请务必将备份日志用作'nul'命令作为最后的手段。如果驱动器上有空间,则应进行适当的日志备份并设置日志备份计划。确保您还包括定期完整备份和清除任务以删除旧文件。

答案 1 :(得分:2)

我会看看你的日志文件增长的原因,然后你可以定义一个解决问题的策略。 可能值得检查您的镜像状态

当公开主体数据库时,它处于活动状态,具有用户连接和处理事务。但是,没有日志记录被发送到镜像数据库,并且如果主体应该失败,则镜像将不会从主体进入暴露状态的点开始具有任何来自主体的事务。此外,主体的事务日志不能被截断,因此日志文件将无限增长。 ref http://www.microsoft.com/technet/prodtechnol/sql/2005/dbmirror.mspx

答案 2 :(得分:1)

可以在这里找到一些好主意:http://yukonspace ... transaction-log-growth

根据我对完全恢复模式数据库的经验(应该采用类似的方式),您至少需要定期进行完全备份,否则日志只会增长。

答案 3 :(得分:1)

http://support.microsoft.com/kb/937531

  

在SQL Server 2005中使用数据库镜像时,镜像数据库上的收缩操作不会重复

     

原因
  数据库镜像只会在检查点之后更改物理文件大小。

     

替代方法
  方法1
  要解决此问题,请运行以下语句以在master数据库中创建新的存储过程。然后,使用此存储过程收缩主体数据库,而不是运行DBCC SHRINKDATABASE语句或DBCC SHRINKFILE语句。
   [存储过程太长,无法在此处发布]

     

方法2
  缩小主体上的文件后发出手动检查点。

答案 4 :(得分:1)

我在镜像数据库上遇到了同样的问题 日志文件增长了40GB,其中主Db文件大约为700 Mb 我发现这个解决方案在微软它可以工作,但只收缩了我的数据库大约4%

1-只需执行此操作即可创建存储过程

   use master
   go
   if object_id ('sp_shrink_mirrored_database', 'P') is not null 
     drop proc sp_shrink_mirrored_database 
   go
   create procedure sp_shrink_mirrored_database @dbname sysname, @target_percent int = null
   as
   begin
     declare @filename sysname
     declare @filesize int
     declare @sql nvarchar(4000)

     if @target_percent is null
       dbcc shrinkdatabase (@dbname)
     else 
       dbcc shrinkdatabase (@dbname, @target_percent)
     declare c cursor for 
     select [name], [size] from sys.master_files where type=0 and database_id = db_id (@dbname)
     open c
     fetch next from c into @filename, @filesize
     while @@fetch_status=0
     begin
       set @filesize=(@filesize+1)*8
       set @sql='alter database [' + @dbname + '] modify file ( name=' 
         + @filename + ', size=' + cast(@filesize as nvarchar) + 'kb )'
       execute sp_executesql @sql
       fetch next from c into @filename, @filesize
     end
     close c
     deallocate c
   end
   go

2-在新的查询窗口中执行这样的存储过程 例如,如果要收缩mydb数据库,请运行以下语句。

  EXEC sp_shrink_mirrored_database 'mydb'

答案 5 :(得分:0)

你确定镜子没落后吗?主服务器实例在成功应用于镜像之前无法截断日志。在某一点之后,我相信您可能必须备份事务日志并将其应用于镜像并重新启动镜像。

答案 6 :(得分:0)

要收缩事务文件,必须执行备份,因为存在活动虚拟日志文件: http://www.xoowiki.com/Article/SQL-Server/tronquer-journal-de-log-sur-base-en-miroir-499.aspx

答案 7 :(得分:0)

  1. 您必须定期备份日志 否则你的日志文件会增长 无限期。如果你不能写信给 日志(即磁盘空间或磁盘空间) 命中最大尺寸)数据库将失败
  2. SQL Server 2005有一个问题     收缩没有反映在     镜面。解决方案就在这里     http://support.microsoft.com/kb/937531
  3. 本文提供了有关How Log Files工作的一些好消息,您还应该阅读Factors that can delay log truncation

答案 8 :(得分:0)

只需使用以下命令缩小日志文件

即可
USE DBNAME
GO
DBCC SHRINKFILE(DBNAME_log, 1)
BACKUP LOG DBNAME WITH TRUNCATE_ONLY
DBCC SHRINKFILE(DBNAME_log, 1)
GO

答案 9 :(得分:-1)

请确保在使用TRUNCATE_ONLY执行日志备份后执行完整备份。这会破坏日志备份链。