ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle与mysql的连通

oracle与mysql的连通

原创 Linux操作系统 作者:vs_mlf 时间:2013-07-31 09:50:51 0 删除 编辑

原理:
Oracle数据网关,就像一个桥梁,贯通oracle数据库和non-oracle数据库。在配置过程中,我们经常讲到的三个重要文件:第一、tnsnames.ora;第二、lisener.ora;第三、init.ora。他们是如何工作呢?
比如对一个连接数据库的查询,select * from “tablename”@linkdbname;oracle首先从linkdbname开始,通过dba_db_links表查到建表时所属于的tnsname;然后在tnsnames.ora中找到tnsname对应的sid;
接着在lisener.ora中找该SID所对应的应用程序PROGRAM(如:PROGRAM=dg4msql或PROGRAM=dg4odbc),而且这个程序到哪找,就要注明oracle_home(ORACLE_HOME=/opt/oracle/product/gw);找到
程序之后,oracle会在程序所在目录的admin子目录下找到init.ora文件,读取里面的连接信息;然后通过连接信息与non-oracle数据库通信。因为只有明白这个原理,下面的配置就简单多了

连接的过程:oracle——dg4odbc——odbc——mysql,现在oracle——dg4odbc是监听到了,odbc——mysql也成功了,那现在的问题很有可能是出现在dg4odbc——odbc里,而事实上,报错的地方也确实
是在init.ora(这个文件就是dg4odbc——odbc的中介)


create database link mysql connect to "demo"  identified by "demo" using 'mytest';
select "col3" from "demo"@mysql;
安装过程详解:

1. 安装mysql client or my server .安装完成后,确认可以连接mysql 数据库。

rpm –ivh MySQL-shared-community-5.1.38-0.rhel5.x86_64.rpm

rpm –ivh MySQL-devel-community-5.1.38-0.rhel5.x86_64.rpm

rpm –ivh MySQL-client-community-5.1.38-0.rhel5.x86_64.rpm


确认:mysql -h 123.196.125.7  –uroot –pqcmysql dem
   mysql -udem -p -h 123.196.125.7 dem


2. 安装unxiodbc
gunzip unixODBC-2.2.14-p1.tar.gz

tar –xvf unixODBC-2.2.14-p1.tar

cd unixODBC-2.2.14-p1

export CFLAGS="-DBUILD_REAL_64_BIT_MODE"
# ./configure --enable-gui=no (因没有安装qt 包,所以需要添加--enable-gui=no 参数)

make

make install

3 . 编译mysql-connector-odbc ????????????????????????????????????????????配置yum
yum install mysql-connector-odbc   Ver:3.51.26
4 . 编辑odbc.ini

在unixodbc 的安装目录下(默认为/usr/local) ,进入etc/, 编辑odbc.ini 文件
vi /usr/local/etc/odbc.ini
[ODBC Data Sources]
mysql = MySQL ODBC Driver 2.2.14
[mysql]   
DRIVER      = /usr/lib64/libodbc.so
DATABASE    = dem
DESCRIPTION = MySQL ODBC 5.1.5 Connector Sample
PORT        = 3306
SERVER      = 123.196.125.7
#UID         = root
#PWD         = qcmysql
CHARSET     = lattin1
TRACEFILE   = /tmp/odbc-demodsn.trc
TRACE       = debug

     ##建立odbc 源。例如:该odbc 源的名称为myodbc3
vi /home/oracle/.odbc.ini
[ODBC Data Sources]
#mysql = MySQL ODBC Driver 5.1
mysql = MySQL ODBC Driver 2.2.14
[mysql]          ------->> mysql 为dsn
DRIVER      = /usr/lib64/libmyodbc5.so       11g用的是libmyodbc5.so
DATABASE    = dem
DESCRIPTION = MySQL ODBC 5.1.5 Connector
PORT        = 3306
SERVER      = 123.196.125.7
UID         = dem
PWD         = dem
#UID         = root
#PWD         = qcmysql
CHARSET     = latin1
TRACEFILE   = /tmp/odbc-demodsn.trc
TRACE       = off

###CHARSET = gbk

确保linux的odbc已经与mysql数据库连通后,测试语句是:isql 例如:oracle@qc002 admin]$ isql -v mysql
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+--------------------------------------
5 .配置hs
$ORACLE_HOME/hs/admin/initmysql.ora     mysql 为ORACLE_SID=mysql
建立initmysql.ora 文件,内容如下:

HS_FDS_CONNECT_INFO=mysql
HS_FDS_TRACE_LEVEL = debug    当为'debug'时,用于检查报错,在$ORACLE_HOME/hs/log/下;  成功后最好设置为off;
HS_FDS_TRACE_LEVEL=255
HS_FDS_SHAREABLE_NAME ="libodbc.so"
set LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64:/u01/app/oracle/product/11.1.0.6     指定lib库oracle要有访问权限;
HS_FDS_QUOTE_IDENTIFIER="`"           告诉odbc忽略掉‘
HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P15
set DBCINI=/home/oracle/.odbc.ini
set ORACLE_HOME=/u01/app/oracle/product/11.1.0.6
set HOME=/home/oracle

6.在listener.ora添加
  (SID_DESC =
        (ORACLE_HOME = /u01/app/oracle/product/11.1.0.6)
        (SID_NAME = mysql)
        (PROGRAM = dg4odbc)
        (ENVS = LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64:/u01/app/oracle/product/11.1.0.6)


7. 添加/u01/app/oracle/product/11.1.0.6/network/admin/tnsname.ora

向tnsnames.ora 添加

mysql =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 123.196.125.7)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = mysql)
    )
    (HS = OK)
  )

8.

CREATE USER 'dem'@'123.196.125.7%' IDENTIFIED BY 'dem';   mysql判断用户是用户名加主机地址来校验的

create database dem character set latin1;
grant all privileges on dem.* to 'dem'@'123.196.125.7'identified by 'dem' with grant option;
flush privileges;

create public database link mysql connect to "dem"  identified by "dem" using 'mysql';    为tnsname.ora里的mysql
select "col3" from "dem"@mysql;   

说明一下,我的这个问题,是由于oracle在database link中需要使用双引号作为字段和表名的标识,而在mysql中,却是不允许的(果然是个bug)。结果造成了查询时出问题。
不信,可以在mysql中是双引号括住字段或表名,看有没有出错信息。
 root用户登录mysql,mysql>SET GLOBAL sql_mode = 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE';
或者
   vi  /etc/rc.d/init.d/mysqld
/usr/bin/mysqld_safe  --sql-mode="REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE"  --datadir="$datadir" --socket="$socketfile" \
或者,直接在oracle里,执行下面语句:
SQL>
DECLARE 
ret integer; 
c integer; 
BEGIN 
c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@mysql
DBMS_HS_PASSTHROUGH.PARSE@mysql(c, 'SET SESSION SQL_MODE=''ANSI_QUOTES'';'); 
ret := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@mysql(c); 
dbms_output.put_line(ret ||' passthrough output'); 
DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@mysql(c); 
END; 
/
均可解决此问题;

 

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

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2013-07-31

  • 博文量
    2
  • 访问量
    4571