Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4261481
  • 博文数量: 601
  • 博客积分: 15410
  • 博客等级: 上将
  • 技术积分: 6884
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-16 08:11
个人简介

独学而无友,则孤陋而寡闻!

文章分类

全部博文(601)

文章存档

2020年(1)

2018年(4)

2017年(7)

2016年(42)

2015年(25)

2014年(15)

2013年(36)

2012年(46)

2011年(117)

2010年(148)

2009年(82)

2008年(37)

2007年(41)

分类: 系统运维

2013-12-07 10:33:59

环境:

   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--
阅读(5946) | 评论(1) | 转发(2) |
给主人留下些什么吧!~~

5sky2014-04-11 16:27:12

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

mpd.conf 下的这个参数: 
set auth acct-update 300