一个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)
create public database link SQLSERVERLINK connect to sa identified by "123456" using 'dg4msql';
8. 在oracle服务器上验证
select * from hr_social@SQLSERVERLINK;
网关服务器的使用其实就是dblink的使用,dblink不能执行DDL
Select * from test_123@SQLSERVERLINK
insert into test_123@SQLSERVERLINK values (1)
delete from test_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 * from tablename@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 status listener_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
create public database link SQLSERVERLINK connect to sa identified by "123456" using 'sqlserver_DB';
12. 执行查询,看是否正常
select * from tablename@SQLSERVERLINK;