1CDR系统的改进市话的WLLCDR(CallDetailRecorder)是一个基于窗口的程序,它用于轮询WLL/V5WLL节点以收集所有CDR记录。每个相连WLL/V5WLL节点实时收集CDR信息。每完成四个或八个呼叫(依赖于WLL/V5WLL接的设置),WLL/V5WLL就向运行WLLCDR软件的计算机发送最近的CDR,计算机负责存储和整理CDR记录,CDR记录有两种存储方式:文本文件、MDB数据库。其中文本文件用于存档,作为辅助计费资料,MDB数据库被用于网管系统从中提取话务数据。MDB数据库有个缺点,就是稳定性差,特别是文件大小超过1GB,会使CDR系统退出运行,丢失大量话务数据。针对以上问题,采取标本兼治的方针,从标、本两个方面进行改进,提高其稳定性。一、治标:系统在退出后,WLL/V5WLL节点能保留一定数量的呼叫信息,在系统恢复后自动发送保存的信息,只要确保系统退出后在一定的时间内能够再次启动,就不会影响正常的呼叫信息收集。因此,可以设计一个程序,能监视CDR程序的运行,一旦监测到CDR程序退出,就会自动重新启动CDR程序,保证CDR的不间断运行。按照这个思路,我用WSH编了个程序,达到了目的。程2序的框图如下:首先,对程序初始化,设定记录文件的名称,需要监控的程序名称以及程序所在目录,并并检查记录文件是否存在,若存在,则以追加方式打开文件,否则新建记录文件;接着进入程序主体运行,这是一个死循环的过程,程序检测CDR程序是否存在,若不存在,则重新启动,并在文件中记录这次事件发生的时间,重新返回执行再次检测,若存在,则休眠一段时间并返回,进行下一轮循环。二、治本以上的方法只是解决了程序的不间断运行的问题,但是由于mdb数据库增大而影响系统的稳定造成的话务数据丢失的根本问题仍未得到圆满解决。既然数据库的稳定性是根本原因,那么只要提高数据库的稳定性,就能从根本上解决问题,Oracle是一种大型的数据库管理系统,支持海量的数据存储,并具有很强的稳定性。如果CDR系统使用Oracle,那系统会很稳定的。关键问题是初始化检查CDR进程是否存在是否重新启动记录本次事件3CDR系统是否有支持Oracle的数据库接口,CDR的最新版本同时能支持两种数据库连接。首先,在一台服务器上建立数据库,采用Oracle9i,为典型安装,建立的数据库使用缺省配置,SID是netmandb。数据库安装完成后,建立所需的用户,需要建立三个用户,CDR、PGTCDR、DWRTCDR。建立表空间,CDR系统的通话记录有三部分:域内通话(使用CDR_REC表)、域间通话(使用PGTCDR_REC表)及数据通信记录(使用DWRTCDR_REC表),出于灵活性及稳定性考虑,三部分应分别使用独立的表空间,但我市的PAS系统还没有城市之间的漫游功能,不存在域间通话记录,另外数据业务还没有对外开通,也没有数据通信记录,所以,这两部分记录使用的表可以使用USER表空间,仅建立用于保存域内通话记录的表空间。为加快数据的查询速度,对域内通话记录表建立了索引。确定表空间的大小,目前无法确定每天的通话记录数量,也就没办法估计所需表空间的大小,于是,先建立一个512M的表空间文件,待系统运行起来以后,根据实际情况再进行动态调整。具体方法:1、建立CDR_REC用的表空间CDR:SQLPLUSCREATETABLESPACECDRLOGGINGDATAFILE'F:\ORACLE\ORADATA\NETMANDB\CDR01.dbf'SIZE512MEXTENT4MANAGEMENTLOCALSEGMENTSPACEMANAGEMENTAUTO2、建立索引CDR_REC_INDEX用的表空间CDR_INDEX:SQLPLUSCREATETABLESPACECDR_INDEXLOGGINGDATAFILE'F:\ORACLE\ORADATA\NETMANDB\CDR_INDEX01.dbf'SIZE256MEXTENTMANAGEMENTLOCALSEGMENTSPACEMANAGEMENTAUTO3、建立CDR用户,分配使用CDR表空间,分配权限:SQLPLUSDropUSERCDRcascade;SQLPLUSCREATEUSERCDRPROFILEDEFAULTIDENTIFIEDBYUTSTARCOMDEFAULTTABLESPACECDRTEMPORARYTABLESPACETEMPACCOUNTUNLOCK;SQLPLUSGRANTALTERANYSNAPSHOTTOCDR;SQLPLUSGRANTALTERSESSIONTOCDR;SQLPLUSGRANTCREATEANYSNAPSHOTTOCDR;SQLPLUSGRANTCREATECLUSTERTOCDR;SQLPLUSGRANTCREATEDATABASELINKTOCDR;SQLPLUSGRANTCREATEPROCEDURETOCDR;SQLPLUSGRANTCREATESEQUENCETOCDR;SQLPLUSGRANTCREATESESSIONTOCDR;SQLPLUSGRANTCREATESYNONYMTOCDR;5SQLPLUSGRANTCREATETABLETOCDR;SQLPLUSGRANTCREATETRIGGERTOCDR;SQLPLUSGRANTCREATETYPETOCDR;SQLPLUSGRANTCREATEVIEWTOCDR;SQLPLUSGRANTUNLIMITEDTABLESPACETOCDR;4、建立PGTCDR、DWRTCDR用户分配使用USERS表空间,分配权限。5、以CDR用户登陆到数据库,建立表及索引:SQLPLUSDROPTABLEcdr_rec;SQLPLUSCREATETABLEcdr_recTABLESPACECDR(callingnumVARCHAR2(15),callednumVARCHAR2(15),setuptimeDATENOTNULL,connecttimeDATENOTNULL,answertimeDATE,disconnecttimeDATENOTNULL,remoteonhooktimeDATE,durationINTEGER,hostrtVARCHAR2(12),visitedrtVARCHAR2(12),rpcINTEGER,rpnoINTEGER,6calltypeINTEGER);SQLPLUSDROPTABLErec_count;SQLPLUSCREATETABLErec_count(totalrecordsINTEGERdefault0);SQLPLUSCREATEINDEXCDR.CDR_REC_INDEXONCDR.CDR_REC(SETUPTIME,CALLEDNUM,CALLINGNUM)TABLESPACECDR_INDEX;6、建立PGTCDR、DWRTCDR所用的表。接着,在CDR系统上安装Oracle的客户连接,并将UT提供的Oracle_ora.reg文件导入注册表,这样CDR系统就能使用Oracle数据库了。通过以上的调整,增强了CDR系统的稳定性,但是通过CDR系统进行的话务数据采集的重要功能却没有了,原因是UT提供的进行话务采集模块仅支持从mdb数据库的采集,还不支持Oracle。有什么办法解决呢?话务采集的原理是定时收集CDR数据库中的记录并进行计算,将结果导入到网管数据库中。根据原理,结合对数据库、网管的深入研究,我用WSH开发出了一个类似的工具来实现话务采集,相对于原有的工具,注重了可靠性,增加了障碍恢复功能,能够在系统7判断执行时间是否超时恢复后,自动重新完成系统停顿期间未进行的数据采集,具有Log文件检查功能,在Log文件超过100K后,将文件存档,建立新的Log文件,同时保留必要的信息。程序的流程如图:同时为了保证CDR系统的持续使用,开发了程序定时清除CDR数据库中过期的数据,代码见附录。初始化检查log文件,读取上次采集的时间段,确定本次采集的次数一次数据采集过程根据采集次数循环执行采集否是结束确定节点数逐个节点采集数据将结果结合SQL语句暂时保存在数组中将结果一次性写入网管数据库本次采集结束本次采集开始8将以上的两个程序加入到计划任务中,其中采集程序是每小时执行一次,清除程序是每天夜里执行一次。通过以上两种标本兼治的办法,大大提高了CDR系统的稳定新性,以往每过一段时间,系统就会退出,开始频繁出错,丢失大量的数据,现在这种情况很少发生,并且由于网管系统故障而引起的话务数据丢失的问题也没有出现过。9附录:CDR程序监视程序logfile=.\cdr.txt'设定log文件名psname=WLLCDR.EXEpspath=d:\monsetWshShell=WScript.CreateObject(WScript.Shell)Setfs=CreateObject(Scripting.FileSystemObject)'建立对象iffs.FileExists(logfile)=Truethen'建立log文件setflog=fs.OpenTextFile(logfile,8)'若log文件存在,则已追加方式打开,否则创建新文件elseSetflog=fs.createTextFile(logfile)flog.writelinepsname+monitorwritenbysungwendifflog.writelineIamworkingnow:+cstr(Date)++cstr(Time)WhileTrueSetoExec=WshShell.Exec(C:\ProgramFiles\SupportTools\tlist.exe-p+psname)10WScript.Sleep500DoWhileoExec.Status1WScript.Sleep500'msgbox1Loopinput=DoWhileTrueIfNotoExec.StdOut.AtEndOfStreamTheninput=input&oExec.StdOut.Read(1)ElseWScript.Sleep100exitdoEndIfLoop'msgbox2'msgboxinput+inputIfInStr(input,-1)0Then'resumethenncandlogit11'msgbox3WScript.Sleep10000flog.writelineSomethingwrongwith+psname+at+cstr(Date)++cstr(Time)returnnum=WshShell.run(pspath+\+psname+.lnk,,Ture)'msgboxreturnnum=+cstr(returnnum)DoWhilereturnnum0WScript.Sleep500'msgboxreturnnum=+cstr(returnnum)LoopWScript.Sleep10000'msgbox5flog.writelineNowitworked+cstr(Date)++cstr(Time)Else'donothingjustsleep'msgbox5'EndIf'msgbox6WScript.Sleep5000'msgbox712Wend话务采集程序'''''''''''''''''''''''''''''''''''''''''''''''''''RT话务密度的补丁程序''''''''''''''''''''''''''''''''''''''''''''''''''''CDR程序在使用MDB数据库时,随着MDB数据库的增大变得很不稳定,因此在新版中改用Oracle,这样虽然解决了稳定问题,但相应的CDRTOOL'并没有更新,造成RT话务密度数据无法采集的新问题,本补丁程序取代了CDRTOOL,解决了这个问题,同时消除了CDRTOO