1,问题背景
公司为用户研发了一个项目,该项目的数据源为Oracle,但是项目的某些功能 模块需要从另外的数据库读数据,这个另外的数据库是用户自己另外的一个项目系统使用的sqlserver数据库。
于是需要部署Oracle到sqlserver的透明网关,实现在Oracle里透明的访问其他不同的数据库,这个查询sqlserver的过程如图:
2,操作环境
在用户数据库服务器群中,公司获得一台数据库服务器,并且部署本项目的oracle数据库服务器,而需要读取的sqlserver数据在另一台数据库服务器中。我为了测试网关部署操作,把对应的oracle和sqlserver以及网关都放到自己的本地电脑上
相关软件:win10 64为操作系统,oracle 11g r2(11.2.0.1.0),oracle对应版本的网关,sqlserver2008 r2
3,部署网关具体步骤
3.1,下载和安装oracle数据库
如果系统本身已经有Oracle,你想彻底删除Oracle重新下载,请参考:彻底卸载oracle
接下来安装Oracle(网关安装包留待后面处理),请参考:安装oracle。具体要下载的两个软件为:
3.2,本地安装sqlserver数据库
如果系统本身已经有sqlserver,你想彻底删除sqlserver重新下载,请参考:彻底卸载sqlserver
接下来安装sqlserver,请参考:安装sqlserver
3.3,安装Oracle网关
把从Oracle官网下载下来的网关压缩包解压,点击setup.exe,会依次出现下面操作:
1)
2)
3)
4)
5)
3.4,配置文件修改
3.4.1,网关安装目录
安装完网关软件后,在D:\app\23780\product\11.2.0\tg_1(Oracle安装目录)有一下dg4msql的目录,这就是网关软件的目录
3.4.2,操作initdg4msql.ora
进入目录D:\app\23780\product\11.2.0\tg_1\dg4msql\admin,可以看到文件initdg4msql.ora,修改成如下(如果按照本篇博文全部处理了一遍,但是执行跨网关查询时抛错,可以考虑:HS_FDS_CONNECT_INFO=[.]//db_test):
# 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=127.0.0.1//db_test
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
其中127.0.0.1代表sqlserver所在机器的ip,db_test代表sqlserver数据库的名称。
接下来,复制一份initdg4msql.ora文件到当前目录,并且重命名为inittest.ora,里面的内容和initdg4msql.ora相同。“inittest.ora”中的“test”字符串对应一个sid名称(命名随意),这个sid后面需要用到
3.4.3,配置网关的监听器,处理oracle的查询请求,类似Oracle本身的监听器的作用
进入目录D:\app\23780\product\11.2.0\tg_1\NETWORK\ADMIN,配置文件listener.ora,如下:
# listener.ora Network Configuration File: D:\app\23780\product\11.2.0\tg_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = dg4msql)
(ORACLE_HOME = D:\app\23780\product\11.2.0\tg_1)
(PROGRAM = dg4msql)
)
(SID_DESC =
(GLOBAL_DBNAME = test)
(SID_NAME = test)
(ORACLE_HOME = D:\app\23780\product\11.2.0\tg_1)
(PROGRAM = dg4msql)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = LAPTOP-KK3DOK73)(PORT = 1522))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
)
)
ADR_BASE_LISTENER = D:\app\23780\product\11.2.0\tg_1
其中“GLOBAL_DBNAME = test”和“SID_NAME = test”的“test”都对应之前步骤指定的sid。
“ (ADDRESS = (PROTOCOL = TCP)(HOST = LAPTOP-KK3DOK73)(PORT = 1522))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))”中指定的“LAPTOP-KK3DOK73”对应当前电脑的计算机全名(右键“我的电脑”,选择“属性”选项可以查阅),1522为网关端口,随意指定,但要符合端口规范,EXTPROC1522对应网关端口号
3.4.4,启动网关监听
以管理员身份(必须管理员身份)打开cmd,然后执行命令“lsnrctl start”,打开windows的“服务”,如下:
3.4.5,配置Oracle的tns
进入目录D:\app\23780\product\11.2.0\dbhome_1\NETWORK\ADMIN,编辑tnsnames.ora:
# tnsnames.ora Network Configuration File: D:\app\23780\product\11.2.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
test =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1522))
(CONNECT_DATA=(SID=test))
(HS=OK)
)
对于“ test =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1522))
(CONNECT_DATA=(SID=test))
(HS=OK)
)”这几行,“test”对应sid,“127.0.0.1”对应网关所在机器ip,“1522”对应网关端口,端口号随意指定,只要合理就行,需要和上面步骤提到的网关端口号保持相同
3.5,操作dblink
3.5.1,在Oracle中建立dblink
1)错误描述:
create public database link my_db_link connect to zj identified by "1234" using 'db_test';//注意双引号和单引号的差别
其中,“my_db_link”为dblink的名称,“zj”和“1234”分别代表sqlserver的一个账户名称和密码,“db_test”代表sqlserver数据库名称
2)正确描述:
create public database link my_db_link connect to zj identified by "1234" using 'test';//注意双引号和单引号的差别
其中,“my_db_link”为dblink的名称,“zj”和“1234”分别代表sqlserver的一个账户名称和密码,“test”代表新增的SID名称
3.5.2,在Oracle中读sqlserver数据
select * from STUDENT@my_db_link ;
其中STUDENT为sqlserver中的数据表名称
4,题外话
4.1 Oracle服务的netmanger中的配置应该会如此:
1)地址1
2)地址2
3)地址3
4.2 Oracle透明网关服务的netmanger中的配置应该会如此:
1)地址1
2)地址2
4.3 做了各类配置的更改,一般都要重启服务或者监听,并且配置文件生效可能需要一两分钟的时间