自己的本机安装了Oracle 12c,公司的平台需要同时支持Oracle与SQL Server,很多时候都有将数据从Oracle同步到SQL Server的需求。通过SQL Server的link Server可以达到目的,但是因为SQL Server都是64位版本,试过很多次都失败了。再安装32位SQL Server也懒得折腾。
因Oracle是12c, 安装的Gateways也是12c。尝试过在Oracle数据库服务器(本机)安装11g的gateways, 但是配置都失败了。
Oracle Gateways 12c的下载地址也在Oracle Database 12c的下载页。找到与自己数据库版本的对应的Gateways。
安装前,设置了一下环境变量ORACLE_HOME,我的是:C:\oracle\product\12.1.0\dbhome_1
安装时,选择自己需要访问的数据库,这里是SQL Server.这里将Gateways安装到了与Oracle数据库软件相同的目录。
安装过程:
配置是重点。网上找到的都是10g的配置。12c的目录名称与10g的稍有区别:
listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\oracle\product\12.1.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\oracle\product\12.1.0\dbhome_1\bin\oraclr12.dll")
)
(SID_DESC =
(SID_NAME = dg4msql)
(ORACLE_HOME = C:\oracle\product\12.1.0\dbhome_1)
(PROGRAM = dg4msql)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
在tnsnames.ora添加以下内容:
dg4msql =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SID = dg4msql)
)
(HS = OK)
)
在ORACLE_HOME/dg4msql/admin/initdg4msql.ora
确认文件initdg4msql.ora中有以下内容():
HS_FDS_CONNECT_INFO=server name,port number//database name
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
创建一个DB Link:
create public database link MS_LINK
connect to sa identified by password
using 'dg4msql';
重启监听。
使用select * from table@ms_link的形式访问SQL Server表。不可以直接使用insert into table@ms_link select * from table向SQL Server表插入数据。错误提示是源表与目标表都应在同一个数据库。
我的解决方法是使用一段匿名脚本一次一条数据。不知道有没有更好的办法。
至此,已经可以成功在Oracle数据库中访问SQL Server的数据了。