ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 从Oracle访问SQL Server(GATEWAYS)

从Oracle访问SQL Server(GATEWAYS)

原创 Linux操作系统 作者:wailon 时间:2013-11-09 16:45:30 0 删除 编辑

通过数据链接(Database Link),从Oracle 10g 连接 SQL Server 2000(实例)

从Oracle 10g连接SQL Server2000,需要用透明网关(Transparent gateways),通过它我们可以 sqlplus 操纵其他数据库,如 ms sqlserver 、 sybase 、 infomix 等,实现数据库的异构服务。

一、安装Transparent gateways for Windows SQL Server:
 注意:安装的之前必须要将原数据库服务器启动起来,不然会重复安装OraTg10g_home1数据库软件,这样就会有两个数据库软件,导致listener混乱。
 1. 下载10201_gateways_win32.zip文件并解压
 2. 进入10201_gateways_win32文件夹,点击setup.exe
 3. 按Next,选择Oracle Transparent gateways for Microsoft SQL Server 10.2.0.1.0 ,按Next
 4、有一步需要填写SQL 服务器名和SQL的数据库名
 5. 接着安装。
 6. 安装完毕之后,在Oracle的D:/oracle/product/10.2.0/db_1主目录下,会有tg4msql文件夹

注:设置gateways机器(gateways可以和Oracle Database在同一台机器上,也可以分开)。
 
二、配置:
 我的环境设置是将gateways和Oracle Database在设置在同一台机器
 我的环境:
 Oracle 服务器:
     OS: Windows Server 2003(SP2)
     IP: 192.168.16.82
     PORT: 1521
 SQL 服务器:
     OS: Windows Server 2003
     IP: 192.168.16.82
     Database Name: wailon

(一)通过tg4msql连接:
 1. 在Oracle的D:/oracle/product/10.2.0/tg_1/tg4msql/admin目录下,拷贝inittg4msql.ora并改名为init.ora。
    例如,默认的SID是ELE_OA,那么我的文件名是initELE_OA.ora。

2. 配置init.ora,以我的例子,如下:
 ******************************
 # This is a sample agent init file that contains the HS parameters that are
 # needed for the Transparent gateways for SQL Server

#
 # HS init parameters
 #
 #11g的HS_FDS_CONNECT_INFO格式server_name:port//dbname,server_name不能使用IP地址,如果配置有问题,连LISTENER都无法启动
 #
 HS_FDS_CONNECT_INFO="SERVER=192.168.16.83;DATABASE=ELE_OA"
 HS_FDS_TRACE_LEVEL=OFF
 HS_FDS_RECOVERY_ACCOUNT=RECOVER
 HS_FDS_RECOVERY_PWD=RECOVER
 *******************************

3、配置Oracle的D:/oracle/product/10.2.0/tg_1/network/admin目录下的listener.ora
 修改为:
 SID_LIST_LISTENER =
   (SID_LIST =
     (SID_DESC =
       (SID_NAME = PLSExtProc)
       (ORACLE_HOME = D:/oracle/product/10.2.0/db_1)
       (PROGRAM = extproc)
     )
     (SID_DESC=
       (SID_NAME=ELE_OA)    --对应tg4msql\admin目录下的init文件
       (ORACLE_HOME=D:/oracle/product/10.2.0/db_1)
       (PROGRAM=tg4msql)  --这个值不能修改,11g的为dg4msql
     )

  )
 LISTENER =
   (DESCRIPTION_LIST =
     (DESCRIPTION =
       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.82)(PORT = 1521))
     )
   )

4.配置Oracle的D:/oracle/product/10.2.0/tg_1/network/admin目录下的tnsnames.ora如下:
 MSQL =
   (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.16.82)(PORT = 1521))
     )
     (CONNECT_DATA =
       (SID = ELE_OA)
     )
     (HS = OK)
   )
 解释如下:
 HOST:指gateways所在的机器。
 PORT:在gateways机器中listener.ora文件里指定的监听gateways的端口
 SID:必须和gateways机器中listener.ora文件里指定的SID_NAME相同
 HS = OK:指定该连接将使用Oracle的异构服务

5、检查ORACLE_HOME/network/admin/sqlnet.ora
 # sqlnet.ora Network Configuration File: D:/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora
 # Generated by Oracle configuration tools.
 # This file is actually generated by netca. But if customers choose to
 # install "Software Only", this file wont exist and without the native
 # authentication, they will not be able to connect to the database on NT.
 SQLNET.AUTHENTICATION_SERVICES= (NTS,NONE)
 NAMES.DIRECTORY_PATH = (TNSNAMES, HOSTNAME)


注意
如果文件中包含:
 names.directory_path = (TNSNAMES, HOSTNAME)
 names.default_domain = world
 name.default_zone = world
 这些行,那么配置的第4点中的connect_descriptor必须添加.world后缀(如上例中MSQL必须为MSQL.world)
 参考文档中的:
 connect_descriptor=
    (DESCRIPTION=
       (ADDRESS=
          (PROTOCOL=TCP)
          (HOST=host_name)
          (PORT=port_number)
       )
       (CONNECT_DATA=
          (SID=gateways_sid))
       (HS=OK))

 connect_descriptor is the description of the object to connect to as specified when creating the database link, such as tg4msql. Check the sqlnet.ora file in the Oracle database server's ORACLE_HOME for the following lines:
 names.directory_path = (TNSNAMES, HOSTNAME)
 names.default_domain = world
 name.default_zone = world
 Note: If the Oracle database server is on Microsoft Windows, the file is ORACLE_HOME/network/admin/sqlnet.ora.

6、动态修改global_names参数值:
 alter system set global_names = false;

否则会在执行sql时报错:ORA-02085: 数据库链接MSQL与HO.WORLD相连结
原因如下:The GLOBAL_NAMES parameter when set to TRUE implies that database link name should be similar to the Global database name to which you are trying to connect.

7. 重启LISTENER服务
 lnsrctl stop
 lsnrctl start

8. 用sqlplus建立并测试Database Link
 sqlplus /nolog
 SQL> connect sys/test@ORCL88 as sysdba      ---->用sysdba的身份登陆
 --建立Database Link
1) SQL>CREATE PUBLIC DATABASE LINK MSQL CONNECT TO  sa IDENTIFIED BY sa USING 'MSQL';
 注:connect to后面是用户名,identified by后面是密码,using后面是SID。这些信息都是SQL SERVER的。

2)SQL> create public database link ELE_OA connect to "sa" identified by "sa" using
 '(DESCRIPTION =
 (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.16.82)(PORT=1522)) (CONNECT_DATA=(SID=ELE_OA))
 (HS = ok))';

SQL>select * from dual@MSQL;
 查询成功!

--例子
 create public synonym t_email for t_email@ELE_OA;
 insert into t_email("UnitId") values('11110);

drop public database link msql;


常见问题:

ORA-28545,配置的全过程中使用的SID与SQL SERVER的库名保持一致,或者由于server_name使用了IP地址

ORA-28513  listener.ora的ORACLE_HOME配置了db的路径,应改为gateways的路径

ORA-12514  配置本地db的tnsnames.ora增加sid

 


(二)通过hsodbc连接:
 1. 在ODBC中建立SQL Server连接的System DSN,使用机器名WAILON-PC。(步骤不详述,请查MSDN)
 可参考http://www.databasejournal.com/features/oracle/article.php/10893_3442661_1/Making-a-Connection-from-Oracle-to-SQL-Server.htm

2. 在Oracle主目录下D:/oracle/product/10.2.0/db_1/hs/admin的目录下,拷贝inithsodbc.ora并改名为initwailon.ora。这次,我用的SID是WAILON,所以文件名是WAILON。如下:
 HS_FDS_CONNECT_INFO后面是数据源名称。
 ******************************
 # This is a sample agent init file that contains the HS parameters that are
 # needed for an ODBC Agent.
 #
 # HS init parameters
 #
 HS_FDS_CONNECT_INFO = WAILON-PC
 HS_FDS_TRACE_LEVEL = OFF
 #
 # Environment variables required for the non-Oracle system
 #
 #set =
 ******************************
 注意:HS_FDS_CONNECT_INFO后面是数据源名称

3. 配置listener.ora,加入下面一段:
 ******************************
    (SID_DESC=
       (ORACLE_HOME = D:/oracle/product/10.2.0/db_1)
       (SID_NAME = wailon)
       (PROGRAM = hsodbc)
     )
 ******************************
 修改为:
 # listener.ora Network Configuration File: D:/oracle/product/10.2.0/db_1/network/admin/listener.ora
 # Generated by Oracle configuration tools.

SID_LIST_LISTENER =
   (SID_LIST =
     (SID_DESC =
       (SID_NAME = PLSExtProc)
       (ORACLE_HOME = D:/oracle/product/10.2.0/db_1)
       (PROGRAM = extproc)
     )
    (SID_DESC=
       (ORACLE_HOME = D:/oracle/product/10.2.0/db_1)
       (SID_NAME = wailon)
       (PROGRAM = hsodbc)
     )
   )

LISTENER =
   (DESCRIPTION_LIST =
     (DESCRIPTION =
       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.82)(PORT = 1521))
     )
   )

4. 配置tnsnames.ora,如下:
 ******************************
wailon  =
   (DESCRIPTION=
     (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.16.82)(PORT=1521))
     (CONNECT_DATA= (SID = wailon))
     (HS=OK)
   )

此处的HOST是指MS SQL数据库所在的IP
 ******************************
 5、重启LISTENER服务
 6、连接测试:
 创建数据库连接:
 drop  database link sqlLink ;
 sql>create database link sqlLink connect to sa identified by "sa" using 'wailon';
 sql>select * from ttemp4@sqlLink;


 
常见问题:
ORA-28500: 连接 ORACLE 到非 Oracle 系统时返回此信息:

 [Generic Connectivity Using ODBC][H006] The init parameter is not set. Please set it in init.ora file.
 ORA-02063: 紧接着 2 lines (起自 SQLLINK)
 解决:init.ora中的orasid是MS SQL数据库中的指定的数据库名称


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;语句

解决上面的问题之后查询成功!!

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/429786/viewspace-776193/,如需转载,请注明出处,否则将追究法律责任。

上一篇: SQLPLUS显示乱码
下一篇: SQL SERVER执行脚本
请登录后发表评论 登录
全部评论

注册时间:2013-11-08

  • 博文量
    51
  • 访问量
    294582