异构数据库访问
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle异构服务(Heterogeneous Service,HS)
代学俊
南京高泰科技有限公司南京 210009
【摘要】:异构数据库之间的数据访问,是有一定难度的。
该文探讨异构数据库之间的数据访问方案,并分别祥细论述通过使用ORACLE 公司提供的普通连接(Generic Connectivity)和透明网关技术来实现ORACLE数据库与SQLSERVER数据库间的数据访问。
【关键词】:异构数据库;普通连接(Generic Connectivity);透明网关
一、引言
数据库技术讯速发展的今天,面对很多企业使用不至一种数据库软件。
例如保险公司,总公司因业务量庞大,因而使用大型数据库来存储数据,如Oracle、Db2等,而各地的分支公司也都有自已的数据库系统,如:Informix、Sqlserver 等。
总公司需要实现和各个分支公司的数据实现互联互通,能够调用各个分支公司的数据库。
这就涉及异构数据库系统之间的数据共享问题,如何在这些异构数据库系统之间实现数据的共享呢?
二、Oracle HS (Heterogeneous Services)深入解析及协同Gateway工作流程
在企业里,通常可能有多种数据源,并且他们是异构的。
所谓的异构就是说他们是不同的产品,例如: Oracle Database, MS SQL Server, IBM DB2, Sybase ASE, MySQL, Postgre SQL, Excel, XML, Txt或者CSV等用于存放数据的产品或者文件。
那么假设我们需要这些异构的数据源同Oracle Database做交互,那么我们应该如何做呢?首先来看看Oracle 数据库如何同异构数据源作数据交互。
图1
上图是一张Oracle 异构连接处理的架构图,其中我们可以看到主要的非数据源模块包括有HS(Heterogeneous Service), Agent. 还有一个远程数据库,我们假设它是异构的数据源。
可以看到,Oracle是不能直接同这些异构数据源作交互. Oracle是需要通过Heterogeneous Services协同Agent才能和异构数据源作数据交互。
2.1、异构服务HS
异构服务HS是Oracle Database的一个组件,它用于同Non-Oracle System 作数据交互。
HS的作用:它告诉Agent它要同异构数据源作交互,并且让他知道,它要什么数据,什么样的数据,如何处理数据(如类型,方法等)
2.2、HS模块
HS主要包含事务服务和结构化查询语言服务两个模块:
2.2.1、事务服务(Transaction Service)
Transaction Service使异构数据源尽可能的集成进Oracle数据库服务器里的事务和会话中。
所以当你访问一个异构数据源的时候,你使用Oracle 用户当前的会话来通过数据库连接(Database Link)在异构数据源建立相应的认证会话(访问异构数据源的认证信息由用户提供或者Database Link已经指定)。
同样,当用户关闭了当前Oracle的Session(会话),那么异构数据源上的相应会话也随之关闭。
Oracle 另外支持Oracle分布式的访问异构数据源的事务。
2.2.2、结构化查询语言服务服务(SQL Service)
SQL Service用于处理所有的SQL相关的操作,包括有:
1)使Oracle内部SQL相关的调用映射成 HS 驱动的API. 这些会一次被驱动映射到异构数据源的客户端API.
2)翻译SQL语句。
把Oracle的SQL语句翻译成相关的异构数据源的SQL
语句。
3)翻译通过引用Oracle data dictionary的相关表的查询语句,使之变成可以从异构数据源的data dictionary里获取所需信息的查询语句
4)转换异构数据源和Oracle数据库之间的数据类型
5)弥补在异构数据源中不存在的函数方法等,使之变成多条产需语句来获取相应的结果。
2.3、HS配置信息
HS的组件里有很多常见的编码,并且它被配置用于同很多不同的异构数据源一起协同工作。
每个gateway都有这些配置信息,并且存在在相应的驱动模块中(Driver module). 这些信息会在HS和Gateway/Agent的连接建立后马上被上传到Oracle服务器。
这些配置信息包括有:
2.3.1、Data Dictionary Translation Views
数据字典转换视图是以视图的方式存在于异构数据源的数据字典表里。
它帮助HS像引用Oracle的Data dictionary表一样来饮用异构数据源的数据字典。
2.3.2、Heterogeneous Services Initialization Parameters
HS初始化参数主要提供两个方面的功能:
1)提供一个良好的调节gateway的手段,使gateway和HS组件的性能和内存的使用得到优化。
2)配置异构数据源的信息. 例如配置了多少个异构数据源,它们都运行了什么语言,都有哪些属性。
相关当前会话的这些参数的设置信息,我们可以通过查询表V$HS_PARAMETER来得到。
可以在gateway的初始化文件里进行设置更改。
2.3.3、Capabilities
功能性就是告诉HS异构数据源中有哪些类型的SQL语句不支持,如何转换映射这些SQL表达式到异构数据源里。
2.4、HS Data Dictionary
上面我们提到,配置信息。
配置信息会在HS和Agent建立连接后,马上被Agent上传到HS 组件。
那么上传后,它们都被存储与HS Data Dictionary表中。
并且直到Agent的变化,这些信息才会被相应的覆盖,修改。
下面我们讲解下这些Data Dictionary的相关信息,使用HS可以从同一个Oracle数据库访问多个异构数据源,如下图所示:
图2
两个Agent都会把配置信息上传上去,各自存在到HS Data Dictionary table中。
那么这些信息是怎么归纳起来的?HS把这些信息按两个层次来分:
2.4.1、Class
Class 是按照相关类型的产品来分。
例如Sybase database systems, SQL Server databases system各分到一类里面。
2.4.2、Instance
实例是基于class来定义的。
例如SQL Server数据库这个class里面有多个实例。
所以一个class被多个特定的instance所共享。
所以假设oracle数据
库要访问5个SQL Server的实例和2个MySQL的实例,那么Oracle数据库就需要两个class定义来访问他们。
一个用于定义SQL Server,一个用于定义MySQL.同样,在这两个class中分别定义了5个和2个instance的定义。
同时这里需要注意,instance 层的容量和数据字典的信息都是会话信息,所以它们不能存在在oracle数据库中的HS数据字典中。
但是,instance的初始化参数可以存在在数据库中。
在HS的数据字典视图(Data Dictionary views)中都包含了一下信息:
1)被上传到Oracle data dictionary的instances和classes的名称
2)功能性,包括为每个class和instance定义的SQL 事务
3)为每个class和instance定义的数据字典转化关系
4)为每个class和instance定义的初始化参数
这些视图又主要被分成三大类:
1)常规视图
2)Transaction Service 视图
3)SQL Service 视图
2.5、Agent Component
Agent Component包括Agent Generic Code和Driver
Agent Generic Code用于在异构数据源上执行数据操作或者检索.它负责接收命令,执行命令,获取执行结果。
Driver是Agent Generic Code和命令执行地交互的桥梁。
没有它,Agent Generic Code就不能和异构数据源交互。
Agent Generic Code好比一个要到河对岸办事的人,Driver就好比到对岸的交通工具,例如桥。
Agent可以和异构数据源安装在同一台计算机上,可以同Oracle安装在同一台计算机上,它可以同Oracle和异构数据源都分离开而安装在单独的一台计算机上。
2.6、Oracle Agent
Oracle 为Agent提供了很多类型,因为不同的数据库厂商所使用的标准不一样,这些Agent通过Oracle产品主要封装在以下两种产品中:
2.6.1、Oracle Database
在Oracle Database中,默认安装的是ODBC Agent.用于同当前系统的ODBC 来做交互。
从而由系统来负责Driver. 相应的Agent Generic Code是
dg4odbc.exe ,这个程序可以在ORACLE_HOME/bin目录下找到。
2.6.2、Oracle Transparent Gateway
Oracle透明网关(Transparent Gateway) ,它是包含在Oracle数据库中的一个模块,用来访问其它非Oracle数据库。
透明网关的功能较强,它通过代理进程从Oracle Server访问各地的异构分布式数据库,而提供给用户的感觉是这些数据库仍然是Oracle数据库,Oracle公司提供对大多数商业数据库的透明网关。
通用连接则有较多限制,它使用用户自己提供的ODBC或OLE DB驱动程序作为异构服务的代理驱动,并且要求这些驱动必须要安装在Oracle Server的$ORACLE_HOME目录下。
关于透明网关的注意事项:
1) Oracle For SQL Server的透明网关在UNIX下无法实现,目前只支持WIN;原因很简单,SQL Server本身不支持UNIX,所以Oracle也无法直接在UNIX下访问SQL Server。
因此网关程序tg4msql仅包含在Oracle Database for windows中。
2) Oracle For其它数据库的透明网关,如SYBASE等有UNIX本版本的数据库在UNIX可以实现。
3) Oracle透明网关软件在Oracle 8i时是需要花钱另买的,大约1万$;到Oracle 9i时是作为数据库的一个组件免费发布的。
安装时在组件种选择即可。
4) 针对我们的实际应用,如果有需要实现Oracle 到SQL Server的互连,我们需要另外用一台WIN下的Oracle 9i来做透明网关服务器,其它UNIX下的Oracle通过这个透明网关来访问SQL Server。
5) 不同数据库间的数据处理需使用标准SQL来实现。
6) 各数据库中特殊的数据类型,需要在程序中实现转换,应尽量避免使用无法转换的数据类型。
2.7、HS和Gateway工作原理
我们来整体看一下HS和Gateway是如何系统工作的:
图3
(1)客户端从Oracle Database请求数据。
用户发送的是Oracle标准的SQL 语句,在Oracle数据库上创建了一个Session。
(2)HS和Gateway协同工作,HS把Oracle的SQL语句转换成non-Oracle 数据库可以正确运行的语句。
a)HS和Gateway建立连接
b)HS获取相关的non-Oracle System的配置信息,如它是什么类型的数据库产品(SQL Server或者MySql , Sybase)等等属性
c)HS通过Data Dictionary View来识别该non-Oracle system的功能特征等各项属性,相应的转化Oracle标准的SQL语句成non-Oracle system兼容的语句
(3)Oracle数据库把转换后的SQL语句通过Oracle Net发送到Gateway。
(4)Gateway使用相关的用户名密码登陆到non-Oracle system,建立连接,执行SQL语句。
a) HS通过Gateway与Non-Oracle System建立连接,创建临时的Database Link.
b) Gateway使用Database Link指定的用户名及其密码登陆non-Oracle system
c) Gateway登陆成功则创建Gateway与non-Oracle System之间的会话,并且Database Link Open
d) Gateway把SQL语句通过建立的会话发送给non-oracle system执行
(5) Non-Oracle System返回运行SQL语句后的结果给Gateway。
(6) Gateway翻译/格式化返回的结果使其能被Oracle数据库的所兼容。
(7)把Gateway执行后的结果通过Oracle Net Service返回给Oracle数据库。
(8) Oracle数据库服务器通过Oracle Net把结果返回给客户端。
并且数据库的database link一直打开这,直到gateway的会话结束或者database link 显式的关闭它。
在上述步骤中,第(2)步,Gateway通过本地的配置来调用相关的HS服务程序和驱动与异构数据源作交互。
例如:
1)在配置initXXX.ora的时候,里面填写的主要是异构数据源的Address 信息,如主机名称/地址,端口,实例名称,数据库等等信息。
2)在配置listener.ora的时候,里面就记录了需要使用什么Agent Generic Code程序,需要通过什么使用到驱动。
比如访问MS SQL Server,需要用到的Agent Generic Code程序是dg4msql, 驱动在
Oracle_Gateway_Home\dg4msql\driver\lib文件夹下。
(如果Gateway安装在Windows下,默认不需要指定Driver的路径)
三、异构数据访问具体实现过程
由于数据库系统的类型不同,异构数据库间的数据访问方式也不尽相同。
本文着重讨论通过ORACLE公司提供的,普通连接(Generic Connectivity)和透明网关技术,来实现异构数据库间的访问。
3.1、普通连接(Generic Connectivity)的实现方法
◆测试环境:
Oracle数据库服务器
主机:192.168.1.210
操作系统: Red Hat Enterprise Linux Server release 5.5
数据库版本: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 For linux
普通连接(Generic Connectivity) ODBC服务器
主机:192.168.1.98
操作系统:win2003
数据库版本: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 For windows
SQL Server数据库服务器
主机:192.168.1.100
操作系统: winxp sp3
数据库版本:SQL Server 2008 sp2
◆配置到SQL Server 2008的普通连接
点添加
选择SQL Server,点完成
填写数据源名称并选择连接的数据库,点下一步
选择SQL Server验证,如上填写登录数据库的用户名及密码。
点下一步
如上选择连接的默认数据库,点下一步
如上选择语言为Simplified Chinese,点完成
点测试数据源对创建的数据源来进行测试。
点确定
点确定,完成数据源的创建。
创建参数文件
需要在$ORACLE_HOME\hs\admin目录下创建initsql2008.ora文件如下:
HS_FDS_CONNECT_INFO = sql2008
HS_FDS_TRACE_LEVEL = OFF
配置监听
在$ORACLE_HOME\network\admin目录下的listener.ora文件中加入下面的内容(SID_DESC =
(PROGRAM = hsodbc)
(SID_NAME = sql2008)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
)
配置tnsnames.ora文件如下:
创建DB LINK
Linux平台
Linux平台的oracle DB LINK是之前做Oracle Gateway测试时已创建好的,直接执行查询报错如下
查找原因发现是因为我创建的数据源是用户DSN
改建为系统DSN后解决了故障,查询正常了
Windows平台
执行查询时报错如下:
删除DB LINK并重建后成功执行查询,如下
测试select
测试insert
测试update
3.2、透明网关(Transparent Gateway)实现方法
测试环境:
Oracle数据库服务器
主机:192.168.1.210
操作系统: Red Hat Enterprise Linux Server release 5.5
数据库版本: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 For linux
透明网关(Transparent Gateway)服务器
主机:192.168.1.198
操作系统: Red Hat Enterprise Linux Server release 5.4
Oracle Gateway版本: Oracle Database Gateway 11.2.0.1.0 For linux SQL Server数据库服务器
主机:192.168.1.100
操作系统: winxp sp3
数据库版本:SQL Server 2008 sp2
配置到SQL Server 2008的透明网关连接
1、安装gateway
从下载gateways安装包linux_11gR2_gateways.zip
解压linux_11gR2_gateways.zip后会生成gateways目录,进入gateways目录,执行runInstaller
点Next
点Next
选择上面两个组件,点Next
填写sql server数据库主机的主机名或IP地址,及sql server database server port number,以及instance name和database name,完成后点Next继续
点Install开始安装
安装完成后如下,需要打开终端窗口,执行root.sh脚本
打开终端窗口,以root用户执行列表中的脚本
脚本执行完成后返回安装界面,点OK后开始配置监听
点Next继续
点Next继续
点Next继续
点Next继续
点Next继续
点Next继续
点Next继续
点Finish完成监听配置
点Exit退出安装
点Yes退出安装界面
注意:仅当我们第一次配置Oracle Database Gateway才需要配置Listener。
如果你已经配置过Listener,就可以不需要再额外配置一个Listener了.
安装完成后,如果你只是安装了Gateway for Microsoft SQL Server,那么在Gateway的根目录里可以看到一个文件夹叫dg4msql的,里面有相关的配置。
而且需要注意的是,这些配置信息就是相关SQL Server交互所需要的信息。
如果你要修改访问MS SQL Server的数据库,服务器地址等信息,需要修改ORACLE_HOME/dg4msql文件下的配置文件。
因为Gateway默认到这个这个文件夹下查找MS SQL Server的配置信息
配置gateway for sqlserver
1、在/u01/app/gateway/dg4msql/admin目录下:
[oracle@redhat5 admin]$ vi initdg4msql.ora
2、配置dg4msql监听
在/u01/app/gateway/dg4msql/admin目录下:
[oracle@redhat5 admin]$vi listener.ora
3、在/u01/app/gateway/network/admin目录下: [oracle@redhat5 admin]$vi listener.ora
4、在/u01/app/gateway/network/admin目录下:
[oracle@redhat5 admin]$vi tnsnames.ora
5、lsnrctl stop
lsnrctl start
sqlplus / as sysdba报错TNS-12541,从mos上找到如下解决方案
点下拉列表
从下拉列表中选择SQL Server Gateway
点OK后如下:
填写信息如下
点create configuration files,完成配置文件的创建。
关闭配置文件创建向导
配置文件有
查询相关语句后报ORA-28545:Error Diagnosed By Net8 When Connecting To An Agent
解决方式如下:
将gateway的listener换个端口号:listener内容编辑如下:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT =1523))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = d:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = EF2KWEB)
(ORACLE_HOME = d:\oracle\product\11.2.0\tg_1)
(PROGRAM = dg4msql)
)
)
tnsnames.ora中的服务端口号也改掉
EF2KWEB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.19.128.55)(PORT = 1523)) )
(CONNECT_DATA =
(SID = ef2kweb)
)
(HS = OK)
执行相关查询语句后报错ORA-28500
create public database link sql2008 connect to "sa" identified by "daixuej771208" using 'sql2008';
改为如下重建DB LINK后,报错依旧
create public database link sql2008 connect to sa identified by daixuej771208 using 'sql2008';
仔细分析上面的报错认为错误出在去登录sql server DB的时侯,更改
HS_FDS_CONNECT_INFO=192.168.1.100:1433//oragateway为:
HS_FDS_CONNECT_INFO=192.168.1.100//oragateway后查询成功。
如上图中,中文字段不显示
[oracle@primarydb ~]$export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
检查终端的字符设置如下
改为
再执行查询显示正常
执行insert来测试如下
测试where
测试update
四、结束语
ORACLE数据库通过透明网关技术,不单单可以访问SQLSERVER数据库,还可以访问如DB2、MYSQL、SYBASE、INFORMIX等主流数据库。
参考文献:
【1】张晓明. Oracle DBA突击:帮你赢得一份DBA职位[M].北京:人民邮电出版社.
【2】陈吉平.构建Oracle高可用环境[M].北京:电子工业出版社.
【3】Oracle官方联机文档
41 / 41。