从Sybase IQ到Oracle

最近工作有个项目需要每天从Sybase IQ取数到Oracle数据库,因此研究了许多方法,目前仍未成功过。记录下这坎坷的过程。
一、在本地搭建Oracle环境
分别安装oracle11gR2、SQL Developer两个软件。

以下开始试图访问,基本思路就是在Oracle创建访问sybase的dblink。
二、通过透明网关
这一方式就是三个配置:配置透明网关、透明网关的监听、TNS
Oracle公司提出的透明网关技术可用于实现与其他多种类型的数据库的互联,实现不同类型数据之间建立连接,方便于使用者进行查询。
在官网可以直接根据Oracle版本下载,这里使用的是win64_11gR2_gateways。
1.配置透明网关
来到$ORACLE_HOME/dg4sybs/admin目录,有一个配置文件initdg4sybs.ora。
这里我研究了别人的路径,有些是
D:\product\11.2.0\dbhome_1\dg4sybs\admin\initdg4sybs.ora
D:\product\11.2.0\tg_1\dg4msql\admin\initdg4msql.ora
这是由于在安装gateways选择的路径问题,现在不是很清楚这个的影响,不过感觉还是第一种比较好。
拷贝出这个文件,重命名为initSID.ora,其中SID是你自己命名的,这里我命名为initwyts。

HS_FDS_CONNECT_INFO=192.168.1.1:1520//WYTS
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER

关键:第一行是 Sybase数据库的IP、端口、数据库名
2.配置透明网关的监听
来到D:\product\11.2.0\tg_1\NETWORK\ADMIN\listener.ora。

SID_LIST_LISTENER =
   (SID_LIST =
     (SID_DESC =
     (PROGRAM = dg4sybs)
     (SID_NAME = initwyts)
     (ORACLE_HOME = D:\product\11.2.0\tg_1)
    )
  )   
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
    )
  )

ADR_BASE_LISTENER = D:\product\11.2.0\tg_1

关键:由于透明网关和Oracle数据库配置在同一台服务器,因此端口号改为1522,其中program为dg4sybs,这是指安装要透明网关后生成的dg4sybs.exe程序,可以在Bin下查找到。
3.配置tns信息,来到D:\product\11.2.0\tg_1\NETWORK\ADMIN\tnsnames.ora
Oracle中TNS的完整定义:transparence Network Substrate透明网络底层,监听服务是它重要的一部分。

TNS是Oracle Net的一部分,专门用来管理和配置Oracle数据库和客户端连接的一个工具,在大多数情况下客户端和数据库要通讯,必须配置TNS。

wyts=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =localhost)(PORT = 1522))
    (CONNECT_DATA=(SID=wyts))
    (HS=OK)
  )

4.重启oracle监听服务和透明网关服务

lsnrctl stop
lsnrctl start

测试是否成功

tnsping wyts

5.建立DBLINK

CREATE PUBLIC DATABASE LINK SYS_LINK CONNECT TO "username" IDENTIFIED BY "password" USING 'WYTS';

访问测试

select * from dual@SYS_LINK ;

终于好不容易进行到这一步了,报了一个错,原来我安装的这个网关是支持Sybase ASE的,还没有找到Sybase IQ的相关资料。止步于此。

三、通过ODBC连接到Sybase
1.下载Sybase Client客户端
2.创建连接到Sybase数据库的ODBC数据源,命名为syodbc
控制面板——管理工具——ODBC(数据源)
3.Oracle连接ODBC数据源

oracle连接ODBC数据源有两种方式,hsodbc和dg4odbc,简单说dg4odbc是hsodbc的升级。

可以通过在命令行输入hsodbc或者dg4odbc来检测,通过检测,我的连接方式为dg4odbc,而且也可以看到在BIN中有这个程序dg4odbc.exe。
来到$ORACLE_HOME/hs/admin目录,有一个配置文件initdg4odbc.ora(或者inithsodbc.ora)
拷贝出这个文件,重命名为initSID.ora。我的SID为syodbc,因此重命名为initsyodbc.ora。
HS_FDS_CONNECT_INFO =syodbc
HS_FDS_TRACE_LEVEL = 0
关键:DSN名称就是刚刚配置的ODBC数据源

4.配置监听
来到D:\product\11.2.0\tg_1\NETWORK\ADMIN\listener.ora。
添加如下代码:

(SID_DESC =
      (SID_NAME = syodbc)
      (ORACLE_HOME =  D:\product\11.2.0\tg_1)
      (PROGRAM = dg4odbc)
    )

5.配置tns信息
来到D:\product\11.2.0\tg_1\NETWORK\ADMIN\tnsnames.ora
添加如下代码:

syodbc=
(DESCRIPTION =
       (ADDRESS_LIST =
           (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
       )
       (CONNECT_DATA = (SERVICE_NAME = syodbc))
       (HS = OK)
)

这里有疑问的地方就是,有些教程是采用SID的,不知道是否有影响

(CONNECT_DATA = (SID= syodbc))

6.重启oracle监听服务和透明网关服务

lsnrctl stop
lsnrctl start

测试是否成功

tnsping wyts

7.建立DBLINK

CREATE PUBLIC DATABASE LINK SYS_LINK CONNECT TO "username" IDENTIFIED BY "password" USING 'WYTS';

访问测试

select * from dual@SYS_LINK ;

目前项目卡在一个错误上,ORA-28545

ORA-28545 error diagnosed by Net8 when connecting to an agent

Cause: An attempt to call an external procedure or to issue SQL to a non-Oracle system on a Heterogeneous Services database link failed at connection initialization. The error diagnosed by Net8 NCR software is reported separately.

Action: Refer to the Net8 NCRO error message. If this isn’t clear, check connection administrative setup in tnsnames.ora and listener.ora for the service associated with the Heterogeneous Services database link being used, or with ‘extproc_connection_data’ for an external procedure call.
谷歌翻译后为:
连接到代理程序时由Net8诊断出的ORA-28545错误

原因:在连接初始化时,尝试调用外部过程或向异构服务数据库链接上的非Oracle系统发出SQL失败。 Net8 NCR软件诊断出的错误单独报告。

操作:请参阅Net8 NCRO错误消息。 如果不清楚,请检查tnsnames.ora和listener.ora中的连接管理设置,以查找与正在使用的异构服务数据库链接关联的服务,或使用“extproc_connection_data”进行外部过程调用。
经过其他博主经验分享,应该是listener的名字出错,不过我目前也没有找到解决方法。

8.经过研究,我点开了Oracle安装时自带的Net Manager,发现我的Listener的监听端口是22,而实际上应该是21,修改,果然。

9.又重新新的测试,select * from dual@SYS_LINK ;

最后的报错是:

提示在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配。这个错误是因为我安装的Oracle是64位的,但是ODBC驱动程序是32位。

为了简便,我肯定是下载64位ODBC的。终于找到了一个靠谱的答案。

sybase下载Answer 结果,这是SAP公司提供给SAP企业用户使用的,并且也是不开源的。

sybase 导出数据表为sql语句_sybase 导出数据表为sql语句


我只能看着这个望洋兴叹,行吧。

四、卸载Oracle64位,安装Oracle32位

其实前辈建议我直接跑语句,这样可能方便一点,但是我对于Oracle和Sybase实在不熟,加上项目比较急,这个过程由于自己的操作也折腾了几个小时,总之,卸载一定要卸载干净。

在64位的机器上安装32位的Oracle也是错误很多,我记下比较重要的一个,就是安装的时候没方法安装实例。这个时候我选择了跳过,再手动安装。其实Oracle本身就提供了一个安装实例的软件,我们使用DBCA工具创建自己的数据库,实例名称命名为orcl。

再重复使用ODBC的操作。

回到第四步。

五、今天在测试的时候终于成功了。

但是,还是在前期遇到了许多问题:一并总结如下

1.ORA-01017: invalid username/password; logon denied 错误

出现这个错误说明:你的ODBC已经成功连接到Sybase数据库,Oracle数据库已经成功对接到ODBC,但是用户名密码写错了。我看了一下,错误就在于

CREATE PUBLIC DATABASE LINK SYS_LINK CONNECT TO "username" IDENTIFIED BY "password" USING 'WYTS';

这一步中,密码输入错误了