任旭升
(陕西法士特集团信息中心,陕西 西安 710077)
基于DBLINK的系统集成问题解析
任旭升
(陕西法士特集团信息中心,陕西 西安 710077)
通过作者在多个系统集成项目中的实际经历,总结并梳理了在基于ORACLE数据库的底层数据同步过程对DBLINK的使用中所遇到的问题,剖析了原因,并给出了具体的解决方法,对于有类似多数据库集成工作场景的从业人员,具有一定的借鉴和指导意义。
数据库;ORACLE;DATABASE LINK
随着企业信息化进程的进一步加快,IT系统的建设从前期单一的系统处理模式开始向多个应用系统的集成进行转变,从一个个独立的信息系统单独处理业务问题,转变为多个系统协同处理问题,这就使得业务逻辑设计和数据共享成为必须要面对的工作,在处理数据共享的环节中,对于数据的流动往往通过建立中间库接口表的方式进行处理,而在这一过程中,基本的技术手段就是通过建立数据库链接来进行实现。在笔者所经历的几个ORACLE数据库集成项目之中,这一模式已得到了较好的使用,下文将对实现过程和实际过程当中所出现的各种问题做一阐述。
2.1概念定义
Database Link是建立本地数据库到远程数据库的路径的一种数据库对象,简写为DBLINK,通过此对象可以实现对远程数据库上对象的各种操作,实现了将多个ORACLE数据库逻辑成为一个数据库的功能,而这一过程,通过建立同义词对象,可以使得用户使用更加透明。
2.2创建方法
在创建一个dblink之前,首先需要在tnsnames.ora中建立一个对应远程数据库的服务连接字符串,并且需要远程数据库上所要连接的schema和口令。创建的基本语法为:Create database link dblink_name connect to schema identified by password using ‘service_str’;其中service_str为到远程数据库的连接字符串[1]。
3.1连接案例
在本案例中,本地数据库为某企业ERP数据库,数据库名为WZZ,主机名为srmtest2;远程数据库为企业WMS数据库,数据库为orcl,主机名为wms业务实现需要将WMS的数据传递到ERP数据库中,由系统并发处理程序进行处理,然后将处理结果返回给WMS数据库。
3.2异常处理
◆ 异常一:当存储过程或函数通过 dblink对远程数据库表进行更改操作时(例如以下语句):
UPDATE wms_receivings_int@fstdbSET request_id=fnd_global.conc_request_id WHERE id=data_rec.id;
系统会抛出错误ORA-02069:global_names parameter must be set to TRUE for this operation。此问题产生的根本原因是在执行update时使用到了本地函数fnd_global,而此函数在远端数据库是不存在的。因此解决问题的一个途径就是在远端数据库创建这个函数。但大多数情况下,在远端数据库创建对象的条件难以满足,需要采取其它更为有效方法来规避这样的问题。这里根据错误提示设置global_names参数为true,此参数设置后,要求创建的dblink的名称必须和远端数据库的global_name一致(select global_name from global_name);如果创建dblink时没有指定目标数据库的domain部分,系统自动会将本地domain部分添加给dblink,当然可以通过修改当前数据库与远端数据库为相同domain,创建时就可以省略掉domain部分。本例中根据参数规则,创建出名为orcl.wms.com的dblink。
◆ 异常二:当设置完global_names参数,创建好新的dblink后,继续执行update语句时,系统又抛出另外一个错误:
ORA-04054: database link WZZ.SRTEST2.COM does not exist
ORA-02063: preceding line from ORCL.WMS.COM
根据错误提示,可知是WZZ.SRTEST2.COM这个dblink不存在,而此名称恰为本地数据库的global_name,根据global_names为true时的规则,此名称应对应远端数据库的dblink,再联想到存储过程在两端数据库上的双向操作,因此判断需要在远端数据库上再建立一个名为WZZ.SRTEST2.COM的dblink,当创建完成后,update恢复正常。
◆ 异常三:dblink的删除异常;当删除dblink时系统抛出错误:ORA-02024: database link not found。通过dba_objects确认这是个数据库中确实存在的dblink对象,也确认对
象的名称没有错误,但无论如何就是不能删除。经分析原因,大致是在global_names为false的情况下,使用者对global_name进行了修改,因而在此修改之前创建的dblink在删除操作时就会出现错误。并且当global_name 发生改变后,已经存在的dblink也无法删除。这时如果仅通过alter命令,让global_name 还原成旧值的然后执行删除的操作是无效的。此时有效的解决方法,就是用sys用户来修改props$表:update props$ set value$ = ′
在数据库的日常运维工作中,会遇到种种因设置不当或因对规则不清而引发的错误异常,因此在学习和工作过程中,要善于归类,勤于总结,才能很好的避免问题的发生和有效的解决发生的问题。
[1]Oracle Database 11g Administration[DB].ORACLE公司,2010.
[2]Oracle Database Concepts Release 11g[DB].ORACLE公司,2011.
Analysis of System Integration Based on DBLINK
Ren Xusheng
(ITDepartmentofShaanxiFastGearCo.,Ltd.,Xi’anShaanxi710077,China)
This article summarizes some useful experiences for the database integration using the Oracle database link object, provides a convenient library of knowledge with the experience of multiple integrate databases for the relative people.
oracle; database; database link
2016-04-20
任旭升(1982- ),男,陕西西安人,工程师,本科学历,研究方向:数据库技术在制造行业的应用。
1674- 4578(2016)04- 0025- 01
TP315
A