Chinaunix首页 | 论坛 | 博客
  • 博客访问: 98360
  • 博文数量: 22
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-17 11:22
文章分类

全部博文(22)

文章存档

2015年(6)

2014年(16)

我的朋友

分类: 系统运维

2014-12-15 10:03:58

环境:

   FreeBSD9.2+PostGreSql+Mpd5+FreeRadius3做的PPPoE拨号服务器,每个帐号不能同时在线。平时使用正常,但有一次数据库服务器意外断电,导致许多提示691。经过排查,发现是由于radacct数据表中,有许多‘死’掉的帐号,这些帐号显示正在登录,所以无法再创建新的连接。

数据库表现:

  1、acctstoptime为NULL,这是帐号在线的标志;
  2、acctsessiontime不再增加。这个字段表示在线的时长,如果不再增加,则表示该连接已死掉,需要注意的时:这个数字不是实时增加的,Radiuse默认配置是300秒才添加一次。

数据库查询:


点击(此处)折叠或打开

  1. 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比较好:

  1. update radacct
  2. set acctstoptime = current_timestamp
  3.  WHERE acctstoptime is null AND (EXTRACT(EPOCH FROM (current_timestamp::TIMESTAMP WITH TIME ZONE - AcctStartTime::TIMESTAMP WITH TIME ZONE )))::BIGINT - acctsessiontime > 300

问题:

300秒的记录间隔由哪个参数决定?





--end--
阅读(2185) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~