随着我们数据库从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
3 |
yum install unixODBC.i386 |
5 |
yum install unixODBC-devel.i386 |
安装mysql-conn-odbc
1 |
yum search mysql-connect-odbc |
3 |
yum install mysql-connector-odbc.i386 |
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
02 |
Driver = /usr/lib/libmyodbc3.so |
04 |
DESCRIPTION = MySQL ODBC 3.51 Driver |
10 |
TRACEFILE = /tmp/myodbc-demodsn.trc |
说明 :
[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. |
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的驱动 |
10 |
HS_DB_NAME=test ### 数据库的名字 |
12 |
# ODBC specific environment variables |
14 |
set DBCINI=/etc/odbc.ini ## odbc.ini的目录 |
17 |
# Environment variables required for the non-Oracle system |
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 测试下,如果没有出错会报告版本号
3 |
Oracle Corporation --- Wed May 19 2010 16:42:32.130 |
4 |
Heterogeneous Agent Release 10.2.0.4.0 - Production Built with |
现在配置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
好了,基本的配置就差不多了
我们在数据库里建一个db link 测试下吧
1 |
create public database link t |
2 |
connect to "nagios" identified by "passwd" |
注意 用户名和密码一定要用双引号(”) 引起来,因为mysql 里是大小写敏感的。
先做个测试数据
02 |
[MYODBCUtilReadDataSource.c][243][ERROR] Unknown attribute (TRACEFILE). |
03 |
[MYODBCUtilReadDataSource.c][243][ERROR] Unknown attribute (TRACE). |
04 |
+---------------------------------------+ |
11 |
+---------------------------------------+ |
12 |
SQL> insert into t values (1) ; |
然后在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. |
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 |
09 |
SQL> select * from "t"@t; |
注意因为mysql是case sensitive 所以要用双引号把表明,字段名括起来,或者mysql端设置参数 lower_case_table_names=1
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133735/viewspace-731986/,如需转载,请注明出处,否则将追究法律责任。