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

随着我们数据库从oracle 向mysql 迁移,一个新问题出来, 一个应用的一部分在 oracle端,一个部分在mysql端,

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

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

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

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

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

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

hsodbc 属于后者。

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

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

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

windows 上不用了,都有

unix / linux 下有uinxODBC 的包      www.unixodbc.org  

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

注意: 

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


安装就很简单了 

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

安装mysql-conn-odbc  

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


这两个安装完后,

执行
1 myodbc3i -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]
02 Driver      = /usr/lib/libmyodbc3.so
03 DATABASE    = test
04 DESCRIPTION = MySQL ODBC 3.51 Driver
05 PORT        = 3306
06 SERVER      = 127.0.0.1
07 UID         = nagios
08 PWD         = supportdb
09 CHARSET     = gbk
10 TRACEFILE   = /tmp/myodbc-demodsn.trc
11 TRACE       = 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 #
06 HS_FDS_CONNECT_INFO = test                        ## odbc dsn 的名字
07 HS_FDS_TRACE_LEVEL = debug                         ## trace
08 HS_FDS_SHAREABLE_NAME = /usr/lib/libodbc.so   ##  odbc的驱动,切记是odbc的驱动不是mysql的驱动
09  
10 HS_DB_NAME=test                                            ### 数据库的名字
11 #
12 # ODBC specific environment variables
13 #
14 set DBCINI=/etc/odbc.ini            ## odbc.ini的目录
15  
16 #
17 # Environment variables required for the non-Oracle system
18 #
19 #set =                               ##相关的环境变量 ,因为hsodbc为32位代码,所以要把32的动态库放前面
20 set  ORACLE_HOME=/data/oracle/product/10.2.0
21 set  LD_LIBRARY_PATH=/data/oracle/product/10.2.0/lib32:/lib32:/usr/lib:/data/oracle/product/10.2.0/hs/lib32



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

1 hsodbc
2  
3 Oracle Corporation --- Wed  May   19 2010 16:42:32.130
4 Heterogeneous 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  

1 lsnrctl  stop
2   
3 lsnrctl start



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

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

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


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


先做个测试数据 

01 isql -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 +---------------------------------------+
12 SQL> insert into t values (1) ;
13 SQLRowCount returns 1
14 SQL> commit;
15 SQLRowCount returns 0
16 SQL> select * from t;
17 +-----------+
18 | id        |
19 +-----------+
20 | 1         |
21 +-----------+
22 SQLRowCount returns 1
23 1 rows fetched
24 SQL>


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


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

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

转载于:http://blog.itpub.net/133735/viewspace-731986/

你可能感兴趣的:(异构数据库的关联查询 oracle hsodbc 关联mysql)