Oracle通过dblink连接MySQL
需要把MySQL的一些数据同步到Oracle,用ETL工具太麻烦了,通过参考官方文档实现了oracle to mysql dblink。每次修改配置后,需要重启监听才能生效,或者 reload一下,确保监听状态正常(按照文档配置的,没什么多余的解释,只是有乱码问题是换了mysql-odbc的版本得以解决的)
参考文档:Detailed Overview of Connecting Oracle to MySQL Using DG4ODBC Database Link (Doc ID 1320645.1)
参考文档可通过 MOS 下载
DB,OS版本:
Oracle: 11.2.0.3.0 OS: RHEL 6.3
MySQL: 5.6.29 OS: RHEL 6.3
Oracle 字符集
PARAMETER VALUE
------------------------------ ------------------------------
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET UTF8
MySQL 字符集
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
实现 oracle to mysql dblink 涉及以下概念:DG4ODBC, ODBC, unixODBC,Mysql,ODBCINI,DBLINK
判断Oracle 和 DG4ODBC 是 32位还是64位(本次未测试 32位)
$ file $ORACLE_HOME/bin/dg4odbc
/mysql/data/u01/app/oracle/product/11.2.0/dbhome_1/bin/dg4odbc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
根据以上输出判断是64位,需要下载对应的64位 ODBC Driver Manager 和 64位的 ODBC Driver
下载并安装ODBC Driver Manager
到http://www.unixodbc.org/下载最新的 unixodbc,当前最新版是
unixODBC-2.3.4.tar.gz,本次OS已经预安装 unixODBC-2.2.14-11.el6.x86_64,所以下载了对应的版本。其中,unixODBC-2.3.4.tar.gz中的目录结构与unixODBC-2.2.14-linux-x86-64.tar.gz完全不同。解压 unixODBC-2.2.14-linux-x86-64.tar.gz 后会在当前目录下自动创建 usr/local 的目录,然后把 usr/local 下的文件移到/home/oracle/unixODBC-2.2.14下
$ tar -zxvf unixODBC-2.2.14-linux-x86-64.tar.gz
$ mkdir -p /home/oracle/unixODBC-2.2.14
$ mv usr/local/* /home/oracle/unixodbc-2.2.14
下载并按照ODBC Driver for MySQL
到https://dev.mysql.com/downloads/connector/odbc/5.2.html#downloads 下载Linux-Generic的64位的 ODBC 5.2.7 的tar包:$ tar -zxvf mysql-connector-odbc-5.2.5-linux-glibc2.5-x86-64bit.tar.gz
$ mv mysql-connector-odbc-5.2.7-linux-glibc2.5-x86-64bit/ mysql-odbc-5.2.7
尝试过使用 ODBC 5.1.13 的安装包,5.1.13 的 lib 下面只有 libmyodbc5.so,ODBC 5.2.7 的 lib 下面有 libmyodbc5a.so 和 libmyodbc5w.so 两个,本次使用的是 libmyodbc5w.so,使用 5.1.13 的 libmyodbc5.so 会导致乱码问题,后面解释,给出sourceforge上解释的传送门
配置 ODBC Driver
在 /home/oracle 创建odbc.ini如下:
[myodbc5]
Driver = /home/oracle/mysql-odbc-5.2.7/lib/libmyodbc5w.so
Description = Connector/ODBC 5.2.7 Driver DSN
SERVER = 10.100.132.196
PORT = 3306
USER = XXXX
Password = XXXXXX
Database = ant
OPTION = 0
TRACE = OFF
CHARSET = UTF8
注:Database 区分大小写。
配置环境变量,验证ODBC连接
修改.bash_profile,增加以下内容
export LD_LIBRARY_PATH=/home/oracle/unixODBC-2.2.14/lib
export PATH=/usr/sbin:/home/oracle/unixODBC-2.2.14/bin:$PATH
export ODBCINI=/home/oracle/odbc.ini 可以用过以下命令测试
$ cd unixODBC-2.2.14/bin/
$ ./isql myodbc5 -v
因为环境文件,本次未完成测试
$ ldd isql
linux-vdso.so.1 => (0x00007fffbcb08000)
libodbc.so.1 => /home/oracle/unixODBC-2.2.14/lib/libodbc.so.1 (0x00007fd16d250000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000369e600000)
libreadline.so.5 => not found
libncurses.so.5 => /lib64/libncurses.so.5 (0x000000369ee00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x000000369ea00000)
libc.so.6 => /lib64/libc.so.6 (0x000000369e200000)
/lib64/ld-linux-x86-64.so.2 (0x000000369de00000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00000036a0200000)
配置tnsnames.ora
myodbc5 =
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)(HOST = dbmsprddb222)(PORT = 1521)
)
(CONNECT_DATA =
(SID = myodbc5)
)
(HS = OK)
)
配置listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = myodbc5)
(ORACLE_HOME =/u01/app/oracle/product/11.2.0/dbhome_1)
(PROGRAM = dg4odbc)
(ENVS="LD_LIBRARY_PATH=/home/oracle/unixODBC-2.2.14/lib:/mysql/data/u01/app/oracle/product/11.2.0/dbhome_1/lib")
)
)
创建init.ora文件
创建文件$ORACLE_HOME/hs/admin/initmyodbc5.ora
HS_FDS_CONNECT_INFO = myodbc5
HS_FDS_TRACE_LEVEL = OFF
HS_FDS_SHAREABLE_NAME = /home/oracle/unixODBC-2.2.14/lib/libodbc.so
#HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P15
HS_LANGUAGE = AMERICAN_AMERICA.UTF8
HS_NLS_NCHAR = UCS2
HS_FDS_SUPPORT_STATISTICS = FALSE
set ODBCINI=/home/oracle/odbc.ini
set LD_LIBRARY_PATH=/home/oracle/unixODBC-2.2.14/lib
重启监听(数据库的注册到3306了,MySQL 的注册到1521)
$ lsnrctl stop
$ lsnrctl start
$ lsnrctl status LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 24-AUG-2017 14:18:57 Copyright (c) 1991, 2011, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbmsprddb222)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 24-AUG-2017 08:56:23
Uptime 0 days 5 hr. 22 min. 34 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /mysql/data/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /mysql/data/u01/app/oracle/diag/tnslsnr/dbmsprddb222/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dbmsprddb222)(PORT=1521)))
Services Summary...
Service "myodbc5" has 1 instance(s).
Instance "myodbc5", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully $lsnrctl status LSNR2 LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 24-AUG-2017 14:19:42 Copyright (c) 1991, 2011, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbmsprddb222)(PORT=3306)))
STATUS of the LISTENER
------------------------
Alias LSNR2
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 23-AUG-2017 12:15:14
Uptime 1 days 2 hr. 4 min. 28 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /mysql/data/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /mysql/data/u01/app/oracle/diag/tnslsnr/dbmsprddb222/lsnr2/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dbmsprddb222)(PORT=3306)))
Services Summary...
Service "dbms" has 1 instance(s).
Instance "dbms", status READY, has 1 handler(s) for this service...
Service "dbmsXDB" has 1 instance(s).
Instance "dbms", status READY, has 1 handler(s) for this service...
The command completed successfully
验证
$tnsping myodbc5 TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 24-AUG-2017 14:29:43 Copyright (c) 1997, 2011, Oracle. All rights reserved. Used parameter files: Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = dbmsprddb222)(PORT = 1521)) (CONNECT_DATA = (SID = myodbc5)) (HS = OK))
OK (0 msec)
创建dblink
注意用户名和密码一定要用双引号引起来,查询时表名和字段名也需要引号
SQL> create public database link ant connect to "XXXX" identified by "XXXXXX" using'myodbc5';
SQL> select count(1) from "t_info_basinfo"@ant; COUNT(1)
----------
4262
SQL> select "sys_name" from "t_info_database"@ant where "db_id"=1; sys_name
--------------------------------------------------------------------------------
项目与事物跟踪系统(JIRA)
使用HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P15 乱码问题的官方解释以及解决方案(传送门)
Oracle Note:
Symptoms
using DG4ODBC and MySQL ODBC driver with UnixODBC Driver Manager on Linux corupts multibyte characters stored in a MySQL database using UTF8 charset.
Cause
Root cause of the corrupted characters is the unixODBC Driver Manager which forces the gateway to specify an 8bit language like HS_LANGUAGE=american_america.we8iso8859p1
Commonly when DG4ODBC uses HS_LANGUAGE=american_america.utf8 it uses the unicode ODBC functions like SQLDriverConnectW. This works well when using DataDirect ODBC driver. When using unixODBC Driver manager it expects a double byte ODBC connect string as soon as SQLDriverConnectW is being called. If a single byte connect string is sent (as it is done by DG4ODBC and handled by several commercial ODBC driver vendors) unixODBC is only interpreting every second character and thus corrupts the previously sent connect string which will leqad in an ORA-28500 error message.
Thus it is mandatory to use HS_LANGUAGE with a single byte character with unixODBC driver manager to correctly handle the connect string - but this forces the driver manager to use the SQLDriverConnect function instead of its unicode equivalent.
This SQLDriverConnect function is not able to handle UTF8 character sets and thus corrupts the content.
Solution
To solve your problem you now have 3 options:
- report this issue to the unixODBC vendor => this was already done a couple of times by other customers, but the problem still exists in the latest 2.3 release.
- use a commercial ODBC driver like the ODBC drivers from Data Direct
- use DG4ODBC on Windows with the MySQL ODBC driver. You can connect from a suitable Oracle database release on any platform to DG4ODBC on Windows which then uses the MySQL ODBC driver to connect to the MySQL database.
Oracle通过dblink连接MySQL的更多相关文章
- oracle通过dblink连接mysql配置详解(全Windows下)
关于oracle通过dblink连接mysql,经过了两周的空闲时间研究学习,终于配置好了,真是不容易啊,仔细想想的话,其实也没花多长时间,就是刚开始走了一段弯路,所以把这次的经验分享出来,让大家少走 ...
- [Oracle, MySQL] Oracle通过dblink连接MySQL
http://blog.csdn.net/dbanote/article/details/10488581 版权声明:本文为博主原创文章,未经博主允许不得转载. 业务上有这么一个需求,需要把Oracl ...
- oracle通过DBlink连接mysql(MariaDB)
1.安装先装 mysql-connector-odbc(或 mariadb-connector-odbc )和unixODBChttps://downloads.mariadb.org/mariadb ...
- oracle 配置DBlink 链接mysql库
一,环境配置与准备.简介 \ oracle mysql 主机名 oracle01 mysqlre1 IP 192.168.0.10 192.168.0.187 本文章是oracle通过dblink连接 ...
- Windows环境下,本地Oracle创建dblink连接远程mysql
前言 我的情况是,本地安装了oracle(安装完成后带有SQL Developer,不需要再安装instantclient),创建dblink去连接远程的mysql.有些朋友可能是 本地使用PL\SQ ...
- 【转】Oracle SQL Developer 连接 Mysql 等数据库
原文地址:http://blog.163.com/cuixiao_yan/blog/static/319232442009102882651869/ Oracle SQL Developer 个人感觉 ...
- Oracle SQL developer 连接 MySQL 数据库安装配置
1. 下载 JDBC driver for MySQL 下载链接: https://dev.mysql.com/downloads/connector/j/ 下载成功后,解压缩,得到 mysql jd ...
- oracle通过透明网关连接mysql的配置
之前配置过连接TD的,这一篇是介绍连接Mysql的配置很详细. http://blog.itpub.net/12679300/viewspace-1177222/
- Oracle SQL Developer 连接 MySQL
1. 在ORACLE官网下载Oracle SQL Developer第三方数据库驱动 下载页面:http://www.oracle.com/technetwork/developer-tools/sq ...
随机推荐
- 银联卡中关于CVN/CVN2/ICVN的区别
银联China Union Pay,是中国唯一合法的卡组织机构,同时也是EMVCo成员.关于银联卡中CVN/CVN2/ICVN的区别,刚开始我自己不了解,但经过查找资料和请教其他人,对它们的概念也渐渐 ...
- oracle新建表空间与用户
例如:创建用户 cwbase1_9999 密码 gxtest 表空间 cwdata1 sqlplus / as sysdba 运行sql create tablespace cwdata1 logg ...
- (转)Geth控制台使用及Web3.js使用实战
在开发以太坊去中心化应用,免不了和以太坊进行交互,那就离不开Web3.Geth 控制台(REPL)实现了所有的web3 API及Admin API,使用好 Geth 就是必修课.结合Geth命令用法阅 ...
- sync修饰符的简易说明
其实这个就说的很好了. sync会自动更新父组件的数据 原本valuechild 的值是222,父页面显示的222,把值传递给子组件 子组件也显示的222, 我点击子组件的按钮 把333传递给父组件, ...
- 使用MySQL的mysqldump命令备份数据库和把数据库备份文件恢复
1,备份数据库 mysql -uroot -p123456 db_name > /root/db_name.dump 2,数据库备份文件恢复 mysql -uroot -p123456 db_n ...
- [LeetCode] 20. Valid Parentheses_Easy tag: Stack
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- canvas 写一个刮刮乐抽奖
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- js计算斐波拉切
function feibo(a){ if(!a || a <= 0){ throw new Error("参数错误,必须大于0"); }else if(a == 1){ r ...
- Android -- 仿淘宝广告条滚动
1,在赶项目的时候我们经常会实现下面这个功能,及添加滚动条广告广播,先看一下淘宝的效果 2,这次实现效果主要使用Android自带的ViewFlipper控件,先来看一下我们的它的基本属性和基本方法吧 ...
- 使用SQL Developer导入文件时出现的一个奇怪的问题
SQL Developer 的版本是 17.3.1.279 当我导入文件的时候,在Data Preview 的阶段,发现无论选择还是取消选择 Header,文件中的第一行总会被当作字段名. 后来在Or ...