SSRS 2008 ReportServerTempDB增长异常分析

  这两天收到一SQL 2008 R2数据库服务器的磁盘空间告警,在检查过程中发现ReportServerTempDB已经暴增到60多GB,其中数据文件接近60G,日志文件9G大小左右。如下截图所示


们知道ReportServerTempDB是SSRS使用的临时数据库。这个数据库负责存储中间处理结果,例如报表服务器生成的会话和执行数据、缓存报
表以及工作表。正常情况下,Report
Server能够周期性地清除ReportServerTempDB中的到期的和孤立的数据。后台进程定期清理时间间隔由参数
CleanupCycleMinutes控制,这个参数位于

<Installation
Drive>\<Program Files or Program Files(x86)>\Microsoft SQL
Server\<SSRS Instance>\Reporting Services\ReportServer
下的rsreportserver.config配置文件中。 例如C:\Program Files\Microsoft SQL
Server\MSRS10_50.MSSQLSERVER\Reporting
Services\ReportServer\rsreportserver.config
,它指定多少分钟后从报表服务器数据库删除旧会话和过期快照。有效值的范围为 0 到最大整数之间。默认值为 10。如果将值设置为
0,将禁止数据库清除进程。如下所示,此参数值为10分钟

也就是说,如果正常清理ReportServerTempDB的话,ReportServerTempDB应该不会有这么大。检查数据库ReportServerTempDB,发现最大的表是SessionData,有50多G大小。

CREATE TABLE #tablespaceinfo
    (
      nameinfo VARCHAR(500) ,
      rowsinfo BIGINT ,
      reserved VARCHAR(20) ,
      datainfo VARCHAR(20) ,
      index_size VARCHAR(20) ,
      unused VARCHAR(20)
    )  
 
DECLARE @tablename VARCHAR(255);  
 
DECLARE Info_cursor CURSOR
FOR
    SELECT  '[' + [name] + ']'
    FROM    sys.tables
    WHERE   type = 'U';  
 
OPEN Info_cursor  
FETCH NEXT FROM Info_cursor INTO @tablename  
 
WHILE @@FETCH_STATUS = 0
    BEGIN 
        INSERT  INTO #tablespaceinfo
                EXEC sp_spaceused @tablename  
        FETCH NEXT FROM Info_cursor  
    INTO @tablename  
    END 
 
CLOSE Info_cursor  
DEALLOCATE Info_cursor  
 
--创建临时表
CREATE TABLE [#tmptb]
    (
      TableName VARCHAR(50) ,
      DataInfo BIGINT ,
      RowsInfo BIGINT ,
      Spaceperrow  AS ( CASE RowsInfo
                         WHEN 0 THEN 0
                         ELSE CAST(DataInfo AS decimal(18,2))/CAST(RowsInfo AS decimal(18,2))
                       END ) PERSISTED
    )
 
--插入数据到临时表
INSERT  INTO [#tmptb]
        ( [TableName] ,
          [DataInfo] ,
          [RowsInfo]
        )
        SELECT  [nameinfo] ,
                CAST(REPLACE([datainfo], 'KB', '') AS BIGINT) AS 'datainfo' ,
                [rowsinfo]
        FROM    #tablespaceinfo
        ORDER BY CAST(REPLACE(reserved, 'KB', '') AS INT) DESC  
 
 
--汇总记录
SELECT  [tbspinfo].* ,
        [tmptb].[Spaceperrow] AS '每行记录大概占用空间(KB)'
FROM    [#tablespaceinfo] AS tbspinfo ,
        [#tmptb] AS tmptb
WHERE   [tbspinfo].[nameinfo] = [tmptb].[TableName]
ORDER BY CAST(REPLACE([tbspinfo].[reserved], 'KB', '') AS INT) DESC  
 
DROP TABLE [#tablespaceinfo]
DROP TABLE [#tmptb]



检查C:\Program Files\Microsoft SQL
Server\MSRS10_50.MSSQLSERVER\Reporting Services\LogFiles 下的日志文件,搜索“Call
to CleanBatch”,会看到clean session都是0,部分如下所示

library!WindowsService_0!df8!04/20/2016-12:38:44:: i INFO: Call to CleanBatch()

library!WindowsService_0!df8!04/20/2016-12:38:45::
i INFO: Cleaned 0 batch records, 0 policies, 0 sessions, 0 cache
entries, 49 snapshots, 289 chunks, 0 running jobs, 0 persisted streams,
244 segments, 244 segment mappings, 0 edit sessions.

library!WindowsService_0!df8!04/20/2016-12:38:45:: i INFO: Call to CleanBatch() ends

不清楚为什么出现这种情况,在网上也能看到很多关于reportservertempdb 不能清理历史数据或快照的帖子,如下所示,

http://www.sqlservercentral.com/Forums/Topic1183933-1550-1.aspx

ReportServerTempDB not cleaning itself up in SSRS 2008

ReportserverTempDB Grows unexpected

可以判断SSRS清理历史数据或快照的后台进程出现异常或存在
bug(The ReportServerTempDB sessiondata table is not being purged
according to the 10 minute default setting),但是具体情况,没有相关文档或资料佐证。所以仅仅从上面日志,我们还不能分析出具体原因。我倒是很想知道这个数据库ReportServerTempDB是什么时候出现暴增的,幸亏我在这台服务器部署了一个作业监控数据库文件增长情况,如下所示

可以看出这个数据库在2016-1-1号,只有22G大小(已经运行了一两年了),此后的几个月,几乎每个月增长了10G左右。

查看表SessionData的记录,发现居然还有2015年就已经过期的会话数据,更加深信这个是SSRS的一些bug造成的。

USE ReportServerTempDB;
 
GO
 
SELECT MIN(Expiration) FROM SessionData WITH(NOLOCK)


那么如何处理这个案例呢,我们可以在业务非常少的时间段,按照下面步骤进行操作

1: 首先停止SSRS服务

2: 删除SessionDate表的数据

USE ReportServerTempDB;
GO
 
TRUNCATE TABLE dbo.SessionData;

3: 然后启动SSRS服务

4: 收缩ReportServerTempDB数据库

    如果磁盘空间足够的情况下,就不要收缩ReportServerTempDB数据库了。如果磁盘空间实在紧张,那么收缩也是必须的。

 

 

如果还存在dbo.SessionData不断增长的情况,最好创建做一个作业,每天定期清理那些过期的会话信息。另外还有一个问题,很多人会有疑惑:ReportServerTempDB数据库里面的表能否清理? 答案是可以,具体参考官方文档https://technet.microsoft.com/en-us/library/ms156016.aspx

If you back up the temporary database and subsequently restore it, you should delete the contents. Generally, it is safe to delete the contents of the temporary database at any time. However, you must restart the Report Server Windows service after you delete the contents.

时间: 2024-11-05 09:41:02

SSRS 2008 ReportServerTempDB增长异常分析的相关文章

SSRS 2008 R2 错误:Timeout expired. The timeout period

     今天遇到了Reporting Services(SQL SERVER 2008 R2)的报表执行异常情况,报表加载数据很长时间都没有响应,最后报"An error occurred within the report server database.  This may be due to a connection failure, timeout or low disk condition within the database.;". 检查C:\Program Files

MySQL · 捉虫动态 · MySQL 外键异常分析

外键约束异常现象 如下测例中,没有违反引用约束的插入失败. create database `a-b`; use `a-b`; SET FOREIGN_KEY_CHECKS=0; create table t1(c1 int primary key, c2 int) engine=innodb; create table t2(c1 int primary key, c2 int) engine=innodb; alter table t2 add foreign key(c2) referen

mysql 查询结果异常分析

title: MySQL · mysql · mysql 查询结果异常分析 author: 张远 现象 查询条件类型变化后,查询出了不正确的结果. create table t1(id int primary key, a varchar(50) DEFAULT NULL, key idx_a(a)) engine=innodb; show create table t1; insert into t1 values(1,'6036000240201612190005565273'); inse

2009年全球安全SaaS市场收入比2008年增长70%

市场研究公司Infonetics Research发布了2010年上半年的"管理安全服务和SaaS(软件即服务)市场规模和预测报告". Infonetics Research负责安全的主要分析师Jeff Wilson指出,尽管出现了从2008年年中开始的全球经济衰退,安全服务市场现在还很强劲并且在增长.安全服务的主要市场推动因素包括:由于各种类型的安全威胁的扩散,全球各种规模的机构对安全服务日益增长的需求;当前安全解决方案的复杂性;产品厂商和服务提供商增加销售收入和改善利润率的愿望.S

WCF异常分析

WCF的代码实例网上到处都是,但是在实际的使用过程中总会出现很多问题,我就我在项目中使用WCF碰到的问题做个总结: (注:要看到服务端真正异常配置includeExceptionDetailInFaults="true") 一.现象:界面假死不抛出任何异常(按常理超过等待时间应该抛出超时异常但是没有抛出不知道是什么原因)或抛出超时异常. 代码环境:WinForm+netTcpBinding. 原因分析:因为netTcpBinding和wsHttpBinding都是有状态连接所以造成这种

Linux内核中断和异常分析(上)

中断,通常被定义为一个事件.打个比方,你烧热水,水沸腾了,这时候你要去关掉烧热水的电磁炉,然后再去办之前手中停不下来的事情.那么热水沸腾就是打断你正常工作的一个信号机制.当然,还有其它的情况,我们以后再做分析.       中断也就是这样产生的,中断分为同步中断还有异步中断.       同步中断在Intel的手册中被称为异常,而异步中断被称作中断.打个比方在ARM处理器的异常种类就有不少,有未定义指令异常,软中断异常,快中断异常等等.异常是由程序错误产生的,或者是内核必须处理的异常条件产生的.

异常分析初探

异常在Java中是非常重要的一个内容,了解异常有助于我们写出更加健壮的代码,本文将探讨一下几个问题: 1 异常是怎么被JVM捕获的? 2 新建异常实例是否耗时?为什么会耗时?是否能够避免? 3 为什么不推荐使用printStackTrace()打印异常信息? 4 spring jdbc运行时异常种类概要 5 什么时候应该抛出数据库运行时异常 1. 异常怎么被JVM捕获的 在了解这个之前首先介绍下java的异常表(Exception table),异常表是JVM处理异常的关键点,在java类中的每

HybridDB · 源码分析 · MemoryContext 内存管理和内存异常分析

背景 最近排查和解决了几处 HybridDB for PostgreSQL 内存泄漏的BUG.觉得有一定通用性. 这期分享给大家一些实现细节和小技巧. 阿里云上的 HybridDB for PostgreSQL 是基于 PostgreSQL 开发,定位于 OLAP 场景的 MPP 架构数据库集群.它不少的内部机制沿用了 PostgreSQL 的实现.其中就包括了内存管理机制 MemoryContext. 一:PostgreSQL 内存管理机制 PostgreSQL 对内存的使用方式主要分两大块

Java常见内存溢出异常分析与解决_java

Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆内存分为了三部分,新生代,老年代,持久带,其中持久带实现了规范中规定的方法区,而内存模型中不同的部分都会出现相应的OutOfMemoryError错误,接下来我们就分开来讨论一下.java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因: JVM内存过小.程序不严密,产生了过多的垃圾. 导致OutOfMemor