级别: 中级 吴先荣, 软件工程师, IBM 中国软件开发实验室 李越, 软件工程师, IBM 中国软件开发实验室 曹锐鑫, 实习生, IBM 中国软件开发中心
2007 年 7 月 02 日 针对 IBM WebSphere Information Integrator 的 SQL 复制和 Q 复制,本文通过描述字符集转换的各种机制与原理,介绍了在实际的多语言商业环境下的数据复制所应注意的各种配置组合与技巧。
针对 IBM WebSphere Information Integrator 的 SQL 复制和 Q 复制,本文通过描述字符集转换的各种机制与原理,介绍了在实际的多语言商业环境下的数据复制所应注意的各种配置组合与技巧。同时为客户提供了最佳的代码页配置方案,使得客户能够在最短的时间中了解数据复制过程中的字符集转换机制并及时地将其运用到商业环境中从而达到在数据复制过程中对多语言环境的最佳透明访问。
简介
当前,随着企业信息化水平的提高,企业计算环境变得日益复杂,数据量更是迅猛增加。不论是数据仓库的更新,分布式系统的同步,还是运行环境的备份,都迫切需要快捷灵活的数据复制功能。IBM WebSphere Information Integrator 的 SQL 复制和 Q 复制为企业从容面对商业环境中的各种挑战提供了强有力的支持。
SQL 复制又称为“DB2 复制”,它基于日志或者触发器来捕获变更,可以在多个混合关系数据源之间互相复制数据,能最大限度地提高复制的灵活性。Q 复制是一种新的复制架构,使用 Websphere MQ 消息队列在源数据库和目标数据库之间传递事务数据的更新情况,是一种低延迟,高吞吐量的解决方案。
同时,面临经济全球化的趋势,数据复制系统提供了多语言支持以适应市场需求,尤其是加强了对双字节字符集(DBCS, Double Byte Character Set)的支持。如何在需要转换字符集的情况下确保数据复制的准确性已成为数据复制领域不容忽视的一环。
图 1 是对数据复制应用的商业模拟。
图 1. 数据复制应用商业模拟
图 1 所展现的数据复制场景中,我们实现了业务数据在美国总部与位于亚洲的分支机构(例如中国,日本)之间进型准确高效的传递。在整个过程中,只要通过恰当的参数配置,我们便可以避免数据复制中由于字符集转换带来的异常。
字符集转换通常情况下被称为代码页(CODEPAGE)转换。通过以上描述可知,代码页转换已经成为影响数据复制系统正确性与高效性的重要因素。
需要指出的是,若要理解与掌握数据复制中代码页转换的具体过程及配置方法,必需首先具备 Unicode,双字节字符集(DBCS, Double Byte Character Set)等相关知识。对于以上技术,本文仅在最后的术语表中进行了简单的介绍与描述,如果需要更多详细信息,请查阅相应的参考资料。
代码页转换过程中的相关参数
在 WebSphere II(SQL/Q)复制系统中,对数据的代码页转换需要进行多方面的考虑,通常代码页的转换涉及:源数据库的代码页设置,目标数据库的代码页设置,capture 程序(capture program)与 apply 程序(apply program)运行时所在 DB2 实例级别的代码页设置,以及操作系统当前 Locale 的选取。同时,当引入联邦(Federated)数据库之后,代码页转换的情况将变得更加复杂,因为这时我们必须考虑包装器(Wrapper)机制的引入,及 DB2 数据源与非 DB2 数据源通信时所带来的代码页转换。
在对代码页转换过程进行分析时,我们需要考虑 3 个不同层次的代码页设置,这一点如图 2 所示:
图 2. 代码页设置的三个层次
-
操作系统 Locale:系统级别的代码页设置,决定应用程序的默认代码页;
如果您希望将 OS Locale 设置为中文,可使用以下方法:
- UNIX:你可以通过
export LANG=”zh_CN” 命令修改当前的 Locale 到中文;
- Windows:在“开始->设置->控制面板->区域设置”中进行如图 3 所示的选择;
图 3. 修改当前的 Locale 到中文
-
DB2CODEPAGE:DB2 实例级别的代码页设置,会影响 DB2 相关应用程序对代码页转换时做出代码页判定;
你可以通过 db2set DB2CODEPAEG=1386 命令将 DB2CODEPAGE 设置为中文;
-
DATABASE CODEPAGE:DB2 数据库级别的代码页设置;
您可以在创建数据库时指定需要的代码页,db2 "CREATE DATABASE testdb USING CODESET UTF-8 TERRITORY CN" 这条语句可用于创建指定区域为中国(CN)的 Unicode 数据库。您可以通过 db2 "GET DB CFG FOR database" 命令查询数据库的代码页。
- 除了上述罗列出的参数之外,与代码页转换过程相关的参数还包括:
如果您希望将 OS Locale 设置为中文,可使用以下方法:
-
QM CCSID(coded character set identifier):Queue Manager 的代码页,创建 Queue Manager 时指定,默认值由当前的 OS Locale 决定,CCSID 可以看作是代码页的另一种表示方式;
-
Non-DB2 Database CODEPAGE:非 DB2 数据源代码页,例如:Oracle 数据库代码页,创建 Oracle 数据库时决定,Sybase 数据库代码页,创建 Sybase 数据库时决定;
SQL 复制中的代码页转换过程
图 4 描述了 SQL 复制中数据传递及转换的过程,它所代表的场景实现了从一种非 DB2 数据源(这里是 Oracle)到另一种非 DB2 数据源(这里是 Sybase)的动态复制。
图 4. SQL 复制中数据传递及转换的过程
图 4 中每一个标注 CPCV(代码页转换)的地方均有可能发生代码页转换,而且根据字符型数据的不同来源,代码页转换的具体情况会有较大差别。
通过图 4 我们可以看出,在这一个样例中,数据的目标均指向远端的 Sybase 数据库,但源数据可以来自三种不同的途径,分别包括:远端 Oracle 数据库,本地 DB2 数据库,以及用户应用程序。下面我们将针对不同的数据流,给出对应的代码页转换分析。
源数据来自远端 Oracle 数据库
当联邦数据库通过昵称(Nickname)访问远端数据库中的 CCD 表时,联邦数据库负责控制其间的代码页转换。表 1 对具体情况进行了说明:
表 1. 源数据来自远端 Oracle 数据库的代码页转换过程
| CODEPAGE 参数 | 说明 | 当前值 |
|---|
| Oracle DB CODEPAGE | Oracle 数据库的代码页 | cpA1 |
|---|
| Federated DB CODEPAGE | 联邦数据库代码页 | cpB3 |
|---|
| CODEPAGE 转换 |
|---|
| cpA1 -> cpB3 |
|---|
| CODEPAGE 转换过程描述 |
|---|
| 当联邦数据库通过昵称访问 Oracle 数据库中的数据时,为远端 Oracle 建立的包装器将对 Oracle 数据库中得到的数据将进行代码页 cpA1 -> cpB3 的转换。 |
|---|
数据通过 apply 程序被应用到目标数据库上时,apply 程序与联邦数据数据库共同控制整个过程中的代码页转换。
表 2. 数据通过 apply 程序应用到目标数据库时的代码页转换过程
| CODEPAGE 参数 | 说明 | 当前值 |
|---|
| Federated DB CODEPAGE | 联邦数据库代码页 | cpB3 |
|---|
| DB2CODEPAGE | 联邦数据库所在 DB2 实例代码页 | cpB2 |
|---|
| Sybase DB CODEPAGE | Sybase 数据库代码页 | cpC1 |
|---|
| CODEPAGE 转换 |
|---|
| cpB3 -> cpB2 |
|---|
| cpB2 -> cpC1 |
|---|
| CODEPAGE 转换过程描述 |
|---|
| 被捕捉的源数据通过 apply 程序被应用到目标表的过程中,进行了两次代码页转换。第一次中,apply 程序首先通过 CCD 表的昵称或 CD 表来判断源数据的代码页,之后将数据从原有代码页转换至当前的 DB2CODEPAGE 所代表的代码页,本场景中的 CCD 昵称建立在联邦数据库上,因此这里 apply 程序对数据实现了从代码页 cpB3 到 cpB2 的转换。第二次中,当联邦数据库通过昵称对远端的 Sybase 数据库进行数据更新时,为 Sybase 建立的包装器将对数据代码页进行 cpB2 到 cpC1 的转换。 |
|---|
源数据来自本地 DB2 数据库
在 capture 程序读取源数据库的日志并将获得数据并插入 CD 表的过程中,由 capture 程序控制代码页。表 3 对具体情况进行了说明:
表 3. 数据通过 capture 程序插入 CD 表时的代码页转换过程
| CODEPAGE 参数 | 说明 | 当前值 |
|---|
| DB2CODEPAGE | 联邦数据库所在 DB2 实例代码页 | cpB2 |
|---|
| DB2 DB CODEPAGE | 本地 DB2 数据库代码页 | cpB4 |
|---|
| CODEPAGE 转换过程描述 |
|---|
| 源数据库的数据通过 capture 程序被捕捉并更新到 CD 表的过程中,数据的代码页将发生从实例级别代码页(DB2CODEPAGE)到数据库级代码页之间的转换(database codepage),当前场景中,数据将发生由代码页 cpB2 到 cpB4 的转换。注意:capture 程序通过判断 DB2CODEPAGE 得到源数据库的代码页。 |
|---|
数据通过 apply 程序被应用到目标数据库上时,apply 程序与联邦数据数据库共同控制整个过程中的代码页转换。
源数据通过外部应用程序输入
当数据通过命令级接口由用户输入时,联邦数据库将控制代码页转换。表 4 对具体情况进行了说明:
表 4. 源数据通过外部应用程序输入时的代码页转换过程
| CODEPAGE 参数 | 说明 | 当前值 |
|---|
| DB2CODEPAGE | 联邦数据库所在 DB2 实例代码页 | cpB2 |
|---|
| Federated DB CODEPAGE | 联邦数据库代码页 | cpB3 |
|---|
| CODEPAGE 转换过程描述 |
|---|
| 当用户通过调用级接口对联邦数据库中的数据进行操作时,数据的代码页将发生实例级别代码页(DB2CODEPAGE)与数据库级代码页(database codepage)之间的相互转换,当前场景中,当数据由用户应用程序流向数据库时,发生代码页 cpB2 到 cpB3 的转换,当数据由数据库流向用户应用程序时,将发生代码页 cpB3 到 cpB2 的转换。 |
|---|
数据通过 apply 程序被应用到目标数据库上时,apply 程序与联邦数据数据库共同控制整个过程中的代码页转换。
Q 复制中的代码页转换过程
下图描述了 Q 复制中数据传递及转换的过程,图 5 所代表的场景实现了从 DB2 数据源到另一 DB2 数据源的双向 Q 复制(Bidirectional replication)。 图 6 所代表的场景实现了由 DB2 数据源向非 DB2 数据源(此处是 Sybase)的 Q 复制。
DB2 数据库之间的双向 Q 复制
图 5 中每一个标注 CPCV 的地方均有可能发生代码页转换,而且从图 5 中我们可以看出,双向 Q 复制在实现时两个方向上的代码页转换过程是完全对应的。因此我们只需要分析数据的单一流向即可,这里我们取左侧数据库为源数据库,右侧数据库为目标数据库。
图 5. DB2 数据库之间的双向 Q 复制示例
当我们的源数据来自数据库时,此时数据的代码页转换可能发生在如下两处:
- 数据通过源服务器的发送队列发送到目标端服务器的接收队列过程中;
表 5. DB2 数据库之间的双向 Q 复制的代码页转换过程
| CODEPAGE 参数 | 说明 | 当前值 |
|---|
| Source QM CCSID | 源队列管理器的代码页 | CCSID0 |
|---|
| Target QM CCSID | 目标队列管理器的代码页 | CCSID1 |
|---|
| CODEPAGE 转换过程描述 |
|---|
| 当数据在通过发送队列,接收队列,通道,由源端队列管理器,传送至目标端队列管理器的过程中,由于源端队列管理器与目标端队列管理器的 CCSID 不同,数据将发生代码页的转换,其转换过程为 CCSID0 到 CCSID1。 |
|---|
- Apply 程序由接收队列中获得事务信息并应用到目标数据库的过程中;
表 6. 由接收队列中获得事务信息并应用到目标数据库的代码页转换过程
| CODEPAGE 参数 | 说明 | 当前值 |
|---|
| Target QM CCSID | 目标端队列管理器的代码页 | CCSID1 |
|---|
| Target database CODEPAGE | 目标数据库代码页 | cpB3 |
|---|
| CODEPAGE 转换过程描述 |
|---|
| 在 Q 复制过程中,当 apply 程序将由接收队列中获取事务信息,并应用到目标数据库中,此时 apply 程序将会通过目标端队列管理器的 CCSID 来判断接收到的数据的代码页;接下来,apply 程序将会检测目标数据库上的控制表(control table)IBMQREP_TRG_COLS 中的 MSG_COL_CODEPAGE 列,从而确定代码页的目标值。注意:此列的值是当我们在创建 Q 复制预定集(subscriptions)时向控制表(control table)中插入的,由当时的 DB2CODEPAGE 决定。通常情况下,我们务必要保证此列的值与控制表所在数据库的代码页保持一致,这一点可以通过 "db2set DB2CODEPAGE=xxx" 来实现,否则会导致 apply 程序进行错误的代码页转换。 |
|---|
DB2 数据库与非 DB2 数据库之间的复制
图 6 中每一个标注 CPCV 的地方均有可能发生代码页转换,在此类由 DB2 源数据库向非 DB2 目标数据库进行的 Q 复制中,只有唯一的数据流向,目前 Q 复制系统暂不支持非 DB2 数据库作为源数据库。
图 6. DB2 数据库与非 DB2 数据库之间的复制示例
源数据来自 DB2 数据库,此时数据的代码页转换可能发生在如下 3 处:
- 数据由源端服务器通过发送队列发送到目标端的接收队列过程中(这一过程中的数据代码页转换与上述 DB2 与 DB2 之间 Q 复制时第 1 类情况相同);
- apply 程序由接收队列中获得事务信息并应用到目标数据库的过程中(这一过程中的数据代码页转换与上述 DB2 与 DB2 之间 Q 复制时第 2 类情况相同);
- 数据通过目标表的昵称被应用到目标数据库上时,联邦数据库的包装器对数据的代码页进行转换,由联邦数据库的代码页转换至目标数据库(Sybase)的代码页。
表 7 对具体情况进行了说明:
表 7. DB2 数据库与非 DB2 数据库之间的复制的代码页转换过程
| CODEPAGE 参数 | 说明 | 当前值 |
|---|
| Federated DB CODEPAGE | 联邦数据库代码页 | cpB3 |
|---|
| Sybase DB CODEPAGE | Sybase 数据库代码页 | cpC1 |
|---|
| CODEPAGE 转换过程描述 |
|---|
| 当联邦数据库通过昵称对远端的 Sybase 数据库进行数据更新时,为 Sybase 建立的包装器将对数据的代码页进行由 cpB3 到 cpC1 的转换。注意:我们这里设定 Sybase 数据库与所在操作系统具有相同的代码页。
|
|---|
结束语
本文总结了作者对数据复制系统的代码页的分析。关于在此基础上的进一步最佳实践,请参考作者的 数据复制中的字符集转换最佳实践 一文。
通过对数据复制系统中代码页转换过程及配置方法的分析可以看出,对各个代码页相关参数的设置将直接影响数据复制系统工作的准确性与高效性,因此,当我们使用数据复制来实现商业需求时,对代码页配置方案应当进行周密的设计与测试,尽可能地避免及减少代码页转换次数,从而优化解决方案。
术语表
下表罗列了对正文中各专业术语的简要介绍,如果需要更加详细的信息,请查阅相关资料:
表 n. 本文术语表
| 名称 | 说明 |
|---|
| Unicode | Unicode 是一种字符编码方法,由国际组织设计,可以容纳全世界所有语言文字的编码方案 |
|---|
| DBCS | 双字节字符集,许多亚洲语言的字符集均为双字节字符集 |
|---|
| 代码页 | 字符集编码的集合,包含了每个字符与代码点的对应 |
|---|
| Locale | 特定于某个国家,地区,及语言的相关文化信息的集合 |
|---|
| CCSID | 该参数指定了 MQ 中队列管理器的代码页 |
|---|
| Capture 程序 | 在 SQL 复制中,负责捕捉 DB2 日志的更新并将更新写入 CD 表中;在 Q 复制中,负责捕捉 DB2 日志更新并将得到的事务信息写入发送队列中 |
|---|
| CD 表 | 用于 SQL 复制,用于存储 capture 程序捕捉到的 DB2 数据源的更新 |
|---|
| CCD 表 | 用于 SQL 复制,建立在非 DB2 数据库上,用于存储非 DB2 数据源的更新 |
|---|
| apply 程序 | 在 SQL 复制中,负责将 CD 表中的更新应用到目标表中;在 Q 复制中,负责将接收队列中的事务信息提交到目标表中 |
|---|
| 队列管理器 | 负责管理其他关联的资源,特别是其拥有的队列。它为消息队列接口(MQI)调用的应用程序和创建,修改显示,及删除 MQ 对象的命令提供了排队服务 |
|---|
| 发送队列 | 用于 Q 复制,用于搭载 capture 程序捕捉到的事务信息,并准备将搭载的信息向接收队列传送 |
|---|
| 接收队列 | 用于 Q 复制,用于搭载接收到的事务信息,并等候 apply 程序的调用 |
|---|
| 包装器 | 包装器是联邦服务器和数据源交互的中介,它熟知数据源的特点,它为下面的 4 种任务提供了编程接口:
- 联邦对象注册
- 和数据源沟通
- 服务和操作
- 数据建模
|
|---|
| 昵称 | 表或视图等远程对象在联邦服务器上以昵称的形式注册,昵称的注册提供了位置透明性,因为昵称对于联邦服务器上的用户来说看上去就像一个本地 DB2 表 |
|---|
参考资料 学习
获得产品和技术
- 下载
IBM 软件试用版,体验强大的 DB2®,Lotus®,Rational®,Tivoli® 和
WebSphere® 软件。
讨论
作者简介  | |  | IBM 中国软件开发中心 WebSphere Information Integrator 组软件工程师。 |
 | |  | IBM 中国软件开发中心 WebSphere Information Integrator 组软件工程师。 |
 | |  | IBM 中国软件开发中心 WebSphere Information Integrator 组实习生。 |
对本文的评价
|