需要把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

  1. 判断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

  2. 下载并安装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
  3. 下载并按照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上解释的传送门

  4. 配置 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 区分大小写。

  5. 配置环境变量,验证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)
  6. 配置tnsnames.ora

     myodbc5 =
    (DESCRIPTION =
    (ADDRESS =
    (PROTOCOL = TCP)(HOST = dbmsprddb222)(PORT = 1521)
    )
    (CONNECT_DATA =
    (SID = myodbc5)
    )
    (HS = OK)
    )
  7. 配置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")
    )
    )
  8. 创建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
  9. 重启监听(数据库的注册到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
  10. 验证

    $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)
  11. 创建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)
  12. 使用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.

    肆Coye

Oracle通过dblink连接MySQL的更多相关文章

  1. oracle通过dblink连接mysql配置详解(全Windows下)

    关于oracle通过dblink连接mysql,经过了两周的空闲时间研究学习,终于配置好了,真是不容易啊,仔细想想的话,其实也没花多长时间,就是刚开始走了一段弯路,所以把这次的经验分享出来,让大家少走 ...

  2. [Oracle, MySQL] Oracle通过dblink连接MySQL

    http://blog.csdn.net/dbanote/article/details/10488581 版权声明:本文为博主原创文章,未经博主允许不得转载. 业务上有这么一个需求,需要把Oracl ...

  3. oracle通过DBlink连接mysql(MariaDB)

    1.安装先装 mysql-connector-odbc(或 mariadb-connector-odbc )和unixODBChttps://downloads.mariadb.org/mariadb ...

  4. oracle 配置DBlink 链接mysql库

    一,环境配置与准备.简介 \ oracle mysql 主机名 oracle01 mysqlre1 IP 192.168.0.10 192.168.0.187 本文章是oracle通过dblink连接 ...

  5. Windows环境下,本地Oracle创建dblink连接远程mysql

    前言 我的情况是,本地安装了oracle(安装完成后带有SQL Developer,不需要再安装instantclient),创建dblink去连接远程的mysql.有些朋友可能是 本地使用PL\SQ ...

  6. 【转】Oracle SQL Developer 连接 Mysql 等数据库

    原文地址:http://blog.163.com/cuixiao_yan/blog/static/319232442009102882651869/ Oracle SQL Developer 个人感觉 ...

  7. Oracle SQL developer 连接 MySQL 数据库安装配置

    1. 下载 JDBC driver for MySQL 下载链接: https://dev.mysql.com/downloads/connector/j/ 下载成功后,解压缩,得到 mysql jd ...

  8. oracle通过透明网关连接mysql的配置

    之前配置过连接TD的,这一篇是介绍连接Mysql的配置很详细. http://blog.itpub.net/12679300/viewspace-1177222/

  9. Oracle SQL Developer 连接 MySQL

    1. 在ORACLE官网下载Oracle SQL Developer第三方数据库驱动 下载页面:http://www.oracle.com/technetwork/developer-tools/sq ...

随机推荐

  1. statement对象与sql语句(新手)

    本篇介绍读上篇代码中的疑惑点 实现简单网页上对数据内容进行增删改查,需要用到三个部分:jsp网页前端部分+java后台程序+数据库表 一.创建一个Statement (用于在已经建立数据库连接的基础上 ...

  2. react的super(props)

    在学习react的时候,其中在构造函数里面,有一个super(props),具体是什么意思呢. 其中 super语法来自es6,其语法如下: super([arguments]); // 调用 父对象 ...

  3. SVM、LR、决策树的对比

    一.LR LR,DT,SVM都有自身的特性,首先来看一下LR,工业界最受青睐的机器学习算法,训练.预测的高效性能以及算法容易实现使其能轻松适应工业界的需求.LR还有个非常方便实用的额外功能就是它并不会 ...

  4. Error #2148

    参考:https://blog.csdn.net/watersevenmmfx/article/details/52980804 chrome flash 安全沙箱冲突 SecurityError: ...

  5. 44.JS--hover事件防重复效果

    遇到一种情况,就是运用hover事件的时候,会出现对象(主要是图片)闪动现象.主要是由于hover事件重复触发导致这一现象. html: <p class="smallImg" ...

  6. UVAL 3942 Remember the Word(递推+Trie)

    Remember the Word [题目链接]Remember the Word [题目类型]递推+Trie &题解: 蓝书P209,参考的别人公开代码 &代码: #include ...

  7. MyBatis基础入门《八》查询参数传入Map

    MyBatis基础入门<八>查询参数传入Map 描述: 在执行select查询数据的时候,方法传入的参数是java.util.Map类型. 接口方法: xml文件 注意: 书写SQL语句的 ...

  8. [IDE] ECLIPSE取消自动更新

    eclipse自动更新的取消方法: window --> preferences --> General --> Startup and Shutdown --> 在列表中找到 ...

  9. 《大话设计模式》c++实现 工厂模式

    工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端 ...

  10. django-pagination 样式修改

    默认 django-pagination  样式: 使用bootstrap后样式: (有些瑕疵,下面来完善一下) 修改后: 效果还不错吧.那么讲下如何修改. 首先找到其源码: (路径:site-pac ...