一、概述
linux 环境下,Oracle 数据库通过 DBLink 远程连接 MySQL 数据库。
二、环境信息
1、Oracle
①操作系统:Linux X86-64
②数据库版本:11.2.0.4.0
③字符集:SIMPLIFIED CHINESE_CHINA.AL32UTF8
2、MySQL
①操作系统:Linux i686
②数据库版本:5.7.21
③字符集:UTF8
三、配置 UnixODBC
1、下载 UnixODBC 安装包
软件地址:ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.0.tar.gz
2、安装
① root 用户执行
cd /usr/local
tar zxvf unixODBC-2.3.0.tar.gz
②编译安装
cd unixODBC-2.3.0/
./configure
--prefix=/usr/local/unixODBC-2.3.0
--libdir=/usr/lib64 --bindir=/usr/bin --sysconfdir=/etc
--includedir=/usr/include
make
make install
3、测试
执行命令:odbcinst -j
如果安装成功会显示:
[root@vbox66 local]# odbcinst -j
unixODBC 2.3.0
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
[root@vbox66 local]#
unixODBC 所需的头文件都被安装到了/usr/inlucde 下,编译好的库文件安装
到了/usr/lib64 下,与 unixODBC 相关的可执行文件安装到了/usr/bin 下,配置文
件放到了/etc 下。安装完成
四、配置 odbc 连接 MyDQL
1、下载文件
网址:
https://cdn.mysql.com//Downloads/Connector-ODBC/5.1/mysql-connector-odbc-5.1.
13-1.x86_64.rpm
2、rpm 安装
rpm -ivh mysql-connector-odbc-5.1.13-1.x86_64.rpm
3、配置 odbc.ini 文件
vi /etc/odbc.ini
[testdb]
Description = mysql
Driver = MySQL ODBC 5.1 Driver
Server = 192.169.31.103
Database = test
Port = 3306
USER = user_name
Password = passwd
Socket =
Option = 3
Stmt =
CHARSET = UTF8
4、测试 odbc 连接 MySQL
//MySQL 服务器 IP
//MySQL 数据库名
//端口
//数据库用户名
//用户民密码
//数据库字符集
|
|
|
运行命令: isql testdb -v
[root@vbox66 lib64]# isql testdb -v
+---------------------------------------+
| Connected!
|
| sql-statement
| help [tablename]
| quit
|
+---------------------------------------+
SQL> show databases;
+-----------------------------------------------------------------+
| Database
+-----------------------------------------------------------------+
| information_schema
| aaa
| mysql
| otter
| performance_schema
| sbtest
//testdb 为 odbc.ini 文件中中括号中的内容
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| sys
| test
| test1
| test_wr
| wr
| wr_test1
| www
+-----------------------------------------------------------------+
SQLRowCount returns 14
14 rows fetched
SQL>
odbc 连接 MySQL 成功!
五、配置 Oracle 通过 DBLink 访问 MySQL
1、修改环境变量
su - oracle
vi .bash_profile
export ODBCINI=/etc/odbc.ini
2、配置 Oracle 监听
① cd $ORACLE_HOME/network/admin
vi listener.ora
添加如下信息:
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=dg4odbc)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1)
(PROGRAM=dg4odbc)
)
)
官方文档解释如下:
网址:
https://docs.oracle.com/cd/E11882_01/gateways.112/e12013/configsql.htm#OTGIS10
23
②修改 tnsnames.ora
vi tnsnames.ora
添加如下信息:
dg4odbc =
(DESCRIPTION=
(ADDRESS = (PROTOCOL =tcp)(HOST = vbox66)(PORT = 1521))
(CONNECT_DATA =
(SID = dg4odbc))
(HS=OK)
)
官方文档解释如下:
// 注 意 , 这 里 init 后 面 的 内 容 要 和 之 前 配 置 SID_NAME
③配置 ODBC 监听
cd $ORACLE_HOME/hs/admin
vi initdg4odbc.ora
(dg4odbc)一致
HS_FDS_CONNECT_INFO=testdb
HS_FDS_TRACE_LEVEL = on
HS_FDS_SHAREABLE_NAME=/usr/lib64/libodbc.so
HS_FDS_SUPPORT_STATISTICS=FALSE
#HS_LANGUAGE=AMERICAN_AMERICA.al32utf8
#HS_FDS_REMOTE_DB_CHARSET=utf8
#HS_LANGUAGE =AL32UTF8
#HS_LANGUAGE=AMERICAN_AMERICA.utf8
HS_LANGUAGE="simplified chinese_china.al32utf8"
源的字符集、语言和区域信息的异构服务
HS_NLS_NCHAR=UCS2
//NVARCHAR/NCHAR 和图形数据类型通常以
Unicode 格式存储数据。unicode 字符集因数据库的不同而不同,设置此参数外部
数据库保持一致
//提供具有非 oracle 数据
set ODBCINI=/etc/odbc.ini
④重启测试监听配置
oracle 用户执行:
lsnrctl stop
lsnrctl star
alter system register;(数据库中执行)
lsnrctl status;
tnsping dg4odbc
显示以上信息则表示监听配置成功!
3、创建 DBLink
①su - oracle
sqlplus / as sysdba
create public database link myodbc connect
to "aaa" identified by "aaa" using
'dg4odbc'; --注意:aaa 和 aaa 是 MySQL 用户名和密码,都需要使用双引号,dg4odbc
使用单引号。
②select * from "a2"@myodbc1;
六、可能会遇到的问题
1、SYS@vbox66in>select "id" from t1@myodbc1;
select "id" from t1@myodbc1
*
第 1 行出现错误:
ORA-28500: 连接 ORACLE 到非 Oracle 系统时返回此信息:
[
原因:有一些内容显示不全,检查 odbc 监听文件,查看 HS_LANGUAGE 参数,
配置为和数据库字符集一致
2、SYS@vbox66in>select "id" from "t1"@myodbc1;
select "id" from "t1"@myodbc1
*
第 1 行出现错误:
ORA-28500: 连接 ORACLE 到非 Oracle 系统时返回此信息: ORA-28541:
HS 初始化文件的第 8 行发生错误。 ORA-02063:
紧接着 2 lines (起自 MYODBC1)
原因:NVARCHAR/NCHAR 和图形数据类型通常以 Unicode 格式存储数据。
unicode 字符集因数据库的不同而不同,需要修改 HS_NLS_NCHAR=UCS2