oracle odbc mysql_怎么从oracle通过odbc 和sql得到mysql

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 这是失败过程。希望高人指点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值