繁体   English   中英

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

[英]How to shrink a SQL Server Log file with Mirroring enabled?

我有几个数据库用于我的应用程序,它们使用 SQL Server 2005 镜像来在其他地方保留一份不错的数据副本。 工作起来很迷人,然而,日志文件似乎一直在增长,一个 3GB 的数据库是 15GB。

通常,我可以缩小它 - 但是会弹出一个错误,表明这无法完成。 但是,似乎最终如果取消选中只会扩展以使用驱动器上的所有空间。

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

谢谢

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

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

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

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

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

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

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

我在镜像数据库上遇到了同样的问题,日志文件增长了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'

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

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

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

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

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

可以在这里找到一些好的想法: http:// yukonspace ... transaction-log-growth

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

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

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

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

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

  1. 您必须定期备份日志,否则您的日志文件将无限增长。 如果您无法写入日志(即磁盘空间不足或达到最大大小),则DB将失败
  2. SQL Server 2005存在一个问题,即镜像端没有反映缩小。 解决方案在这里http://support.microsoft.com/kb/937531

本文提供了有关日志文件如何工作的一些很好的信息,您还应该阅读可以延迟日志截断的因素

配置事务日志备份并创建作业或直接运行以下命令。

使用 DatabaseName GO DBCC SHRINKFILE (LogicalFileName_log, 1);

如果您想缩小数据文件,请按照以下步骤操作。

  1. 转到您的数据库属性。
  2. 选择左侧的选项。
  3. 将 auto Shrink 属性更改为 true,默认为 false。 并等待sql server自动缩小它。

我希望它可以解决日志和数据文件收缩问题。

优素福汗。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM