radius计费系统向蓝海计费系统数据迁移技术总结
本文仅供参考,在实际环境中测试成功。欢迎大家提出问题。
1. 首先要有一个清晰的思路和明确的目标。
本次计费迁移主要将老计费radius management系统的用户,迁移到蓝海计费系统。由于老计费系统和蓝海计费有相似性、同时具有一定的差异性。所以要修正老计费系统数据格式符合蓝海计费的要求(蓝海计费已经提供了数据导入的标准格式)。这样才能将老计费平安的导入蓝海系统,顺利进行计费系统迁移。
2. 准备工作
2-1首先要收集新老计费系统的数据格式和数据库的相关权限。
2-2收集需要迁移的需求,本次迁移并不是将所有的用户迁移到蓝海系统。根据公司营长的需要按要求将数据导出老系统、再导入新系统。
2-3为了保证计费系统的安全性,需要将老系统的数据库备份到测试环境进行测试。同时要做好数据库的导出时间点。
2-4先做部分数据的产品导入。观测导入效果后再研究后续的工作。
2-5由于数据导入蓝海计费系统,在后期的运营中也要进行数据检测。
2-6收集新旧系统的相关数据,本次主要收集数据的套餐信息、资费信息。
3风险
3-1本次数据迁移,如果失败会导致所有迁移用户不能正确使用网络。蓝海系统手动录入的用户不受影响。为了本次迁移的顺利完成,通过和营帐进行商议。先将某一个很小的小区的10个用户进行迁移,做好随时恢复的准备,根据用户反映做出有效处理。
3-2在数据迁移完成后的一段时间内,暂定1个月或者更长时间任何人不得删除老计费的数据并保证老计费一直处于运行状态。
3-3如果迁移失败,会导致所有涉及迁移的用户不能正常拨号。故必须做好计费恢复、割接事前通知、事中做好客服的安抚工作。
3-4迁移时间尽量选择在用户上网人数较少的时间段。
4时间
4-1本次迁移按照公司安排,在测试迁移成功的基础上进行数据的一次性迁移。计划耗时10个小时,尽可能将时间压缩到最小。
5资源调度
5-1本次迁移需要技术部研发部相关人员参加、计费营帐资深管理员、网络割接部门的同事、网管部门同事、客服同事做好通知和解释工作,有效防止网络中断。
6.实施步骤:
6-1用putty通过ssh连接到老计费的linux系统上,
6-2用获得的数据库帐号执行数据库备份操作,命令如下:
Mysqldump –h127.0.0.1 –uroot –pxxxx radius>radius_201512310800.sql;
6-3在搭建的测试数据库环境执行如下数据库还原操作。
Create database radius;
Mysql –h127.0.0.1 –uroot –p***** radius<radius_201512310800.sql;
6-4新建一个业务表格,将营帐给的最新资费套餐导入此表。Xls格式的导入不再详述。
/*createtable srvname
(
idint primary key auto_increment,
srvidint(11),
srvnamevarchar(50)
)
SELECT* FROM srvname
altertable srvname add column srvname2 varchar(50)
altertable srvname add column srvid_old int(11)
xls数据导入到srvname表中
6-5将新旧业务套餐和资费进行转换并生成临时表
#测试将旧业务码转换为新业务码
SELECT* FROM rm_services
SELECTid
FROM(SELECT * FROM srvname WHERE srvname NOT LIKE ‘%年%‘ ) AS t_srv_flage
WHERESUBSTRING(srvname,LOCATE(‘~‘,srvname)+1,1) IN (‘1‘,‘z‘)
#设置flag,剔除年的业务代码和008 3天 3月 6月的业务代码
UPDATEsrvname SET flag=SUBSTRING(srvname,LOCATE(‘~‘,srvname)+1,1)
WHERE
idIN (
SELECTid
FROM(SELECT * FROM srvname WHERE srvname NOT LIKE ‘%年%‘ ) AS t_srv_flage
WHERESUBSTRING(srvname,LOCATE(‘~‘,srvname)+1,1) IN (‘1‘,‘z‘))
ALTERTABLE srvname ADD COLUMN flag CHAR(1)
SELECT* FROM srvname WHERE flag IS NOT NULL
6-6将新旧计费对接成功的数据写入临时表srvname_temp
CREATETEMPORARY TABLE srvname_temp
AS
SELECT
a.srvidAS srvid_new,a.srvname AS srvname_new,a.srvid_old AS srvname_abc,
b.srvidAS srvid_old,b.srvname AS srvname_old,
a.flag
FROMsrvname AS a
LEFTJOIN
rm_servicesAS b
ONa.srvname_old=b.srvname
WHEREa.flag IS NOT NULL
SELECT* FROM srvname_temp
6-7从测试环境的radius库将数据按条件查询出来并导出为csv格式的数据。编码格式选择GBk2312
#导入蓝海计费的最终数据。
/*总结:
FIELDSTERMINATED BY ‘,‘ 字段间分割符
OPTIONALLYENCLOSED BY ‘"‘ 将字段包围对数值型无效
LINESTERMINATED BY ‘\n‘ 换行符*/
/*1queries executed, 0 success, 1 errors, 0 warnings
查询:select u. username, k.value AS 明文密码,u.password as 密文密码, u.srvid as old_srvid, t.srvid_newas new_srvid, t.srvid...
错误代码: 1064
Youhave an error in your SQL syntax; check the manual that corresponds to yourMySQL server version for the right syntax to use near ‘select * from radcheck
select* from rm_users
leftjoin rm_services as s
on‘at line 22
执行耗时 : 0 sec
传送时间 : 0 sec
总耗时 : 0.002 sec
grantfile on *.* to [email protected]‘%‘;
flushprivileges;
mysql服务器没有d盘导致
*/
/*
Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法;如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0。
Excel打开csv文件时,只要字段值都是数字,它就认为该字段类型是数值。但我们存放在数据库中的纯数字char有可能会超过15位,这样导出csv文件后,用excel打开看到的字段值就不对了。
网上的解决方法
1、将单元格格式设为文本,但行不通,还是会以科学计数法显示
2、将单元格格式设为特殊,类型邮政编码,这样不会以科学计数法显示,但是数字超过15位时低位还是会变0;
3、新建一个新工作表,用数据导入自文本文件功能,将csv导入到工作表中(分隔符逗号,每一列格式都设为文本),这样可以正确显示,但是每次导出新csv文件都要这么做比较麻烦,而且我们也不可能让客户去进行这个操作。
参考这篇文章 java导出csv用excel打开后数字不用科学计数法显示
我在mysql导出csv文件时,设置字段值用制表符\t括起来(outfile ‘e:\\test.csv‘fields terminated by ‘,‘ optionally enclosed by ‘\t‘ lines terminated by ‘\r\n‘),
这样excel打开csv文件时,会将数值用文本格式显示,而不是数值格式,因为我们的数值前后都有制表符\t,而不是单纯的数字。
这样打开导出的csv文件就可以正常显示了。不建议这样使用*/
SELECT
u.username AS ‘账号‘,
k.valueAS ‘密码‘,
IF(u.`firstname`!=‘‘,u.`firstname`,‘测试‘)AS ‘姓名‘,
IF(u.`taxid`,u.`taxid`,‘610000000000000000‘)AS ‘证件号码‘, //处理身份证号码为空的字段
IF(u.mobile,u.mobile,‘13000000000‘)AS ‘手机号码‘, //处理手机号码为空的字段
IF(u.`address`!=‘‘,u.`address`,‘xxx‘)AS‘联系地址‘, //处理地址为空的字段
‘‘AS ‘账号余额‘,
u.`staticip`AS ‘ip地址‘,
u.`createdon`AS ‘开始时间‘,
u.`expiration`AS ‘结束时间‘,
#if(SUBSTRING(u.`address`,1,2) IN (‘小区或社区名称‘),‘17‘,‘18‘) as ‘区域编号‘, //处理地址自动化分行政区域的字段,并自动按规范设置区域编号 17 18为区域编号,可以根据相关规范进行设定。
‘陕西省xx市xx区‘ AS ‘区域名称‘,
‘1‘AS ‘运营商编号‘,
‘本地‘AS ‘运营商名称‘,
‘5‘AS ‘项目编号‘,
‘BRAS‘AS‘项目名称‘, //计费类型
t.srvid_newAS ‘产品编号‘,
t.srvname_newAS ‘产品名称‘,
u.`createdby`AS ‘开户人员‘,
‘‘AS‘用户备注1‘,
‘‘AS‘地址池名称‘,
REPLACE(u.`comment`,‘\\‘,‘‘) AS ‘用户备注‘,
‘‘AS‘发票号‘,
‘‘AS‘固话号码‘,
‘‘AS‘操作人员‘,
‘‘AS‘用户属性‘
#INTOOUTFILE ‘e://lanhai.csv‘ //设置导出的文件名
#FIELDSTERMINATED BY ‘,‘ //设置导出数据以逗号分割字段
#OPTIONALLYENCLOSED BY ‘"‘ //设置字段以””进行包裹
#LINESTERMINATED BY ‘\n‘ //设置行结束符为换行符\n
FROMrm_users AS u
LEFTJOIN radcheck AS k
ONu.username=k.username
LEFTJOIN srvname_temp AS t
ONu.`srvid`=t.srvid_old
WHEREk.`value` <>1
ANDSUBSTRING(u.username,1,9)=‘029010000‘
ANDu.`address` LIKE ‘文景%‘
AND u.`expiration`>‘2015-05-31‘
6-8将导出的csv在蓝海计费里面通过数据库管理下的数据导入功能将数据导入。注意导入的过程中蓝海计费的提示信息。如果发现错误,请认真进行分析。
6-9由于数据涉及到公司的机密,故再次就不一一附图。
本文至此结束。