一个ORACLE如果配置多个透明网关信息,则不需要安装多次网关软件,只需要安装一次,然后配置多个$ORACLE_HOME/dg4msql/admin/init网关SID.ora文件并新增多个静态监听和tns指向网关SID即可,Sqlserver用户名和密码只在oracle创建dblink时用得上
Oracle透明网关链接sqlserver
Oracle:
OS:Red Hat Enterprise
Linux Server release 5.4 amd64
DB:Oracle Database 11g
Enterprise Edition Release 11.2.0.1.0 - 64bit
Ip:10.98.20.108
Hostname:localhost2.localdomain
Sqlserver
OS:windows server 2003
x86
DB:sqlserver2005
IP:10.98.20.101
Hostname:MDSTestWeb9
实例名称:MSSQLSERVER
指向的DB:etsudc
1.在oracle服务器上安装和DB一样版本的网关软件,目录选择和DB一样的ORACLE_HOME
2.在oracle服务器查看刚刚安装好的网关软件对应的文件(initdg4msql.ora其中的dg4msql是默认的网关SID,当然也可以把文件名手工修改成initwangguan.ora,这样的话后面涉及到网关SID都要修改成wangguan了),确保和如下图一致(虽然上面安装界面要输入sqlserver的实例名称,但是下面的配置中并未出现实例名称,只出现了端口,因为sqlserver数据库,不同的实例具有不同端口,端口即代表了实例)
cat $ORACLE_HOME/dg4msql/admin/initdg4msql.ora
3.在oracle服务器上配置监听增加如下网关监听信息
(SID_DESC =
(SID_NAME =
dg4msql) #此处为配置文件SID,要与initdg4msql.ora中的名字对应(ORACLE_HOME
=/orahome/11.2/db_1)
(PROGRAM = dg4msql) #此处为配置文件目录名称,$ORACLE_HOME/dg4msql/admin/initdg4msql.ora
)
当然如果想让网关监听信息不用1521端口也可以如下实验1522端口
LISTENER_getways
=
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =
10.98.20.108)(PORT = 1522))
)
)
SID_LIST_LISTENER_getways
=
(SID_LIST =
(SID_DESC=
(SID_NAME = dg4msql)
(ORACLE_HOME = /orahome/11.2/db_1)
(PROGRAM = dg4msql)
)
)
4.在oracle服务器上重启监听查看网关监听的SID和SERVICE_NAME是什么
5.在oracle服务器上配置tns信息,新增如下(可以使用网关监听的service_name也可以使用sid,如下使用的是service_name)
dg4msql =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =
10.98.20.108)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = dg4msql)
)
(HS = OK)
)
与一般配置不同的就是(HS=OK)这句,这句指定是外部程序而不是Oracle数据库实例
6.在oracle服务器上tnsping下dg4msql通不通,如果不通检查下看看什么原因,检查tnsping没有问题后继续如下
个人操作的时候遇到tns中host是ip时tnsping不通,但是把tns中的host从ip改成hostname后正常,再改回ip也正常了,目前不知道是什么原因
7.在oracle服务器上创建dblink(最好创建成public)
createpublicdatabaselinkSQLSERVERLINKconnecttosaidentifiedby"123456"using'dg4msql';
8.在oracle服务器上验证
select*fromhr_social@SQLSERVERLINK;
网关服务器的使用其实就是dblink的使用,dblink不能执行DDL
Select * fromtest_123@SQLSERVERLINK
insertintotest_123@SQLSERVERLINKvalues(1)
deletefromtest_123@SQLSERVERLINK
update test_123@SQLSERVERLINK set
hid=8
如果需要在ORACLE上再建立一个透明网关指向另一台sqlserver服务器或指向sqlserver服务器的另一个sqlserver实例或指向sqlserver服务器该实例的另一个数据库,则只需要在步骤2中为新增一个initSID.ora文件、步骤3中为新增一个静态监听SID_DESC指向新的SID,再增加tns和创建dblink即可
如还需要在oracle服务器10.98.20.108中新建一个透明网关指向10.98.20.101中的另一个实例SQLEXPRESS的Ginkgo
1.必须给sqlserver实例SQLEXPRESS新增端口为1533
2.在oracle服务器的$ORACLE_HOME/dg4msql/admin下cp initdg4msql.ora initginko.ora,再修改initginko.ora为如下(好像只能使用[10.98.20.101]:1533//Ginkgo这样的配置,其他如[10.98.20.101]:1533/SQLEXPRESS/Ginkgo或[10.98.20.101]/SQLEXPRESS/Ginkgo都不行)
3.再在oracle服务器上配置监听增加如下网关监听信息
4.重启监听后再在oracle服务器上查看新增网关的sid和service_name是什么
5.再在oracle服务器上配置tns增加如下信息
6.再在oracle服务器上创建dblink,验证即可
透明网关遇到的一些问题
select*fromtablename@SQLSERVERDBLINK时报错ORA-00600:内部错误代码,参数: [HO define: Long fetch]
原因:sqlserver表中的数据类型有大文本类型或字段太多超出了限制,不要使用*,直接写出字段名
Select字段名报错ORA-00904无效的列名或者标识符
原因:sqlserver建的表时用了双引号括起来的列名,select column时”column”加双引号
RAC配置透明网关的方法
RAC环境介绍
OS:linux
DB:Oracle 11GR2
两个节点,节点1的ip10.98.0.147,节点2的ip10.98.0.148
1.没有安装透明网关之前,两个节点的oracle用户下面的$ORACLE_HOME都不存在dg4msql目录
2.下载getways软件放到任意一个节点上(放到一个节点上就可以了),并授予oracle:oinstall权限,chown –R oracle:oinstall getways
3.在有安装包的节点上使用Oracle用户安装getways,安装界面默认自动勾选cluster installation,会自动安装到两个节点上
4. 两个节点的oracle用户下面的$ORACLE_HOME都有dg4msql目录了,查看两个节点的/u01/app/oracle/product/11.2.0/db_1/dg4msql/admin/initdg4msql.ora都有类似如下配置(IP、端口、DB,不会出现实例是因为端口即代表了实例)
5.修改监听前,节点1和节点2的的监听信息如下,RAC的监听信息在grid用户目录下
节点1有listener和listener_scan1两个监听器
节点2有listener一个监听器
6.参考以上两个实例的监听信息,我们了解到只能修改listener的监听器的信息,因为两者都有这个监听,节点2没有listener_scan1这个监听器,就算有,也不要修改这个监听信息,因为只有listener监听在oracle用户下面执行lsnrctl status有能看到信息,而listener_scan1在oracle用户下执行lsnrctl statuslistener_scan1压根看不到任何信息,修改监听的方法为在grid用户下执行netmgr,具体如下图
节点1修改为如下
节点2修改为如下
7.重启监听信息,在grid用户下执行srvctl stop listener、srvctl start listener
8.在grid或oracle用户下执行lsnrctl status都发现了透明网关的service
9.修改两个节点的oracle用户下的$ORACLE_HOME/network/admin/tnsname.ora文件,新增如下配置
节点1
Sqlserver_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =10.98.0.147)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dg4msql)
)
(HS = OK)
)
节点2
Sqlserver_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =10.98.0.148)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dg4msql)
)
(HS = OK)
)
10.Oracle用户下执行tnsping sqlserver_DB看是否正常
11.创建DBlink
createpublicdatabaselinkSQLSERVERLINKconnecttosaidentifiedby"123456"using'sqlserver_DB';
12.执行查询,看是否正常
select*fromtablename@SQLSERVERLINK;