[技术分享]20120628TMG 日志队列突然增长怎么办
用户有时会观察到 TMG 日志队列(Log Queue,扩展名为 .LLQ)持续增长或 TMG 安装目录下 Logs 文件夹异常增长,如果TMG日志队列文件夹使用默认配置,则会导致C盘空间越来越少。伴随而来的问题还有:TMG无法记日志,无法生成报告。
这个问题往往发生在日志格式改动、日志文件夹改动、日志保留时间改动等日志配置操作之后。
问题分析
==========
1. 首先我们在 TMG 管理界面看到 日志状态(TMG 管理控制台 à 日志和报告界面 à 查看日志状态)是“连接中断”,服务器状态上有个感叹号,并且有几 MB 乃至数十 GB 的日志队列。这表示日志无法正常记入日志数据库,都暂存在日志队列中。
2. 同时,查看一下应用程序事件日志,发现有许多 MSSQL$MSFW 的报错,事件 ID 为 17204 (或 1720X),报错信息是无法打开 TMG 日志文件如 ISALOG_20120101_FWS_000.mdf (系统找不到指定的文件)。
3. 出现以上两种症状的原因是:
1) TMG 日志是记在本地的 SQL Express 数据库里,或者曾经记录在本地 SQL Express 数据库而后改为记到远程 SQL 服务器。
SQL Express 数据库在磁盘上的文件名格式为 ISALOG_YYYYMMDD_FWS_XXX.mdf 和 ISALOG_YYYYMMDD_WEB_XXX.mdf,比如 ISALOG_20120101_FWS_000.mdf 表示2012年1月1日的防火墙日志文件。
2) 若由于某种原因,磁盘上的日志文件如 ISALOG_20120101_FWS_000.mdf 已经不存在了(如意外删除或者移动),但是 SQL Express 数据库里还有这个数据库的记录
3) MSSQL$MSFW 服务启动时会检查数据库的完整性,当数据库里的记录无法匹配到相应磁盘上的文件时,MSSQL$MSFW 这个服务就会出现异常。
4) MSSQL$MSFW 会将错误记录在事件日志里,同时 MSSQL$MSFW 停止将新的日志记录到日志数据库里,都暂存在日志队列中,日志队列不停增长,导致磁盘被占满。
解决方案
==========
删除 SQL Express 里 TMG 日志数据库的无效记录即可解决问题。具体操作如下:
1. 以管理员身份启动 命令行
· 连接到 TMG 本地日志数据库实例 MSFW: 运行命令 sqlcmd -S localhost\MSFW
· 运行命令 use master
· 运行命令 go
· 运行命令 select name from sysdatabases
· 运行命令 go
· 上面几个命令运行完后会看到当前 MSFW 实例下所有的数据库名
2. 需要删除哪些记录?
· 如果当前日志已经记入远程 SQL 服务器,那可以删除本地所有记录
· 如果当前日志依然是记录在本地 SQL Express 数据库,请对照TMG日志配置里设置的日志保留时间:TMG 管理控制台 à 日志和报告 à 日志 à 配置 Firewall 日志 和 配置 Web 代理日志 à 打开”选项” ,在最下面可以看到日志保留天数,默认是7天。
这样,只要是这些天数以前的数据库记录都可以删除。
3. 删除数据库
· 假设我们要删除 2011 年11 月全部数据库,请运行如下命令(请注意最后的 % 表示通配符,匹配任意长度的任意字符串,TMG 日志文件是以日期命名的,ISALOG_201111% 表示2011年11月全部TMG 日志数据库; 再比如若要删2011年全部数据库,要用 ISALOG_2011% )
select ‘drop database ‘ + name from sysdatabases where name like ‘ISALOG_201111%’
· 这个命令的输出是多行 drop database ISALOG_201111%,类似下面图中黄色框里的。
· 您把这个输出全部标记(右击命令行窗口,选择“标记”),然后再鼠标单击一下,然后再右击并选择“粘贴”,就会看到类似下图红色框中的
· 再输入命令 go,按回车,这时候这些选中的数据库记录就都会被删除
4. 验证TMG 无效日志数据库是否还存在
· 运行命令 select name from sysdatabases
· 运行命令 go
· 上面几个命令运行完后是输出剩下的默认的几个数据库master, tempdb, model, msdb 以及有效日期以内(取决于日志保留多少天,比如若是15天的话,就是15天以内的)的 TMG 日志数据库
5. 检查日志队列状态
到TMG管理界面上看日志队列状态(日志和报表界面 à 查看日志状态),如果上述所有无效数据库都被删除,此时应该看到日志队列应该在减小,说明 MSSQL$MSFW 服务正在把日志队列中的数据记入日志文件或者远程SQL 服务器正在写入日志。最后日志队列大小会减为0,或者在0到略大于0之间波动,表示日志记录恢复正常。
在这里也值得提一下,“日志队列(Logging Queue)”是 TMG 中新引入的一个特性,增强了日志的鲁棒性和容错性,更多信息请参考:https://technet.microsoft.com/en-us/library/dd183731.aspx
微软安全支持专家
Lucine Wang