Oracle 透明网关是oracle连接异构数据库提供的一种技术。通过Gateway,可以在Oracle里透明的访问其他不同的数据库,如SQL Server, DB2, Sybase等等,就像远程Oracle数据库一样。配置后的sql查询的处理流程(如图):
注:设置gateways机器可以和Oracle Database在同一台机器上,也可以分开。
一、环境信息
–Oracle 11g
IP地址:172.17.84.29
Oracle根目录:/u01/oracle/app/product/11.2.0/dbhome_1
Oracle端口:1521
–Oracle gateway 11
IP地址:172.17.22.230
gateway11根目录:D:\product\11.1.0\tg_1
gateway端口:1521
SID:dg4msql
–SqlServer2008
IP地址:172.17.22.230
数据库名:HIS
用户名:sa
密码:admin_123
Oracle透明网关下载地址链接:https://pan.baidu.com/s/14Elrkjg2VaxlhXJmJvpcrA 提取码:0qsk
二、Oracle透明网关配置
2.1. gateway安装
解压p13390677_112040_MSWIN-x86-64_5of7.zip,运行setup安装即可,这里我们将透明网关和SQLServer数据库安在了一台服务器上。
下一步,填写SQLServer数据库服务器主机名,如:172.17.22.230;数据库名称:HIS
安装完后,会弹出配置监听界面,因为我们要手工配置,点击取消即可。
安装完Gateway软件后,在ORACLE_HOME目录(D:\product\11.2.0\tg_1)下有一下dg4msql的目录,这就是Gateway软件的目录了。
2.2. 透明网关层配置的SID信息,指明要访问的MSSQL数据库
在D:\Oracle\product\11.2.0\tg_1\dg4msql\admin\initdg4msql.ora目录下有一个initdg4msql.ora的文件。该文件是Gateway的初始参数文件,描述连接的是哪个SQL Server数据库。该文件的格式是initSID.ora,这里的SID在后面需要用到,系统默认的是dg4msql,一般情况这样就可以了。如果改名,如使用HIS作为SID,则文件名变成initHIS.ora。文件内容如下:
# This is a customized agent init file that contains the HS parameters
# that are needed for the Database Gateway for Microsoft SQL Server
#
# HS init parameters
#
HS_FDS_CONNECT_INFO=[172.17.22.230]//HIS
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
只要修改HS_FDS_CONNECT_INFO参数就可以了。格式是:[hostname:port]/serverinstance/databasename,其中hostname是机器名称或IP,PORT是SQL Server的端口号,SQL Server2005默认为1433.serverinstance是SQL Server的实例名,一般空着就行。Databasename是SQL Server的数据库名。因为我们在安装过程中指定了主机名和数据库名,这里已经有信息了。
2.3. 透明网关层配置监听器,处理oracle的查询请求
透明网关层的监听配置文件: D:\Oracle\product\11.2.0\tg_1\NETWORK\ADMIN\listener.ora
这里PROGRAM指定应用程序名称,因为实例配置文件在D:\Oracle\product\11.2.0\tg_1\dg4msql\admin\initdg4msql.ora,所以PROGRAM不能改变, SID_NAME就是前面init.ora文件名里指定的SID
# listener.ora Network Configuration File: D:\product\11.2.0\tg_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.17.22.230)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = gateway_sid)
(PROGRAM = dg4msql)
(ORACLE_HOME = D:\product\11.2.0\tg_1)
)
)
ADR_BASE_LISTENER = D:\product\11.2.0\tg_1
-----------------------------------------------------
如果配置多个监听,参考如下:
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=gateway_sid)
(ORACLE_HOME=oracle_home_directory)
(PROGRAM=dg4msql)
)
(SID_DESC=
(SID_NAME=gateway_sid)
(ORACLE_HOME=oracle_home_directory)
(PROGRAM=dg4msql)
)
)
启动监听:
lsnrctl start
LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 20-7月 -2016 15:0
8:31
Copyright (c) 1991, 2010, Oracle. All rights reserved.
启动tnslsnr: 请稍候...
TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Production
系统参数文件为D:\product\11.2.0\tg_1\network\admin\listener.ora
写入d:\product\11.2.0\tg_1\diag\tnslsnr\WIN-158KFV5FSBR\listener\alert\log.xml的
日志信息
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.17.22.230)(PORT=1521)))
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.17.22.230)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Produ
ction
启动日期 20-7月 -2016 15:08:47
正常运行时间 0 天 0 小时 0 分 3 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 D:\product\11.2.0\tg_1\network\admin\listener.ora
监听程序日志文件
D:\product\11.2.0\tg_1\diag\tnslsnr\WIN158KFV5FSBR\listener\alert\log.xml
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.17.22.230)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
服务摘要..
服务 "HIS" 包含 1 个实例。
实例 "HIS", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
也可以去windows的服务中查看OracleOraGtw11g_home1TNSListener是否已经启动
2.4. Oracle服务器配置tns(可以不用配置,直接使用2.5方法二建立)
在需要建立dblink的Oracle数据库所在服务器,配置/u01/oracle/app/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
HIS =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =172.17.22.230)(PORT = 1521))
(CONNECT_DATA=(SID=HIS))
(HS=OK)
)
参考:
connect_descriptor=
(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST=host_name)
(PORT=port_number)
)
(CONNECT_DATA=
(SID=gateway_sid))
(HS=OK))
测试tns
[oracle@test admin]$ tnsping HIS
TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 20-JUL-2016 15:14:22
Copyright (c) 1997, 2013, Oracle. All rights reserved.
Used parameter files:
/u01/oracle/app/product/11.2.0/dbhome_1/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =172.17.22.230)(PORT = 1521)) (CONNECT_DATA=(SID=HIS)) (HS=OK))
OK (10 msec)
2.5. 建立DB link
在需要建立dblink的Oracle数据库所在服务器创建dblink
方式一:需要配置2.4中oracle服务器的tns
create public database link HISdbLink connect to sa identified by "admin_123" using 'HIS';
--如果创建全局 dblink,必须使用 systm 或 sys 用户,在 database 前加 public
方式二:不需要修改oracle服务器tns配置(建议)
create database link hisdb_link
connect to "sa"
identified by "xxxxx"
using '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.193)(PORT=1522))(CONNECT_DATA=(SID=HIS))(HS=OK))';
--解释如下:
HOST:指gateways所在的机器。
PORT:在gateways机器中listener.ora文件里指定的监听gateways的端口
SID:必须和gateways机器中listener.ora文件里指定的SID_NAME相同
HS=OK:指定该连接将使用Oracle的异构服务
删除dblink
DROP DATABASE LINK [name];
--或
DROP PUBLIC DATABASE LINK [name];
查询dblink
select * from dba_db_links;
2.6. 测试
SQL> SELECT * FROM ALL_USERS@MSSQL;
SQL> select 1 from dual@HISdbLink;
1
----------
1
三、遇到的错误
错误1:initdg4msql.ora错误
[SQL]select 1 from dual@HISdbLink
[Err] ORA-28545: 连接代理时 Net8 诊断到错误
Unable to retrieve text of NETWORK/NCR message 65535
ORA-02063: 紧接着 2 lines (起自 HISDBLINK)
原因:
D:\Oracle\product\11.2.0\tg_1\dg4msql\admin\initdg4msql.ora的HS_FDS_CONNECT_INFO值配置错误
错误2:透明网关的监听卡住,无法重启
相关进程没有彻底关闭,杀掉相关进程 如dg4msql.exe
错误3:ORA-02085错误解决过程
原因:
当global_name参数设置为true,则dblink必须命名为和在目标数据库如下查询出的结果一致:
在目标数据库执行查询:
SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------------------------
mydb
解决办法:
方法一:
SQL> alter system set global_names=false;
global_names参数设置为FALSE,影响的是创建数据库链接的那个库对数据库链接的使用。也就是说,如果一个库(实例)的global_names参数设值为TRUE,则该库连接其他库的数据库链接,其名称必须要与被连接的库的global_name相同。
方法二:
如果在GLOBAL_NAMES设置为TRUE的情况下,如果要建多个数据库链接到同一个库,怎么办呢?因为数据库链接的名称必须与目标库的GLOBAL_NAME相同。可以按如下的方法:
SQL> create database link dmdb@link1 connect to test identified by test using 'dmdb';
数据库链接已创建。
SQL> create database link dmdb@link2 connect to test identified by test using 'dmdb';
数据库链接已创建。
SQL> select * from dual@dmdb;
D
-
X
SQL> select * from dual@dmdb@link1;
D
-
X
SQL> select * from dual@dmdb@link2;
D
-
X
也就是在GLOBAL_NAME后面加上@再加上一个标识。这样就能够创建多个数据库链接到同一目标库上了。
另外在创建数据库链接时,不能给其他SCHEMA创建链接,这是因为数据库链接(database link)其名称可以含有'.'即点号。比如A用户想给B用户创建一个DBLINK名叫LINKB,CREATE DATABASE LINK B.LINKB ......, 这个语句将会实际创建一个A用户下的名为B.LINKB的数据库链接。
其他问题:
ORA-28545:配置的全过程中使用的SID与SQL SERVER的库名保持一致,或者由于server_name使用了IP地址
ORA-28513:listener.ora的ORACLE_HOME配置了db的路径,应改为gateways的路径。
ORA-12514:配置本地db的tnsnames.ora增加sid
ORA-28500:连接 ORACLE 到非 Oracle 系统时返回此信息:
[Generic Connectivity Using ODBC][H006] The init parameter <hs_fds_connect_info>is not set. Please set it in init.ora file.
ORA-02063: 紧接着 2 lines (起自 SQLLINK)
解决:init.ora中的orasid是MSSQL数据库中的指定的数据库名称
ORA-28500:连接 ORACLE 到非 Oracle 系统时返回此信息:
[Generic Connectivity Using ODBC][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 (SQL State: IM002; SQL Code: 0)
ORA-02063: 紧接着 2 lines (起自 SQLLINK)
解决:HS_FDS_CONNECT_INFO = WAILON-PC,此时的HS_FDS_CONNECT_INFO 的应该赋予配置的ODBC数据源的名称
ORA-02085:数据库链接 SQLLINK.TEST.COM.CN 连接到 HO.WORLD
解决:执行语句 alter system set global_names = false;
四、参考:
https://docs.oracle.com/cd/B28359_01/gateways.111/b31043/conf_sql.htm