作者:莫建朝,新炬网络高级技术专家。
前段时间参与了一个informix到oracle的迁移项目。因为版本的关系,无法使用Oracle Migration Workbench和GoldenGate。
起初想法是使用文本的方式,分别通过informix的unload和oracle的sql loader工具,写成多个shell脚本进行大批量数据卸装和装载。在执行过程中,发现unload的文件中,有部分中文与分隔符形成乱码。此种乱码文件,经测试可以正常装载到informix数据库,但无法装载到oracle数据库。informix工程师和oracle工程师均没给能给出很好的解释。为了解决问题,最终考虑使用oracle公司的透明网关。
透明网关(Transparent Gateway)是Oracle公司提出实现异构服务的技术。Oracle利用透明网关的技术实现与Informix、mysql、SQL Server和DB2等多种数据库互联。
下面介绍透明网关安装方法:
一、介质准备
oracle软件安装包的第五个包,为透明网关的安装包:
二、软件安装
1)将安装包上传到oracle服务器端,解压后,运行runInstaller进行安装。
注意:在安装时,选择输入ORACLE_HOME,后面配置监听时,需要用到。
2)选择“Oracle Database Gateway for Informix 11.2.0.4.0”
3)将输入informix数据库信息。依次输入informix数据库所在的hostname或者IP、端口、INFORMIXSERVER和databasename。也可以在安装完后,修改$ORACLE_HOME/ g4ifmx/admin/init initdg4ifmx.ora。
三、配置网关
1)安装完成后,在ORACLE_HOME下生成dg4ifmx文件夹。确认initdg4ifmx.ora配置是否正确。
slin1:/u01/app/oracle/product/11.2.0/infogw/dg4ifmx/admin # cat initdg4ifmx.ora
# This is a customized agent init file that contains the HS parameters
# that are needed for the Database Gateway for Informix
#
# HS init parameters
#
HS_FDS_CONNECT_INFO=[192.168.126.21]:27019/c12_net/testdb
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
2)gateways 和oracle安装在同机器情况下,配置grid用户的listener.ora和oracle用户的tnsnames.ora即可。
listener.ora:
grid:/u01/app/11.2.0/grid/network/admin> cat listener.ora
LISTENER =
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.126.21)(PORT=1521))
)
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=dg4ifmx)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/infogw)
(PROGRAM = dg4ifmx)
)
)
tnsnames.ora:
oracle:/u01/app/oracle/product/11.2.0/db_1/network/admin> cat tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
ORA11G =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.126.31)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora11g)
)
)
dg4ifmx =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.126.21)(PORT=1521))
(CONNECT_DATA=(SID=dg4ifmx))
(HS=OK)
)
3)重启监听,并进行测试
oracle@slin1:/tmp/oraclesetup> tnsping dg4ifmx
TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 30-NOV-2015 09:08:13
Copyright (c) 1997, 2013, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.126.21)(PORT=1521)) (CONNECT_DATA=(SID=dg4ifmx)) (HS=OK))
OK (10 msec)
4)创建访问INFORMIX数据库的link
create public database link testdb connect to "username" identified by "password" using 'dg4ifmx';
5)测试连接
select count(*) from "systables"@testdb;
四、数据传输
将表分成多个脚本,进行批量传输。
语法:insert into …… select * from ……,
注意:
1)gateway不能支持大对象数据类型的传输。比如,long数据类型。
2)在处理较大表时,需分步进行commit,否则有可能会导致传输hung住。关于null 3)null值的处理上,需要提前进行处理,否则无法处理。
4)在表结构存在变化时,需要重建过dblink。
五、总结
在informix 到 oracle之间传输,使用网关进行传输时,可以避免乱码的问题,效率上也还算OK。
在数据量较大的迁移中,可以准备多种手段。比如,编写java小工具,通过JDBC进行数据传输。