SQL复制是DB2数据库技术中比较成熟的一种企业级复制技术,它能支持众多的源数据库类型和目标数据库类型,比如源数据库可以是DB2、Oracle、MS SQLSERVER、Sybase和Informix等等,而目标数据库也同样可以是上面这些主流数据库。本文将主要介绍通过DB2 Information Integrator(现在改名为Websphere Information Integrator,简称为WSII)技术以及SQL Replication技术来实现从Oracle到Informix的复制。
SQL复制是一种强大的复制技术,结合WebSphere Information Integrator技术,DB2可以实现不同操作系统平台下的异构数据库之间的复制。在笔者原来接触过的案例中,大部分都是从Oracle(Informix)复制到DB2,或者从DB2复制到Oracle(Informix)。但是不久前,笔者接触到一个很有趣的案例,就是客户希望能将Oracle中的数据复制到其Informix数据库中。鉴于Informix数据库本身所具有的一些特殊性,搭建起这样的复制环境需要特别注意一些参数方面的设置,否则很容易出错。本文档即讲述相关的操作步骤和应该注意的地方。
在实际操作之前,读者应该具有DB2数据库的相关管理操作的基本概念和基础知识,同样也应该对Websphere Information Integrator和SQL Replication有相关了解。如果需要对这些部分的内容有更多了解,请参见本文后面的相关网站链接。
本文档主要分为四个大部分:第一个部分是安装DB2以及Informix wrapper组件,第二个部分是安装Informix及Informix数据库基本概念和操作,第三个部分是在DB2数据库中创建Informix wrapper和Oracle wrapper,第四个部分是创建从Oracle到Informix的SQL复制环境。对于每一个部分,都包括了相关的操作步骤和相关问题的分析和解决等内容。另外,本文最后还对Informix比较特殊的大小写问题附带了一个附注部分来做专门介绍。
1. 平台的选择
本文以Windows平台(Win XP)来说明相关的操作步骤。在其他操作系统平台下,如Unix或者Linux下,实现方法将是类似的,故在此不再赘述。
2. 软件的安装
读者需要安装好DB2和Informix。依据相关安装文档执行即可。笔者的安装版本信息如下:
DB2 V82 FP11 (V81或者V82其他版本亦可)
Informix 9.4 (其他版本没有试验过,应该也是类似的)
3. 本文的相关约定
为了便于读者学习和实践本文,下面给出了笔者在实际操作过程中所建立起来的环境的相关具体信息,读者当然也可以对自己的相关机器和对象指定其他的名称。
- 主机和DB2的相关设置信息(DB2的相关信息为默认信息)
- Oracle、DB2和Informix中的被使用到的数据库信息
注意: 在使用复制功能之前,DB2数据库SOURCE和TARGET应该将日志模式设置为archive logging模式(归档日志模式),这是使用复制功能所必需设置的重要参数之一。本文假定这两个数据库都已经创建成功并已做好相关设置。
- 本文中创建的Wrapper的相关信息
本文一共创建了两个wrapper,一个是Oracle的wrapper,位于DB2数据库SOURCE中,另外一个是Informix的wrapper,位于DB2数据库TARGET中。
第一部分 安装DB2以及Informix wrapper组件
本部分主要介绍DB2的安装以及相应的Informix wrapper的安装过程。因为Informix wrapper的安装和其他数据源如Oracle 的wrapper的安装不太一样,所以在这里特别讲述一下。
具体步骤如下:
1. 按照正常方式安装DB2即可。笔者安装的DB2 版本信息如下:
C:\Program Files\IBM\SQLLIB\BIN>db2level
DB21085I 实例 "DB2" 使用 "32" 位和 DB2 代码发行版 "SQL08024",级别标识为
"03050106"。
参考标记为 "DB2 v8.1.11.973"、"s060120" 和 "WR21365",修订包为 "11"。
产品是在 "C:\PROGRA~1\IBM\SQLLIB" 处安装的。
2. 安装好DB2后,安装相应的关系型wrapper。对应的安装包叫做RCON.zip。解压并执行其中的setup.exe即可进行安装。对于大部分数据源如oracle等来说,这部分即完成了Wrapper的安装,如图1所示,用户可以选择相应的wrapper选项:
图1:Wrapper 选项
但是在目前的下拉选项中,我们并不能看见Informix相关的wrapper的选项,这就需要步骤3来完成实现。
3. 打开Windows中的添加或删除程序,其中我们可以看到"DB2 Enterprise Server Edition",选中之,并点击右侧的"更改"按钮,如下图所示:
图2:更改 DB2 Enterprise Server Edition 的安装
然后将会弹出如下界面,点击其中的"下一步"即可。
图3:DB2 安装向导
此时出现如下界面,选择其中的"修改"选项,并继续单击"下一步"。
图4:修改安装
此时出现可以选择Informix wrapper相关信息的界面,如下所示。
图5:选择Informix 数据源支持
我们展开上图中的"服务器支持"节点,可以看到"Informix数据源支持"前面有一个红色的小叉,我们点击相应的那个小的倒三角形的图标,然后选择安装该功能以及其所有子功能到本地硬盘,然后点击"下一步",然后完成即可。通过这些步骤,我们就把Informix的wrapper安装成功了。成功安装Informix的wrapper是完成其他数据源和Informix数据库之间进行复制的必需过程,因为wrapper所对应的Federation层是复制功能的底层组件,在复制过程中需要通过调用Informix的wrapper来完成必要的逻辑操作。
第二部分 安装Informix及Informix数据库基本概念和操作
本部分主要介绍Informix的安装,以及如何对Informix进行一些基本的操作。
1.安装的具体步骤如下:
1. 和安装DB2类似,按照正常方式安装Informix即可。需要注意的就是在填Dynamic Server Name的时候,这个名字在后面的操作步骤中需要经常使用到,此处笔者使用的是ids10。
图6:Informix 数据库名称
2. 上面的第1个步骤是Informix的最基本安装。如果要使Informix对中文等非英文语言有支持的话,需要再安装Informix的语言包。在笔者informix_94_win版本中,该语言包叫做C511MML,直接执行其中的setup.exe,然后在安装过程中注意选择中文等相关的语言支持即可。
3. 为了使DB2能够和Informix之间通过wrapper进行交互,需要对DB2的db2dj.ini文件进行编辑,该文件位于{DB2安装目录}\cfg\ 这个子文件夹中。加入如下图蓝色方框中所示的设置。其中INFORMIXDIR是Informix的安装路径,而INFORMIXSERVER是Informix服务器的名称。需要特别注意的是CLIENT_LOCALE,这个参数的设置是为了支持中文而设置的,在此处设置为EN_US.CP1252即可。如果不加上这个参数的话,在后面的操作中很有可能会出现Locale conversion相关的错误。
图7:修改 CLIENT_LOCALE 参数
2.Informix服务器的启动和停止
Informix服务器的启动和停止,可以通过Windows中的服务面板来控制,如下图所示。其中Informix IDS - ids10就是我们的Informix服务器,通过这里我们可以控制Informix服务器的运行状态。请确保在执行后面的操作的时候,我们的Informix处于"已启动"状态。
图8:启动或停止 Informix 服务器
3.Informix的客户端
安装好Informix后,有一个客户端叫做dbaccess,它在桌面上的图标如下所示。双击这个图标,即可进行相关的Informix的数据库操作,篇幅起见,本文对此仅作简要介绍。
图9:Informix 客户端环境
双击上面的图标,会出现如下的界面,从这个界面我们可以看到Informix的一些重要的参数设置信息。
图10:查看参数设置
在上面命令行方式下敲入dbaccess,我们就会进入到Informix的操作界面。如下图所示。图中提供了一些基本选项,我们可以通过使用键盘中的方向键来进行选择。现在假定我们的操作目标是在Informix中建立一个新的数据库,名字叫testdb。那么选择其中的"Database",并按照提示创建数据库即可。创建好以后,如果要连接数据库并进行相关的进一步操作如创建数据库表等等,那么可以再选择"Connection"进行相应操作,等等。如果需要对dbaccess有更多了解,请参阅<< Administrators_Guide_v9.pdf >>。
图11:dbaccess 命令
事实上,在笔者的使用过程中,觉得dbaccess的易用性不是很强,读者可以使用一些其它的客户端来进行操作,如网际数据库浏览器等,此处不再赘述。
第三部分 在DB2数据库中创建Informix wrapper和Oracle wrapper
安装好Informix wrapper以后,我们就可以开始在DB2数据库中创建Informix wrapper了。(这里我们假定DB2中已经创建了两个新的数据库,名字分别是SOURCE和TARGET,并且都已经被设置成archive logging模式,即归档日志模式)
具体步骤如下:
1.完成包装器的创建。打开DB2控制中心,展开TARGET数据库节点(我们在TARGET数据库中创建Informix wrapper),并右键单击"联合数据库对象",如下所示。
图12:创建包装器
在上图中选择"创建包装器"(包装器即wrapper的中文翻译),弹出如下界面,这个时候我们就会发现,在下拉框中已经有"Informix"这个选项了,选中之。
图12:选择包装器类型
然后在上图对应的库名中,将会自动出现"db2informix.dll",这个库是Informix wrapper的核心文件,封装了DB2和Informix之间的信息转换和交互。我们在"包装器名"中填入一个恰当的名字即可,如下图所示。然后点击"确定"按钮就完成了Informix wrapper的创建。
图13:指定包装器名称
Wrapper创建好以后,可以从图中相应数据库节点看到如下信息,即在联合数据库对象中已经有一个包装器INFORMIX的节点存在了。
图14:查看包装器对象
2.完成服务器定义。展开上图中的"INFORMIX"节点,其下有一个"服务器定义"节点,右键点击之,在新弹出的选项里面选择"创建"。
图15:创建服务器定义
此时弹出如下界面,点击其中的"发现"按钮,系统将会搜索已经安装好的Informix服务器。
图16:发现 Informix 服务器
结果如下所示。IDS10就是我们已经安装好的Informix的名字,因为我们安装的版本是9.4,所以选择其中的9即可,如图中所示。
图17:选择 Informix 版本
同时,我们点击右侧的"属性"按钮,将会弹出如下界面,我们选择其中的"设置"页。在DBNAME中我们填入Informix的数据库名字。在这里,我们Informix的数据库名字叫做testdb,然后点击确定。这样就完成了服务器的定义。
图18:设置属性
服务器定义完成后,我们从控制中心可以看到如下信息。接下来我们需要完成用户映射和昵称的创建,这样整个federation部分的创建过程才算完成。
图19:完成服务器定义
3.完成用户映射。所谓用户映射,是指将DB2中的用户映射到具有相应权限的其他数据库的内置用户帐号,这样不同数据库之间才能完成用户验证和审核方面的工作。在上图中,右键单击"用户映射",然后选择"创建"。
图20:创建用户映射
此时弹出如下所示的界面,在"用户"页,因为笔者安装的DB2是用db2admin这个帐号,所以选择DB2ADMIN,如下所示。
图21:选择用户标识
之后,点击"设置"页,在REMOTE_AUTHID中填入Informix数据库中相应的用户名,笔者使用的是默认的informix(Informix数据库对大小写敏感,请注意大小写),在REMOTE_PASSWORD中填入对应该用户名的登陆密码即可。点击确定按钮即完成。
图22:Informix 中对应的用户标识
4.创建昵称。所谓昵称,是指其他数据库中的数据库表在DB2中的别名,或者说在DB2所显示出来的名字,这个名字可以和真正的表名字一样,也可以不一样。如下图所示,在"昵称"节点上点击"创建"。
图23:创建昵称
之后出现如下界面,此时可以通过"发现"的方式或者"添加"的方式来创建昵称。
图24:发现昵称
如果更倾向于自动化,那么可以选择"发现"的方式。此时弹出如下对话框。
图25:指定发现的模式
如图中所示,填入informix,即Informix的用户名(建立用户映射时候的Informix的用户名),然后点击确定。
此时,非常意外的,系统返回如下对话框(如果此时采用"添加"的方式,也会出现类似错误信息)。
图26:缺少环境变量设置的错误信息
根据对话框内的错误信息提示,INFORMIXSERVER的环境变量没有设置。那么如何解决该问题呢?此时,我们右键点击打开桌面上"我的电脑",选择"属性",将会弹出一个界面,点击其上的"高级"页,将看到类似如下的界面,点击"环境变量"按钮,在新弹出的窗口我们将可以进行环境变量方面的设置和修改。
图27:设置环境变量
如下图所示,在db2admin的用户变量中,我们点击"新建",如图中所示,变量名和变量值分别填入INFORMIXSERVER和ids10,其中ids10是我们安装Informix时的数据库服务器名字。然后点击确定即可完成。
图28:设置 INFORMIXSERVER 变量
解决了环境变量的设置问题后,我们回到刚才创建昵称的地方,按照同样的步骤,我们发现,上面这个环境变量的错误已经消失了,但是另外一个新的错误又出现了!如下图所示。
图29:另一个错误
该错误信息为:SQL1101N 用指定的授权标识和密码不能存取节点"ids10"上的远程数据库"testdb"。但是如果我们通过Infomix的dbaccess方式,用同样的用户名和密码却能连接上该数据库并且对其中的表进行相应操作,这说明用户名和密码其实是正确可用的。那么这个错误的原因究竟是什么呢?
这是因为,在DB2中,通过user mapping保存的相关用户名和密码,如果没有对相关参数进行设定的话,DB2会把用户名和密码在内部以大写的方式和真实的Informix的相应信息比较,而Informix中数据库都是会按照小写的方式来处理的,这样就产生了不一致性,从而导致了该错误的发生,这个错误的发生也部分是由于Informix数据库本身的特殊性造成的(数据库名,数据库表等以小写方式来处理)。
要解决上述问题,需要按照如下步骤对两个参数(即服务器定义中的FOLD_ID和FOLD_PW)进行设定。如下图所示,点击"改变",然后就可以对已经建立好的服务器进行相关的参数修改。
图30:修改服务器定义的参数
在弹出的如下界面中,选择"设置"页面,在其中我们可以看到参数FOLD_ID和FOLD_PW,在下拉框中,我们把两个参数的值都改成"L",这样就可以避免大小写不一致带来的问题。然后确定完成即可。
图31:修改 FOLD_ID 参数
上面主要讲述了如何在TARGET数据库中创建Informix wrapper。同样的,我们也需要在SOURCE数据库中创建Oracle wrapper,其过程完全类似,甚至更为简单一些,因为Oracle作为数据源的话,不需要像上面的Informix那样,再设置相关的环境变量,也不需要对其他参数做出修改,基本上使用默认参数即可。此处不再对Oracle的wrapper作更多叙述。
第四部分 创建从Oracle到Informix的SQL复制环境
有了上面这些操作,我们就可以建立起一个从Oracle复制到Informix的环境了。具体步骤如下:
1.创建DB2联合服务器。在复制中心,选择SQL复制>>定义>>Capture 控制服务器>>右键>>创建Capture 控制表, 在弹出的如下界面中,选择"使用此DB2联合服务器来捕获对非DB2服务器的更改",然后在下拉框中选择"ORCL(SOURCE)",然后Capture模式填入ASN,远程模式填入SCOTT即可。通过这个联合服务器的创建,我们就能够捕捉到Oracle的数据源的相关信息,从而将其复制到其他类型的数据库如DB2或者Informix中。
图32:创建联合服务器
2.注册昵称。在SOURCE数据库中创建相关的昵称(即在控制中心创建Oracle源表的昵称),笔者Oracle的数据库表为ORATAB,为简单起见,这个表只有一个列,叫做COL1,类型是NUMBER(10)。完成这个步骤后(步骤请参考第三部分相关内容),我们再到复制中心,我们在这里再将刚才在控制中心创建的昵称进行注册。如下图所示。
图33:注册昵称
为简单起见,注册昵称时候的选项采用默认设置。完成后图示如下。ORATAB就是注册完成后的昵称,即Oracle源表映射到DB2中的昵称。
图34:注册了 ORATAB 昵称
3.创建Apply服务器。如下图所示,选择"定制",然后按照默认选项创建Apply控制服务器即可。这个步骤较为简单,不再赘述。
图35:创建 Apply 控制表
创建好的Apply服务器所示如下。
图36:创建了 Apply 服务器
4.创建预定集。这个步骤是本部分内容中最为重要的一个步骤。如下图所示,选择创建。
图37:创建预定集
在弹出的新窗口中,如下图所示,填入(或者选择)蓝色框中所示的内容,"激活预定集"前面要打上钩。在选择目标服务器别名的时候,需要注意,如果在列表中TARGET没有对应的"非DB2服务器"(即该列为空),那么右键"TARGET",将会弹出"检索非DB2服务器",点击之,这时候会出现一行新的数据,即数据库别名为TARGET,同时其非DB2服务器为IDS10,选择之,作为我们的目标服务器别名即可。
图38:指定预定集目标服务器属性
完成了上述集信息后,紧接着我们需要填写源到目标映射相关的内容。如下图所示,选中"源到目标映射"页面,然后选中我们注册好的昵称,即ORATAB,这个就是我们的复制源,点击确定。
图39:添加源
然后在下面的图形界面中,我们需要特别注意填写远程目标模式和远程目标名。因为我们的Informix的用户名是informix(都是小写),然后我们在下面界面中通过双引号假小写的方式,就能保证DB2和Informix之间是按照小写方式来进行交互的,这样就可以避免在Informix数据库所带来的不必要的一些大小写问题。
图40:远程目标模式和远程目标名
上面解决的是数据库模式和表名的大小写问题,如果希望映射到Informix数据库后,表的列名也是小写的话,那么需要点击上图中的"更改"按钮,对列映射进行修改。如下图所示,将右侧原来的COL1修改为"col1"(包括引号本身),同时在"目标表索引"设置好相关的索引即可。点击"确定"完成预定集的创建。这个步骤完成后,Informix上对应的目标表(创建在Informix数据库中)等相关内容也即创建完成。
图41:修改列映射
5.启动Apply服务器。由于数据源是Oracle数据库,而对于非DB2的数据源,是采用Trigger方式来实现数据的捕捉的,因此不再需要另外的Capture服务器,也即不需要启动Capture服务器。要使复制开始启动并运转,只需要启动相应的Apply服务器即可。
启动Apply服务器很简单,如下图所示,然后在弹出的窗口中选择相应的系统名称(如果没有创建一个新的即可),然后参数设置采用默认,最后点击确定完成即可。
图42:启动 Apply
Apply启动以后,那么Oracle数据源中的源表如果有任何改变,比如增加了一行记录,删除了一行记录,或者修改了一行记录,都会更新到Informix对应的目标表中,从而实现Oracle到Informix这种异构数据库之间的复制。
如果在列映射中不修改大小写的话(即不把原来的COL1修改为"col1"),并不是不能实现复制,而是会出现一些比较特殊的情况。我们这里假定,我们都是完全按照上述所有步骤完成了复制环境的搭建,然后仅仅是列映射采用默认的设置。下面是针对这种情况的相关分析。
1.从Informix的dbaccess进行查询操作。如图中所示,"select * from tgoratab",执行成功。利用这种方式执行修改和添加删除等操作都没有问题。
图43:执行全列查询操作
2.从DB2的control center进行查询操作,如图所示,执行成功。同样的,执行修改和添加删除等操作也是没有问题的。
图44:在 DB2 控制中心中执行全列查询操作
3.但是,如果将1中的查询改为如下形式,则都是有问题的。
select col1 from tgoratab
图45:执行对 col1 列的查询操作
select COL1 from tgoratab
图46:执行对 COL1 列的查询操作
这个时候,只有采用如下方式才能正确查询。(其间Oracle源表做了一些数据操作,所以现在查询到的数据已经变成4条)
select tgoratab."COL1" from tgoratab
图47:执行对 tgoratab."COL1" 列的查询操作
4.如果将列映射进行修改,即在列映射设置的时候变成小写的形式("col1"),那么在Informix的dbaccess中进行如下查询(select col1 from tgoratab)也是可以成功的。
图48:修改列映射之后可以用小写字母作为列名
希望上述附注能够让读者对Informix的大小写问题有更多的认识和理解。
从Informix复制到Oracle其实非常类似,本部分主要介绍需要特别注意的一些地方。此处仍旧使用上面已经创建好的基本环境(具有Oracle wrapper的SOURCE数据库,以及具有Informix wrapper的TARGET数据库)。
首先是创建联合数据库服务器的问题,此时应该创建在具有Informix wrapper的TARGET数据库上,如下图所示。因为这个时候我们需要捕获Informix数据库上的数据源。在这个过程中,系统将会在Informix中创建一些必要的控制表和相关的存储过程(procedure)等等。
图49:创建 Capture 控制表
这里需要注意的是,由于大小写的问题,在填写如下图所示的远程模式名的时候,我们应该使用"informix",而不是没有双引号的informix,否则的话,容易出错。
图50:使用 "informix" 作为远程模式名
下面的3个截图就是在没有加上双引号的情况下出现的错误和相关信息。
图51:在没有使用双引号情况下的错误信息
(因为schema被转换成大写的INFORMIX,所以INFORMIX.ibmsnap_signal_pr这个存储过程不能被Informix数据库解析出来,从而出现上述错误)
图52:查询 ibmsnap_signal_pr
图53:找不到 INFORMIX.ibmsnap_signal_pr
如果联合数据库服务器成功创建的话,那么创建好的控制表大概如下图所示,一共有7个表,即蓝色框中所示。
图54:控制表
同时,创建好的存储过程等如下所示,在Informix中,这些被称为"Routine"。
图55:Routine
可以通过选择相应的Routine来查看相关信息,如下所示。
图56:通过 Routine 查看信息
其次,如果我们需要重建联合数据库服务器的话,那么我们需要删除旧的那些已经存在的Informix的相关控制表和Routine等内容。很多时候我们比较容易记住要删除控制表,但是却忘记删除相关的Routine,下图是忘记删除Routine而试图重建联合数据库服务器所产生的错误现象(原有的ibmsnap_signal_pr仍旧存在,没有被删除掉)。
图57:如果没有删除旧的内容会发生错误
再次,在设置源到目标映射的时候,远程目标模式就是Oracle数据库中的schema,直接用大写即可,而远程目标名就是目标数据库的名字,也直接用大写即可。
图58:模式
上面就是从Informix复制到Oracle时需要注意的一些地方,有些方面仍旧是大小写带来的影响。如果读者遇到更多的问题,那么主要可以从SQL复制本身的原理去思考和解决。
最后,还有一点需要提及的是,无论从Oracle复制到Informix也好,从Informix复制到Oracle也好,我们上面的讲述中都使用了两个数据库,即SOURCE和TARGET。事实上,我们也可以仅仅用一个DB2的数据库来完成这样的复制任务,即在一个DB2的数据库中可以同时创建Oracle wrapper和Informix wrapper,同时还在其中创建完成Apply Server。在本文中,为了逻辑概念的清晰,故采用了两个数据库来讲述相关操作步骤和实现。
本文主要介绍了通过使用SQL Replication技术来实现从Oracle数据库复制到Informix数据库的方法。对于操作步骤和实现过程中可能会遇到的问题做了比较详细的分析和解释。同时也在附注部分介绍了从Informix复制到Oracle需要注意的一些问题,尽管步骤是大同小异的。本文也对一些相关基本概念做出了简要说明。
- IBM developerWorks 中国 WebSphere Information Integration 技术资源中心
- SQL Replication Guide and Reference
- Federated Systems Guide
- Data Source Configuration Guide
- IBM Informix : Integration Through Data Federation
- http://www.ibm.com/support/us/
- http://publib.boulder.ibm.com/infocenter/db2luw/v8//index.jsp
- http://www.ibm.com/developerworks/db2/roadmaps/sqlrepl-roadmap-v8.2.html