你还可以再诡异点吗——SQL日志文件不断增长

前言

 

今天算是遇到了一个罕见的案例。

SQL日志文件不断增长的各种实例不用多说,园子里有很多牛人有过介绍,如果我再阐述这些陈谷子芝麻,想必已会被无数次吐槽。

但这次我碰到的问题确实比较诡异,其解决方式也是我第一次使用。

下文将为各位看管详细介绍我的解决思路。

 

现象

 

一客户反馈数据库的日志文件不断增长,已分配的磁盘空间快使用完,尝试过事务日志截断(事务日志备份)的操作,但没有任何效果。

 

分析

 

遇到这个问题,我最直接的感受:肯定有大的事务一直在执行,导致日志备份无法截断事务日志的大小。

首先,我在该数据库下运行DBCC loginfo()

                                          图一

从图一的红色框可以看到,数据库的多个VLF的状态都为2,也就是active状态。(如果为0 ,表示为inactive)。

这表明这些日志文件确实都在活动状态,一般而言,导致这种现象的原因主要有三种:长事务的运行、replication和mirroring延迟。

但这个客户没有采用replication和mirroring,所以我初步锁定问题是因为长事务的运行导致。按照常规的方法,我只需分析下这个事务是否遇到阻塞、死锁等情况,然后给出对应的解决方案即可。(但实际情况并非如此)

为保险起见,我运行如下语句来验证下我的判断:

SELECT log_reuse_wait_desc, * FROM sys.databases WHERE NAME='dbname'

                                                                                           图二

 

显然,我的判断错了,可以看到,目前【log_reuse_wait_desc】的状态为【REPLICATION】。也就是说正是事务日志分发导致日志文件不断增大的原因。

正如前文分析的,这个数据库并没有用作发布订阅,怎么会出现这个状态呢?

经与客户沟通,了解这个数据库其实是从一个发布订阅的数据库中还原过来的,尽管新的数据库并没有采用发布订阅,但数据库中发布订阅的一些配置选项还在,从而导致了数据库的误判,致使日志文件不断增大。

 

方案

 

知道了原因就好办了。

起初我想通过sp_droppublication来完全删除分发订阅的配置,但无法通过sp_helppublication获取到@publication的名字(提示:命令已执行完!),因此这条路走不通了。

在网上找些资料,发现了sp_removedbreplication这个存储过程,执行后再去收缩日志文件,问题果然解决!

EXEC sp_removedbreplication dbname

DBCC SHRINKFILE(Logfilename)

DBCC loginfo()

                                                  图三

 

 

总结

 

尽管本文的场景比较少见,但总体解决的思路与其他(日志文件不断增长)其实是一样的。少许地方不太明白可以通过网络等一些工具获得。这也说明了SQL原理的重要性,借用一本书的序言中的一句话【越接触本质越不会迷茫!】。多接触原理,很多东西都是触类旁通的。

时间: 2024-07-28 19:47:06

你还可以再诡异点吗——SQL日志文件不断增长的相关文章

如何修复被删除的SQL日志文件

 1.确定SQL数据库的安装路径与所用的SQL数据库名称.    如:e:\Program Files\Microsoft SQL Server\MSSQL\Data\J200.mdf'    2.将数据库J200重命名为其他名,如J2008,什么名都可以.    3.利用您所用的系统,重新新建一个"J200"的数据库.    4.点击开始--程序--Microsoft SQL Server--查询分析器--确定,进入软件里,在空白处直接输入以下的命令:EXEC sp_detach_d

清理SQL Server 2008日志文件

  SQL 2008日志文件占了23G硬盘空间,而事务日志已经截断(Truncate),实际日志内容很小,1G都不到,想要释放日志文件霸占的多余空间. 但是,无论怎么收缩(Shrink)日志文件,空间就是不能释放,总是出现错误: Cannot shrink log file 2 (CNBlogsText_log) because of minimum log space required. 之前解决过类似的问题,也写过一篇博客-SQL Server 2008事务日志清理,当时采用的最终解决方法是

清理SQL Server 2008日志文件Cannot shrink log file 2 的解决方案_mssql2008

SQL 2008日志文件占了23G硬盘空间,而事务日志已经截断(Truncate),实际日志内容很小,1G都不到,想要释放日志文件霸占的多余空间. 但是,无论怎么收缩(Shrink)日志文件,空间就是不能释放,总是出现错误: Cannot shrink log file 2 (CNBlogsText_log) because of minimum log space required. 之前解决过类似的问题,也写过一篇博客-SQL Server 2008事务日志清理,当时采用的最终解决方法是:

sql-如何查看SQL的日志文件

问题描述 如何查看SQL的日志文件 想了解谁访问了数据库,数据库的哪些数据被修改了,如何通过日志文件查询. 解决方案 Log Explorer for SQL Server v4.2.1 特别的好,下载地址:? http://download.csdn.net/detail/zhanghongjie0302/5899063 安装完毕后,注册该程序(压缩文件有注册机) 打开log explorer file=>attach log file->选择服务器和登陆方......答案就在这里:sql日

再谈ASP防止SQL Injection漏洞的问题

问题 再谈ASP防止SQL Injection漏洞的问题 /**作者:慈勤强Email: cqq1978@Gmail.com*/ 关于Asp的SQL Injection预防问题,似乎已经没什么可说的了.在我做的Asp的项目里面, 都是用自己写的函数来处理客户端提交进来的数据,我的Blog里面也贴过这个函数. 具体可以参考http://blog.csdn.net/cqq/archive/2004/09/23/113786.aspx 不过,从朋友的留言和网上其他的一些讲如何防范SQL Injecti

测试-while循环为什么跳出了还会再运行一次 新人求知道

问题描述 while循环为什么跳出了还会再运行一次 新人求知道 实体类package com.pij.bean; public class bean { private int num = 501; public int getNum() { return num;}public void setNum(int Num) { this.num = num - Num;} } 实现接口package com.pij.imp; import com.pij.bean.bean; public cla

broadcastreceiver-android BroadcastReceiver 中还可以再发送广播吗?

问题描述 android BroadcastReceiver 中还可以再发送广播吗? 想在onReceive中再发送个广播通知页面更新,但是不行 有没有什么好的方法达到类似效果 解决方案 可以的,你接收不到应该是你的问题,或者是接受者是嵌入2层以上的fragment 解决方案二: 利用handler 应该也可以. 解决方案三: 首先,广播收不到正常有两个原因,一是你没注册广播接受者,二是action过滤不对,好好的看看这些问题.其次,你这个更新UI的问题可以用Activity之间解耦的办法,比如

服务器-求教求教 我的网站删掉了饿 但是还会被检测出被SQL 注入?

问题描述 求教求教 我的网站删掉了饿 但是还会被检测出被SQL 注入? 服务器环境(VPS): linux LNMP 原来装了3个网站,后来发现其中一个A 站 被人挂马了,于是我用LNMP删掉了A站并且把源码也删掉. 但是我用安全狗检测的时候, 经常 会检测这样的警报,我的这些文件 和域名 都已经删除掉了 为什么还可以注入? 难道是我数据库没有删除的原因?

回调函数-小弟做了一个方法,执行完毕还会再进入方法一次,求指教下原因

问题描述 小弟做了一个方法,执行完毕还会再进入方法一次,求指教下原因 小弟把代码贴到了下面,我要迭代的替换字符串中的内容,替换完毕后,方法执行到 return sb.toString(); 应该是结束了,可是我的代码在运行的时候执行了return sb.toString(); 以后又进来执行一次,分析不出来原因,还请大家赐教,不胜感激: private String parseToCk(String str) { String s1 = str.trim(); /** s1截取字符串开始部分*/