oracle的odbc网关(gateway)几乎提供一个无线的数据整合平台,在oracle和其它RDBMS之间,我在这不想说它的,操作,限制以及相关性,它解决了一个小问题,把它建立起来你能,例如,创建一个 database link 在oracle 和oracle之间,毕竟,这样不是很好么,例如你能运行下面的sql语句,
select o.col1, m.col1 from oracle_tab
o, mysql_tab@mysql m where o.col1=m.col1;
insert into oracle_tab (select * from
这个公示,就是要与大家分享,相同的方法KARUN 去年 已经为sql server做过了,一此关于用mysql 连接器odbc,在linux上建立oracle odbc 网关的提示。
需求:
我已在我的本本上安装好的所有的配置去测试这个功能,操作系统是Ubuntu Intrepid Ibex 32bits。我不想陷入把the MySQL Connector ODBC 5.1 安装到我机器上这样的麻烦中去,因为我告诉你,假若我说的对的话,Intrepid 还的iodbc的版本对the MySQL Connector ODBC 5.1 支持的不太好,而且返回的信息不够明确,坦白的说,我所做的就是把猴子放在Augusto’s 背上。他能很快把什么事情都整理好,我想我得感谢它两次,就因为个公告,我曾经也按照他的“Installing Oracle 11gR1 on Ubuntu 8.10 Intrepid Ibex” 文章去安装oracle 部分,现在让我们说说需求,你需要安装和配置下面的组件,
Oracle database SE1, SE or EE; 我安装是11.1.0.7 ,10g 也应该没问题 ,你可以先看看ORACLE_HOME/bin ,它里面有个dg4odbc 文件,能不能执行。
MySQL 4.1, 5.0, 5.1 or 6.0.根据文档这此都是Connector ODBC 5.1 . 支持的版本。
MySQL
Connector ODBC 5.1 . The Oracle Gateway for ODBC checks/relies on some features, such as the ODBC descriptor, that are not available in 3.51. You can check the associated documentation and bug 32692 for some details aboutSQLSetDescRec
创建一个mysql 例子数据库,用户,与表
为了这个例子我用mysql客户端,做了一个database,user 和一个叫demo的表。下面是代码:
$ mysql -uroot -p
create database demo character set latin1;
grant all privileges on demo.* to 'demo'@'localhost'
identified by 'demo' with grant option;
flush privileges;
exit;
$ mysql -udemo -pdemo -Ddemo
create table demo (
col1 integer,
col2 date,
col3 varchar(10),
col4 varchar(10) character set utf8,
col5 varbinary(10)) engine innodb;
insert into demo(col1, col2, col3, col4, col5)
values(1, cast(now() as date), '0123456789', '0123456789', '0123456789');
select * from demo /G
*********** 1. row ************
col1: 1
col2: 2009-03-11
col3: 0123456789
col4: 0123456789
col5: 0123456789
exit;
在这说明一下,odbc网关,在当数据在mysql以ftp-8的形式存储,无论是Connector/ODBC 在把数据转换到 non-utf8 字符集地方时,可能不能正确工作。因为这个原因,我把mysql数据库的默认字符集set 成latin1. 我觉得这个和ODBC driver多少有点关系,假如我在客户端用latin1,oracle不能发现任何区别,无论存储字符集是什么,而且,在oracle端还有一个限制,就是它不能用Connector 正确的操作utf-8.
创建一个odbc数据源去得到示例数据库
一旦数据库被创建,我在oracle所有者用户中,创建一个用户数据源,然后监听程序通过dg4odbc 程序得到它,默认存储用户数据源的文件是$HOME/.odbc.ini,但是你也可以把这改到任何你想要的地方,下面就是这个文件的长相,
$ cat ~oracle/.odbc.ini
[ODBC Data Sources]
demo = MySQL ODBC Driver 5.1
[demo]
Driver = /home/oracle/mysql515/lib/libmyodbc5.so
DATABASE = demo
DESCRIPTION = MySQL ODBC 5.1.5 Connector Sample
PORT = 3306
SERVER = 127.0.0.1
# UID = demo
# PWD = demo
CHARSET = latin1
TRACEFILE = /tmp/myodbc-demodsn.trc
TRACE = OFF
注意,确保这个字符集参数设置好了,这样它就不会用utf-8了。
配置 dg4odbc去用数据源
dg4odbc 得到它的配置从一个叫init[SID].ora的文件,这个文件在 $ORACLE_HOME/hs/admin下面,在这个例子中,sid是个任意的参数,然后我们将配置listener.ora(见下一部分)我们用SID=mysql,然后initmysql.ora 这个文件就配置成如下,
$ cat $ORACLE_HOME/hs/admin/initmysql.ora
#
# HS init parameters
#
HS_FDS_CONNECT_INFO=demo
HS_FDS_TRACE_LEVEL=0
HS_FDS_SHAREABLE_NAME=/home/oracle/mysql515/lib/libmyodbc5.so
HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P15
# HS_NLS_NCHAR=AL32UTF8
#
# ODBC specific environment variables
#
set ODBCINI=/home/oracle/.odbc.ini
set LD_LIBRARY_PATH=/home/oracle/mysql515/lib
#
# Environment variables required for the non-Oracle system
#
set HOME=/home/oracle
你会看到,
ODBCINI 指向odbc.ini 文件.
HS_FDS_CONNECT_INFO 指向正确的DSN.
HS_FDS_SHAREABLE_NAME points to ODBC driver shared library.
HS_LANGUAGE 也设置了,这样就能避免在Oracle MySupport 描述的问题“756186.1: Error Ora-28500 and Sqlstate I Issuing Selects From a Unicode Oracle RDBMS With Dg4odbc To Mysql”
配置监听
要配置监听我要改变 listener.ora 文件,在已有的部分上加上一个SID定义,然后再把它和odbc gateway相关联,这里有我这建立时的拷贝,我保持所有设置默认。
$ cat $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME = /u01/app/oracle/product/11.1.0/db_1)
(SID_NAME = mysql)
(PROGRAM = dg4odbc)
(ENVS ="LD_LIBRARY_PATH=/home/oracle/mysql515/lib:/usr/lib:$ORACLE_HOME/lib")
)
)
一旦监听建立起来,你就能使用与重载它,最后重启它一下。
$ lsnrctl start 命令。
然后在监听文件listener.ora中加一个实体,像下面一样,确保你增加了HS=OK ,并且它不是CONNECT_DATA 分句中,
MYSQL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)
(HOST = localhost)
(PORT = 1521)
)
)
(CONNECT_DATA =
(SID = mysql)
)
(HS = OK)
)
创建一个从oracle 到mysql的database link
在这个点上,我经过一点在不同层次的调试,我能创建一个database link 从oracel到mysql,我先连接到oracle,然后用CREATE DATABASE LINK 命令,$ sqlplus / as sysdba
create database link mysql
connect to "demo"
identified by "demo"
using 'mysql';
select "col3" from "demo"@mysql;
col3
---------------------------------
0123456789
说明一下,oracle与mysql情况不一样,你必须在表和列的名字左右加双引号。
Using the Gateway for ODBC
假如你还记得,我是把“0123456789″字串存在 col3, col4, and col5中,你将会看到一些字符集设置的问题,在查询utf-8存储的数据时,
select "col4" from "demo"@mysql;
col4
----------------------------------------
0 1 2 3 4
而有的是二进制
select "col5" from "demo"@mysql;
col5
--------------------
30313233343536373839
当然,你也能享受一些我,在你的新的oracle与mysql整合的环境中,你能用来自mysql中的数据,你的oracle中创建一个表。
create table demo as
select "col1" col1, "col2" col2, "col3" col3
from "demo"@mysql;
select * from demo;
COL1 COL2 COL3
---- --------- ----------
1 11-MAR-09 0123456789
不幸的是,你不能直接用一个插入语句,从oracle,向mysql插入数据。比如
insert into "demo"@mysql("col1").
select 2 from dual;
ERROR at line 2:
ORA-02025: all tables in the SQL statement must be at the remote database
但是你也许能用pl/sql来解决这个问题,我不说这是效率高的方法。
begin
for i in (select col1, col2, col3 from demo) loop
insert into "demo"@mysql("col1","col2", "col3")
values (2,i.col2, i.col3);
end loop;
end;
/
select "col1","col2", "col3"
from "demo"@mysql;
col1 col2 col3
---- --------- ----------
1 11-MAR-09 0123456789
2 11-MAR-09 0123456789
为了防止从oracle 连到mysql你可以把database link drop掉。
drop database link mysql;
就是这样,到现在为止它工作的很好,尽管这种方法有它的限制之处,它对那此想把数据从mysql migrate到oracle的人来说,很有用。
{注 ::翻译网上的}
http://download.csdn.net/source/2366365 这是失败过程。希望高人指点。