異構資料庫的關聯查詢 oracle hsodbc 關聯mysql

babyyellow發表於2012-06-05
隨著我們資料庫從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部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-731986/,如需轉載,請註明出處,否則將追究法律責任。

相關文章