【问题标题】:How to shrink a SQL Server Log file with Mirroring enabled?如何在启用镜像的情况下缩小 SQL Server 日志文件?
【发布时间】:2021-11-15 22:05:07
【问题描述】:

我有几个数据库用于我的应用程序,它们使用 SQL Server 2005 镜像在其他地方保存一份漂亮的数据副本。就像一个魅力,然而,日志文件似乎在不断增长,一个 15GB 的 3GB 数据库。

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

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

谢谢

【问题讨论】:

    标签: sql-server


    【解决方案1】:

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

    如果它已经失控,请运行 BACKUP LOG TO DISK = 'Nul',然后运行 ​​DBCC SHRINKFILE 命令。然后你就可以开始工作了。

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

    此外,您的日志会不断增长,直到您的空间用完,然后整个事情就会停止工作。您的应用将收到事务日志已满的错误消息。

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

    【讨论】:

    • 备份到 Nul 不是一个好计划,您会丢弃所有日志信息。这可能会影响您的恢复能力。我会备份到磁盘并保留日志备份,直到您的下一次差异/完整备份
    • 没错,如果你有空间,你应该总是正确备份日志。但这只有在你有空间的情况下才有效。如果日志文件已经用完驱动器上的空间,您将用尽选项。我将修改帖子以在其中包含备份步骤。这很重要:)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我确实在运行备份,但它们并没有缩小。
      【解决方案4】:

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

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

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

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

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

      【讨论】:

        【解决方案5】:

        我在镜像数据库上遇到了同样的问题 日志文件增长了 40GB,而主 Db 文件约为 700 Mb 我发现这个解决方案在 microsoft 中有效,但只将我的数据库缩小了大约 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'
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:
              1. 您必须定期备份日志 否则你的日志文件会增长 无限期地。如果你不能写信 日志(即磁盘空间不足或 达到最大大小)数据库将失败
              2. SQL Server 2005 存在以下问题: 收缩不会反映在 镜面。解决方案在这里 http://support.microsoft.com/kb/937531

              这篇文章有一些关于How Log Files工作的好信息,你也应该阅读Factors that can delay log truncation

              【讨论】:

                【解决方案9】:

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

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

                【讨论】:

                • 感谢您的 cmets .. :)
                【解决方案10】:

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

                use DatabaseName
                GO
                DBCC SHRINKFILE (LogicalFileName_log, 1);
                GO
                

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

                1. 转到您的数据库属性。
                2. 选择左侧的选项。
                3. 将 auto Shrink 属性更改为 true,默认为 false。

                等待sql server自动收缩。

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

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多