最近用了大半年的solarwinds服务器,频繁死机,系统日志有大量的“由注册表引起的 I/O 操作发生了不可恢复的错误”信息提示,且发现solarwinds数据库文件几乎把磁盘分区占满。观察一段时间,此机的CPU和内存都能满足solarwinds的要求。推断为磁盘空间不足,导致这种故障出现。于是,上网查了几篇文章后,决定给solarwinds的数据库keep fit一下。
          1.第一步,使用solarwinds自带的database manager工具,查询数据库中哪个表
             占用的空间较多,以便对症下药。
          2.备份原有的数据库文件,先把solarwinds的服务全部停止,然后在SQL的
             企业管理器上,分离solarwinds数据库,然后复制到其它地方。备份完后,再附
            加回数据库文件
          3.对于占用较多空间的数据表,如果它以往的数据已经没有保留价值,可以先
             执行删除语句,以TrapVarbinds为例,在SQL查询分析器上,执行以下命令
                         delete from TrapVarbinds
                         from TrapVarbinds a, Traps b
                         where a.TrapId = b.TrapId
                         and b.DateTime < datediff(day, -30, getdate())
                         该命令执行后,会把TrapVarbinds表中,TrapId号与表Tarps,TrapId号相
                         同的,且又是30天前所记录的数据删除。
              delete这个命令,在执行时会产生日志记录,如果磁盘空间已满,则可能会
              执行失败。此时可改用命令 truncate table trapvarbinds,但这个命令会把数
          据 表内的全部数据删除,切记!
          4.删除操作完成后,执行solarwinds自带的database maintenance(上文所提的是
             database manager)对数据库进行维护。此操作完成后,可在database manager
             查询到数据表占用的空间已变小,但在windows下查看数据库mdf文件的大小
             没变,为此需要执行收缩数据库操作。
         5.在SQL查询分析器上,执行命令DBCC SHRINKFILE ( NetPerfMon,20000 ),把接
            近40G的数据库文件收缩为20G,该操作i消耗了接近两个半钟时间。
          6.重新启动solarwinds的服务,观察该机是否还会出现之前的故障。
        
       后记:在database manager里,还可以对某个数据表进行compact/rebuild
                   indexs,但执行该操作后,虽然数据表的空间变小,但数据库文件反而变
                    大了,又要重新收缩一次数据库文件:(