Oracle 与 mysql 建立透明网关
1.1.1. 文档编写目的
项目上需要做与Mysql数据库的对接,然而Oracle与Mysql数据库是异构的,因此这里采用透明网关的方式来解决。
另,项目上的环境为APP:12.2.6 ; DB: 12.1.0
主要配置如下:
2.1 确定使用32/64 bit的驱动
登陆服务器,执行指令:file $ORACLE_HOME/bin/dg4odbc
从上可以看出是64位,需要安装64位驱动。
注:这里需要严格匹配。
2.2 下载ODBC驱动管理
ODBC 造就了"应用程序独立性"的特性,使应用程序不需在乎数据源是何种数据库系统或者纯粹是个资料或文本文件,只要相对驱动程序能完成衔接的功能,则应用程序即可达到高度的独立性。
下载网址(文档链接在文章结尾):http://sourceforge.net/projects/unixodbc/files/unixODBC/2.2.14/unixODBC-2.2.14-linux-x86-64.tar.gz/download
这里,注意以下几点:
1.要用root账户进行解压、修改配置文件的操作;
2.最好将文件放在/tmp目录下进行操作,因为linux文件系统针对不同的用户对不同文件夹有不同的读写权限,但/tmp目录下所有的用户都可以进行读写和修改。
因此,本文档的解压路径等都放在/tmp路径下。
2.3 安装ODBC驱动管理
将下载的文件放在/tmp目录下,用root账户登录服务器。
1.在/tmp目录下执行命令:tar zxvf unixODBC-2.2.14-linux-x86-64.tar.gz
默认会解压到usr/local目录下,包含bin,include ,lib 三个目录。
2.创建文件夹 unixodbc-2.2.14,执行命令:mkdir unixodbc-2.2.14
3.进入创建的文件夹,执行命令:cd unixodbc-2.2.14
4.将刚解压的文件复制到当前目录下,执行指令:mv /tmp/usr/local/* .
注意:命令后面还有个点
5.更改配置文件,这里切换到ora账户下执行,修改home目录下的.bash_profile文件,如下:
执行指令:vi ~/.bash_profile
添加如下:export LD_LIBRARY_PATH=/tmp/unixodbc-2.2.14/lib
export PATH=/usr/sbin:/tmp/unixodbc-2.2.14/bin:$PATH
如图所示:
注意:配置文件中不能‘=’两边不能有空格。
修改完后,保存(ctrl+c 切换出来,输入:wq! 执行linux的强制保存命令)。
6.执行命令:source ~/.bash_profile,查看修改的配置文件是否有错误,例如:若在配置文件中添加空格,配置文件无效,执行该命令可查看报错的信息。
2.4 下载mysql连接odbc的驱动
下载网址:http://www.mysql.com/downloads/connector/odbc/5.1.html
1.将tar包同上放在/tmp文件夹内,执行解压命令(切换到root用户下):
tar zxvf mysql-connector-odbc-5.1.13-linux-glibc2.5-x86-64bit.tar.gz
2.在当前目录下,建立新的文件夹,执行命令:mkdir mysqlodbc_5.1.13
3.将解压的文件放在新建的文件夹内。执行命令:mv mysql-connector-odbc-5.1.13-linux-glibc2.5-x86-64bit.tar.gz mysqlodbc_5.1.13
2.5 配置ODBC数据源
还是在root用户下(因为root用户有修改如下配置文件的权限,否则会报错)。
1.cd /etc
2.修改目录下的 odbc.ini 文件,添加如下代码:
[myodbc3]
Driver = /usr/lib64/libmyodbc5.so
Description = MySQL ODBC 5.1 Driver DSN
SERVER = XXX.XX.XX.XX
PORT = 3306
USER = XXXXX
Password = XXXX
Database = XXX
OPTION = 3
SOCKET =
charset = utf8
如图所示:
注意如下几点:
1.Driver目录下的驱动文件一定要有;
2.server是指mysql数据库的IP;
3.mysql数据库默认端口为3306;
4.user是指mysql数据库给我们访问的用户;
5.password是指MySQL数据库给我们访问的用户密码;
6.database是指mysql数据库的实例。
2.6 将odbc.ini 加入到配置文件中
用ora用户登陆服务器。修改 .bash_profile 文件。
增添如下:
export ODBCINI=/etc/odbc.ini
ODBCSYSINI=/etc;export ODBCSUSINI
ODBCINSTINI=/etc/odbc.ini
export ODBCINSTINI
如图:
最后,执行:source ~/.bash_profile
2.7 测试连通
在ora 用户或者 root 用户执行: isql myodbc3 -v。
出现如下图所示,表示连通。
2.8 配置 tnsnames.ora
1.在ora用户下,输入命令:cd $TNS_ADMIN
2.输入命令:vi tnsnames.ora
3.添加如下:
myodbc3 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
(CONNECT_DATA =
(SID =myodbc3))
(HS=OK)
)
注意:端口编号有时可能会冲突,注意修改,和listener中的端口号一致即可;
和其他TNS的端口号一致即可。
HS=OK 必输,因为连接需要用此来标识是数据库内部的连接还是同其他数据库的连接。
2.9 配置 listener.ora
1.在ora用户下,输入命令:cd $TNS_ADMIN
2.输入命令:vi listener.ora
3.添加如下:
SID_LIST_TEST =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME= /u01/test/db/12.1.0)
(SID_NAME = TEST)
)
(SID_DESC=
(PROGRAM = dg4odbc)
(SID_NAME= myodbc3)
(ORACLE_HOME= /u01/test/db/12.1.0)
(ENVS=LD_LIBRARY_PATH=/tmp/unixodbc-2.2.14/lib)
)
)
如下图所示:
注意如下几点:
1.ORACLE_HOME要和上面的路径一致;
2.ENVS同 .bash_profile里面配置的路径相同;
3.注意上面TSET的端口号 1522,同tnsnames里面的端口号一致;
4.注意SID名称不同数据库不一致。
2.10 配置监听的初始化文件
1. 进入如下路径:cd $ORACLE_HOME/hs/admin
注意:名字要跟odbc配置的名字一样,这里是myodbc3。
2. 在上面的路径下面找到:initdg4odbc.ora,重命名为initmyodbc3.ora。
注意:红色与上面名称相同
3. 添加如下:
HS_FDS_CONNECT_INFO=myodbc3
HS_FDS_TRACE_LEVEL=ON
HS_FDS_TRACE_FILE_NAME=odbc_test.log
HS_FDS_TRACE_LEVEL=4
HS_FDS_SHAREABLE_NAME=/tmp/unixodbc-2.2.14/lib/libodbc.so
HS_FDS_SUPPORT_STATISCTICS=FALSE
HS_LANGUAGE=AMERICAN_AMERICA.UTF8
HS_NLS_NCHAR=UCS2
HS_FDS_SQLLEN_INTERPRETATION=32
set ODBCINI=/etc/odbc.ini
如下图所示:
注意其他的都要注释掉,否则会报上面图片的错误。
2.11 测试及重启监听
1.在ora用户下输入如下指令,测试监听:tnsping myodbc3
2.出现如下,则说明tns拼通
3.重启监听:
执行如下:
lsnrctl stop
lsnrctl start
lsnrctl status
出现如图则说明监听生效。
注意:若tns无法ping通,请检查前面的配置以及listener和tnsnames的输入数据。
2.12 创建DBLINK
1.在ora用户执行:sqlplus,输入apps账户和密码
2.输入如下指令:create public database link myodbc3 connect to "mysql_user" identified by "password" using'myodbc3';
3.查看mysql的表,看是否能够连接:select * from"dual"@myodbc3;
oracle实现异构连接分为两种方式,基本原理:
1. Generic Heterogeneous Services,通用异构服务
服务器端安装non-oracle db的client,使用其所带odbc驱动建立其数据源,然后oracle通过hs组件建立与odbc之间的dblink从而实现异构连接。
2. Transparent Gateway,透明网关
安装透明网关,选择相应non-oracle db网关选项,建立监听连接透明网关,进而dblink实现异构连接。
错误解决:
1.ORA-28528:多机种服务数据类型转换出现错误
[oracle][odbc sybase wire protocol driver]string data,right truncated.error in column 3.{01004}
ora-02063:紧接着2Line(起自to_sybase)
ORA-28528:
Heterogeneous Services datatype conversion error Cause: Either an Oracle datatype could not be converted to a non-Oracle datatype, or a non-Oracle datatype could not be converted to an Oracle datatype. The following are possible reasons for for the conversion failure: -- overflow problems (in the case of numbers) -- length limitations (in the case of character strings) -- invalid values passed into the conversion routines
Action: Contact customer support of the agent vendor. If the problem is due to size discrepancies between Oracle and the non-Oracle system, it may not be possible to convert the value
2.ora-28511: 丢失与使用sid=……的多机种远程代理程序的rpc连接
ORA-28511:
lost RPC connection to heterogeneous remote agent using SID=string Cause: A fatal error occurred in one of the following places: -- the connection between the ORACLE server and the agent -- the heterogeneous services remote agent itself -- the connection to the non-Oracle system This error occurred after communication had been established successfully.
Action: Check for network problems and remote host crashes. The problem is probably in the agent software. If so, contact a customer support representative of the agent vendor.
sybase通用异构服务连接odbc查询远程db不同字符集时报错,可以使用odbc日志调试分析,连接可以建立,但查询失败。使用透明网关解决。
3.ora-28500:连接oracle到非oracle系统时返回此信息:[MICROSOFT][ODBC驱动程序管理器]未发现数据源名并且未指定默认驱动程序
原因:根据错误提示,sid未配置正确。重新配置解决。
4.ora-28500:连接oracle到非oracle系统时返回此信息:[IBM][CLI DRIEVER] SQL30082N尝试建立连接失败,安全性原因为“24”("username and/or password invalid").sqlstate=08001
原因:用户名、密码不匹配。ora-28500错误根据错误提示应该就可解决。
5.ora-02050:事务处理4.7.2886已回退,某些远程数据库可能有问题
ORA-02050:
transaction string rolled back, some remote DBs may be in-doubt Cause: network or remote failure in 2PC.
Action: Notify operations; remote DBs will automatically re-sync when the failure is repaired.
解决:须dba手工提交或回滚事务,自行保证一致性。
dbms_transaction.purge_lost_db_entry('4.7.2886');commit;
具体解决方式需视情况而定。
phase local_state remote_state action
prepare collecting / 本地DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY
prepared / 本地rollback force后PURGE_LOST_DB_ENTRY
commit prepared commited 本地commit force后本地和远程均PURGE
commited commited 本地和远程均PURGE_LOST_DB_ENTRY
forget commited / 本地PURGE_LOST_DB_ENTRY