从FreeRadius 2 迁移到 3

目前FreeRadius官方主推的是3.x版本,生产环境也推荐尽快升级到新版本。

数据库的差异与迁移

版本2与3的MySQL数据库定义大部分表是相同的,除了radacct表里有字段调整:

  • 去掉了以下字段

    acctstartdelay int(12) default NULL,
    acctstopdelay int(12) default NULL,
    xascendsessionsvrkey varchar(10) default NULL
    
  • 新增了字段及KEY

    acctupdatetime datetime NULL default NULL,
    acctinterval int(12) default NULL
    
  • KEY及引擎的变化

    UNIQUE KEY acctuniqueid (acctuniqueid),
    KEY acctinterval (acctinterval),
    
    另外,该表的引擎变更为INNODB
    

虽然FreeRadius3可以直接使用版本2的数据库内容,Radius认证功能完全正常,但是由于radacct字段不一直,将导致无法正常计费。另外,在日志中也会出现如下的报错。

rlm_sql_mysql: MySQL error 'Unknown column 'acctupdatetime' in 'field list''

场景①:不需要迁移radacct表的旧数据

由于radacct的计费功能不是核心功能,那么可以不考虑迁移这个表的旧数据。这种情况下,最便捷的方法是在将数据库中的radacct表删除,然后重新创建FreeRadius3中的radacct表。MySQL命令行如下:

DROP TABLE IF EXISTS `radacct `;

CREATE TABLE radacct (
  radacctid bigint(21) NOT NULL auto_increment,
  acctsessionid varchar(64) NOT NULL default '',
  acctuniqueid varchar(32) NOT NULL default '',
  username varchar(64) NOT NULL default '',
  groupname varchar(64) NOT NULL default '',
  realm varchar(64) default '',
  nasipaddress varchar(15) NOT NULL default '',
  nasportid varchar(15) default NULL,
  nasporttype varchar(32) default NULL,
  acctstarttime datetime NULL default NULL,
  acctupdatetime datetime NULL default NULL,
  acctstoptime datetime NULL default NULL,
  acctinterval int(12) default NULL,
  acctsessiontime int(12) unsigned default NULL,
  acctauthentic varchar(32) default NULL,
  connectinfo_start varchar(50) default NULL,
  connectinfo_stop varchar(50) default NULL,
  acctinputoctets bigint(20) default NULL,
  acctoutputoctets bigint(20) default NULL,
  calledstationid varchar(50) NOT NULL default '',
  callingstationid varchar(50) NOT NULL default '',
  acctterminatecause varchar(32) NOT NULL default '',
  servicetype varchar(32) default NULL,
  framedprotocol varchar(32) default NULL,
  framedipaddress varchar(15) NOT NULL default '',
  PRIMARY KEY (radacctid),
  UNIQUE KEY acctuniqueid (acctuniqueid),
  KEY username (username),
  KEY framedipaddress (framedipaddress),
  KEY acctsessionid (acctsessionid),
  KEY acctsessiontime (acctsessiontime),
  KEY acctstarttime (acctstarttime),
  KEY acctinterval (acctinterval),
  KEY acctstoptime (acctstoptime),
  KEY nasipaddress (nasipaddress)
) ENGINE = INNODB;

场景②:需要迁移radacct表的旧数据

如果需要迁移原来的数据表,建议使用以下创建一个临时表的方式进行过度。否则如果表中数据量很大,那么alert表会导致长时间锁表,等待时间较长。

  1. 创建临时表3并根据新版本的定义进行修改(也可以使用radacct表定义新建一个表)

    CREATE TABLE radacct3 LIKE radacct;
    ALTER TABLE radacct3 ADD acctupdatetime datetime NULL default NULL AFTER acctstarttime;
    ALTER TABLE radacct3 ADD acctinterval int(12) default NULL AFTER acctstoptime;
    ALTER TABLE radacct3 ADD KEY(acctinterval);
    ALTER TABLE radacct3 ADD UNIQUE KEY(acctuniqueid);
    ALTER TABLE radacct3 DROP column acctstartdelay;
    ALTER TABLE radacct3 DROP column acctstopdelay;
    ALTER TABLE radacct3 DROP column xascendsessionsvrkey;
    
  2. 使用insert by select方式复制数据。(可以增加where条件,仅导入近期数据)

    INSERT INTO radacct3 (
    radacctid,acctsessionid,acctuniqueid,username,groupname,realm,nasipaddress,nasportid, 
    nasporttype,acctstarttime,acctstoptime,acctsessiontime,acctauthentic,connectinfo_start,
    connectinfo_stop,acctinputoctets,acctoutputoctets,calledstationid,callingstationid,
    acctterminatecause,servicetype,framedprotocol,framedipaddress
    ) SELECT radacctid,acctsessionid,acctuniqueid,username,groupname,realm,nasipaddress,nasportid, 
    nasporttype,acctstarttime,acctstoptime,acctsessiontime,acctauthentic,connectinfo_start,
    connectinfo_stop,acctinputoctets,acctoutputoctets,calledstationid,callingstationid,
    acctterminatecause,servicetype,framedprotocol,framedipaddress FROM radacct;
    
  3. 将原表格改名,然后将新表格改为正式名称

    RENAME TABLE radacct TO radacct_old;
    RENAME TABLE radacct3 TO radacct;
    
    # 确定无误后,删除旧表
    DROP TABLE radacct_old;
    
Share Comments
comments powered by Disqus