ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 异构数据库的关联查询 oracle hsodbc 关联mysql

异构数据库的关联查询 oracle hsodbc 关联mysql

原创 Linux操作系统 作者:babyyellow 时间:2012-06-05 17:48:38 0 删除 编辑
随着我们数据库从oracle 向mysql 迁移,一个新问题出来, 一个应用的一部分在 oracle端,一个部分在mysql端,

而一个需求又恰恰是要关联两边的表做查询,怎么做? 

一个方法,把其中一部分搬到另外一个库里去做表关联查询。 

另一个就异构数据库的关联查询了, 这里介绍下oracle 关联mysql 的配置: 

经过一天半的测试终于成功了。

首先  oracle 的异构数据库是通过gateway 来实现的, 有两种,一个是透明网关,专门针对不同的数据库有不同的软件包

一个综合网关,通吃一切。 

hsodbc 属于后者。

hsodbc 是一个32位程序,即便是在64位的oracle 安装里也是一个32位的程序,估计是oracle 不准备更新了

hsodbc 是通过odbc 来实现与异构数据库的关联的。

所以要主机上安装odbc的管理包

windows 上不用了,都有

unix / linux 下有uinxODBC 的包       

因为要跟mysql关联所以要在oracle 的主机上安装mysql的客户端驱动。 mysql-connect-odbc   

注意: 

因为hsodbc 为32位程序,所以这俩程序包要有对应的32位的程序。 否则报错。 


安装就很简单了 

查找相关的包  安装unixodbc 
1yum  search  unixODBC ;
2 
3yum install    unixODBC.i386
4 
5yum  install   unixODBC-devel.i386

安装mysql-conn-odbc  

1yum search  mysql-connect-odbc
2 
3yum install  mysql-connector-odbc.i386
4 
5yum install mysql-connector-odbc-setup.i386


这两个安装完后,

执行
1myodbc3i -a -d -t"MySQL ODBC 3.51 Driver;Driver=/usr/lib/libmyodbc3.so;Setup=/usr/lib/libmyodbc3S.so"


注册下odbc 

然后配置odbc 的DSN 

vi /etc/odbc.ini 

01[test]
02Driver      = /usr/lib/libmyodbc3.so
03DATABASE    = test
04DESCRIPTION = MySQL ODBC 3.51 Driver
05PORT        = 3306
06SERVER      = 127.0.0.1
07UID         = nagios
08PWD         = supportdb
09CHARSET     = gbk
10TRACEFILE   = /tmp/myodbc-demodsn.trc
11TRACE       = ON


说明  : 
[test]   -------dsn 的名字 

Driver      = /usr/lib/libmyodbc3.so    -------mysql-conn-odbc 的驱动

DATABASE    = test                        --------mysql 数据库的database 

DESCRIPTION = MySQL ODBC 3.51 Driver   -----------描述字符

PORT        = 3306                    ---------------mysql的端口号

SERVER      = 127.0.0.1            ----------------mysql 主机的ip 或者主机名

UID         = nagios                   ----------从oracle端登录mysql的用户名 

PWD         = passpwd              ---------------  从oracle端登录mysql的密码 

CHARSET     = gbk            -------------------字符集

TRACEFILE   = /tmp/myodbc-demodsn.trc         ------trace   文件   mysql -odbc 3.51下不起作用

TRACE       = ON                                         -----打开trac    --------mysql -odbc 3.51下不起作用 


配置  oracle 的hsodbc 


目录 $ORACLE_HOME/hs/admin/init${sid}.ora

$sid 是 我们在odbc.ini中指定odbc的dsn的名字  切记,切记
vi inittest.ora    

01# This is a sample agent init file that contains the HS parameters that are
02# needed for an ODBC Agent.
03#
04# HS init parameters
05#
06HS_FDS_CONNECT_INFO = test                        ## odbc dsn 的名字
07HS_FDS_TRACE_LEVEL = debug                         ## trace
08HS_FDS_SHAREABLE_NAME = /usr/lib/libodbc.so   ##  odbc的驱动,切记是odbc的驱动不是mysql的驱动
09 
10HS_DB_NAME=test                                            ### 数据库的名字
11#
12# ODBC specific environment variables
13#
14set DBCINI=/etc/odbc.ini            ## odbc.ini的目录
15 
16#
17# Environment variables required for the non-Oracle system
18#
19#set =                               ##相关的环境变量 ,因为hsodbc为32位代码,所以要把32的动态库放前面
20set  ORACLE_HOME=/data/oracle/product/10.2.0
21set  LD_LIBRARY_PATH=/data/oracle/product/10.2.0/lib32:/lib32:/usr/lib:/data/oracle/product/10.2.0/hs/lib32



配置完后 可以用oracle 用户执行 hsodbc 测试下,如果没有出错会报告版本号 

1hsodbc
2 
3Oracle Corporation --- Wed  May   19 2010 16:42:32.130
4Heterogeneous Agent Release 10.2.0.4.0 - Production  Built with
5   Driver for ODBC



现在配置oracle的listener 监听 

在 $ORACLE_HOME/network/admin/listener.ora中增加一个监听记录

       (SID_DESC=
          (SID_NAME=test)
          (ORACLE_HOME=/data/oracle/product/10.2.0)
          (PROGRAM=hsodbc)
          (ENVS=LD_LIBRARY_PATH=/data/oracle/product/10.2.0/lib32:/data/oracle/product/10.2.0/hs/lib32:/lib32)
        )

sid_name 是odbc dsn 的名字

program 是 hsodbc 

ENVS 则是指定的相关的环境变量

可以参考 $ORACLE_HOME/hs/admin/listener.ora.example 


在在$ORACLE_HOME/network/admin/tnsnames.ora 中增加一个条目: 

test  =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST= 192.168.74.9)(PORT=1521))
    (CONNECT_DATA=
        (SID=test)
    )
    (HS = OK )
  )

注意 :
test  是我们制定的odb dsn 的名字

( HS=OK) 一定要放在 (CONNECT_DATA 的外面 ,否则会报错,无法连接 



然后重启listener  

1lsnrctl  stop
2  
3lsnrctl start



好了,基本的配置就差不多了

我们在数据库里建一个db link  测试下吧

1create public database link  t
2connect to "nagios" identified by "passwd"
3using 'test';


注意  用户名和密码一定要用双引号(”) 引起来,因为mysql 里是大小写敏感的。


先做个测试数据 

01isql -v test
02[MYODBCUtilReadDataSource.c][243][ERROR] Unknown attribute (TRACEFILE).
03[MYODBCUtilReadDataSource.c][243][ERROR] Unknown attribute (TRACE).
04+---------------------------------------+
05| Connected!                            |
06|                                       |
07| sql-statement                         |
08| help [tablename]                      |
09| quit                                  |
10|                                       |
11+---------------------------------------+
12SQL> insert into t values (1) ;
13SQLRowCount returns 1
14SQL> commit;
15SQLRowCount returns 0
16SQL> select * from t;
17+-----------+
18| id        |
19+-----------+
20| 1         |
21+-----------+
22SQLRowCount returns 1
231 rows fetched
24SQL>


然后在oracle 端看看吧 
01[oracle@test740_9 ~]$ sqlplus / as sysdba ;
02SQL*Plus: Release 10.2.0.4.0 - Production on D??úèy 5?? 19 16:57:12 2010
03Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
04 
05Connected to:
06Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
07With the Partitioning, OLAP, Data Mining and Real Application Testing options
08  
09SQL> select * from "t"@t;
10        id
11----------
12         1
13SQL>


注意因为mysql是case sensitive 所以要用双引号把表明,字段名括起来,或者mysql端设置参数 lower_case_table_names=1

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/133735/viewspace-731986/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
oracle MySQL Postgresql 专职数据库dba。 系统架构师。 mysql 官方认知dba 。 15年专职dba 经验。 潜意识沟通实证者 心理咨询师。 禅修布道者, 禅修指导员。 禅定实证者。

注册时间:2010-12-02

  • 博文量
    367
  • 访问量
    1908829