环境:
FreeBSD9.2+PostGreSql+Mpd5+FreeRadius3做的PPPoE拨号服务器,每个帐号不能同时在线。平时使用正常,但有一次数据库服务器意外断电,导致许多提示691。经过排查,发现是由于radacct数据表中,有许多‘死’掉的帐号,这些帐号显示正在登录,所以无法再创建新的连接。
数据库表现:
1、acctstoptime为NULL,这是帐号在线的标志;
2、acctsessiontime不再增加。这个字段表示在线的时长,如果不再增加,则表示该连接已死掉,需要注意的时:这个数字不是实时增加的,Radiuse默认配置是300秒才添加一次。
数据库查询:
-
select radacctid,acctstoptime,username from radacct WHERE acctstoptime is null AND (EXTRACT(EPOCH FROM (current_timestamp::TIMESTAMP WITH TIME ZONE - AcctStartTime::TIMESTAMP WITH TIME ZONE )))::BIGINT - acctsessiontime > 300
说明:
(1)acctstoptime,查询的时候要用 is null来表示,网上很多教程都是 = null,这种写法已经过时。
(2)从数据表中取出acctstarttime的是日期型,不能直接用于运算,需要把它转化为timestamp的数值型才能运算,方法是用extract函数。
(3)PostGreSql有大量的后缀式写法。
(4)基本的公式: 当前时间 - 连接开始时间 = 帐号应该在线的时间
帐号应该在线时间 - 数据表中的在线时间: 正常情况下,应该小于Radius的记录间隔(默认300S,由哪个参数决定????)
如果该值大于300,那么表示已经停止记录。
(5)可以参见acctsessiontime的记录语句:在radius的postgresql/query.conf中,查找时注意用了“驼峰式”的写法,单词首字母要大写。
数据清理:
简单的删除不是办法,还是填充acctstoptime比较好:
-
update radacct
-
set acctstoptime = current_timestamp
-
WHERE acctstoptime is null AND (EXTRACT(EPOCH FROM (current_timestamp::TIMESTAMP WITH TIME ZONE - AcctStartTime::TIMESTAMP WITH TIME ZONE )))::BIGINT - acctsessiontime > 300
问题:
300秒的记录间隔由哪个参数决定?
--end--
阅读(5946) | 评论(1) | 转发(2) |