| 免费下载:IBM® DB2® Express-C 9.7.2 免费版 或者 DB2® 9.7 for Linux®, UNIX®, and Windows® 试用版 |
|---|
| 下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。 |
2009 年 3 月,在 Cebit 展会上我进行关于 DB2 9.7 的演讲时,烧坏了一个 110V 的计算机扩音器,因为我轻率地将它插在了德国 230V 的电网上,而没用变压器。还是这次旅行中,类似的事故再次发生,我又弄坏了电动牙刷和剃须刀的充电器。抛开我记性不佳,没有吸取教训不谈,这里似乎应验了我最喜欢的一句谚语(来源不详):“标准的问题就是标准太多”。
在关系数据库管理系统 (RDBMS) 一统天下的世界中,我们幸运地拥有至少三个主要标准和这些标准的无数变体:
- ANSI SQL 和 ANSI SQL/PSM
- Oracle SQL 和 PL/SQL
- Sybase 和 Microsoft® TSQL
图 1 通过韦恩图解阐释了 SQL 专用语言是如何重叠的:
图 1. SQL 的巴比伦的混乱
无论何时编写应用程序,都必须选择一个 RDBMS 供应商。做完选择后,您基本上就要从一而终了。任何切换供应商期望利用更低价、更优秀技术或更好的合作伙伴关系的尝试都会被在使用另一个 RDBMS 之前需要广泛重写的大量遗留代码所吓退。另外,您的技能集也不会像您预期的一样轻松迁移到另一个产品。
IBM® DB2® 9.7 for Linux®, UNIX®, and Windows® (DB2) 正致力于寻求一种方式,极大地减少将为 Oracle 编写的应用程序用于 DB2 存在的障碍。这为客户和供应商提供了根据其实际情况而不是应用程序历史选择 DBMS 的能力。
要使为某个 RDBMS 编写的应用程序在不做任何修改情况下运行在另一个 RDBMS 上,很多部分要依序出现。不同的锁机制、数据类型、SQL、服务器上的过程语言、甚至应用程序自身使用的客户机接口都需要保持一致,不仅在语法上而且在语义上。
DB2 中已经采取了所有这些步骤。变化是例外,而不是规则(IBM 可以迅速访问需要的应用程序变更)。表 1 提供了对常用特性的快速概览。
表 1. 常用特性
| Oracle | --> | DB2 |
|---|---|---|
| 并发性控制 | --> | 本机支持 |
| SQL 专用语言 | --> | 本机支持 |
| PL/SQL | --> | 本机支持 |
| PL/SQL 包 | --> | 本机支持 |
| 内置包 | --> | 本机支持 |
| 带有扩展的 JDBC 客户机 | --> | 本机支持 |
| OCI 客户端支持 | --> | 本机支持 |
| Pro*C 应用程序 | --> | 本机支持 |
| SQL*Plus 脚本 | --> | 本机支持 |
| Oracle Forms | --> | 自动转换到 Java™ 技术 |
| RAC | --> | pureScale |
通过 DB2 9.7,就不再需要为应用程序确定端口了。只要启用 应用程序即可。在使用打包应用程序的时候,甚至可能为 DB2 和 Oracle 共享一个源。换句话说,在 DB2 中支持 Oracle 应用程序不比使为 HP-UX 编写的 C 程序运行在 AIX 上复杂多少。
过去,Oracle 与 DB2 之间最突出的不同一直是并发性控制方法不同。比较易记的说法是:“读取器不会阻止编写器且编写器不会阻止读取器”。
表 2. Oracle 并发性行为
| 挂起事务 | 行为 | 新事务 |
|---|---|---|
| 读取器 | 不会阻止 | 读取器 |
| 读取器 | 不会阻止 | 编写器 |
| 编写器 | 不会阻止 | 读取器 |
| 编写器 | 阻止 | 编写器 |
不用深入到隔离级别,现在足以说明使用 Oracle 默认的语句级隔离 的绝大多数应用程序在使用 DB2 默认的游标稳定性 (Cursor Stability, CS) 时也能很好的工作。
但是,传统上,CS 已经实现了,所以编写器组织读取器并且,在某些情况下,读取器可以阻止编写器。原因是传统上,在 CS 隔离级别下的事务将 “等待挂起的并发事务的变更的结果”。
表 3. 传统 DB2 的 CS 并发性行为
| 挂起事务 | 行为 | 新事务 |
|---|---|---|
| 读取器 | 不会阻止 | 读取器 |
| 读取器 | 很少阻止 | 编写器 |
| 编写器 | 阻止 | 读取器 |
| 编写器 | 阻止 | 编写器 |
最终发现在 CS 隔离下运行的事务在遇到变更的行时等待结果 不是出于语义原因。另一个比较满意的行为是读取变更行的当前提交 版本。
此行为已经在 DB2 9.7 中实现。具体方法是 DB2 只需从日志中获取锁定行的当前提交版本。在大部分一般情况下,该行仍位于日志缓冲区,因为尚未提交变更。但是只要该行已经编写出来并且 也已经在日志缓冲区中重写,DB2 就能准确知道在哪里找到它,因此单次 IO 就可以将需要的版本带入缓冲区。
假设(参见图 2),一个用户更新员工表中的名字。在该用户提交变更之前,另一个用户在浏览这个表。过去,第二个用户不得不等待第一个用户提交或回滚。由于有了读取当前提交数据 特性,第二个用户的浏览操作只需从不包含第一个用户变更的日志缓冲区获取该行的版本即可。
图 2. 编写器不阻止读取器
注意一下这个行为:
- 没有引入新对象,比如回滚段。
- 编写日志之后,编写器就没有性能开销了。
- 不会引起任何类似 “快照过旧” 的情况,因为几乎不可能出现所需的日志文件已经被归档(而事务仍然打开!)在这种情况下,DB2 将会后退并等待锁消失。
除了这些变更,其他避免锁定技术也已经被引入 DB2 了,以便清除在 CS 隔离下持有锁读取器。
表 4. 新 DB2 的 CS 并发性行为
| 挂起事务 | 行为 | 新事务 |
|---|---|---|
| 读取器 | 不会阻止 | 读取器 |
| 读取器 | 不会阻止 | 编写器 |
| 编写器 | 不会阻止 | 读取器 |
| 编写器 | 阻止 | 编写器 |
如您所见,DB2 的并发性行为现在与 Oracle 的一样了。事实上,新创建的 DB2 数据库会默认表现出这种行为。
每个数据库的核心都是其数据。错配的类型或这些类型错配的语义可能会严重影响在另一个 RDBMS 中支持一个应用程序的能力。因此,要允许 Oracle 应用程序在 DB2 上运行,很重要的一点是要支持其非标准的基本类型,比如字符串、日期和数字。除了调整这些基本类型之外,Oracle PL/SQL 中常用的其他一些更复杂的类型也已经添加到了 DB2 9.7 中。
表 5. 新 DB2 数据类型
| 数据类型 | 说明 |
|---|---|
| NUMBER | 在 DECFLOAT(通过 Power6 硬件加速)和 DECIMAL 基础上添加了对 NUMBER 和 NUMBER(p [, s]) 的支持。 |
| VARCHAR2 | VARCHAR2-类型的行为包括被解释为 NULL 的空字符串和对结尾空白敏感的纠正。 |
| NCHAR、NVARCHAR2 和 NCLOB | National Character 类型为 Unicode 数据库提供了双字节字符串支持。 |
| Oracle DATE | Oracle DATE 模式中的数据库除了日历日期还包括 TIME 组件。 |
| TIMESTAMP(n) | 秒的小数部分的范围可以在 0(日期 + 时间)到 12(微微妙)之间选择。 |
| BOOLEAN | 此类型可以用在过程逻辑、变量和例程的参数中。 |
| VARRAY | 过程中的 ARRAY 支持已经扩展到支持 VARRAY 风格的方法和语法。 |
| INDEX BY | 除了常规数组,DB2 还支持联合数组。 |
| ROW TYPE | 此复合类型可以用在变量和参数中,并且作为元素用在数组和联合数组中。 |
| Ref Cursor 类型 | 游标可以指定给变量或者使用参数到处传递。 |
“如果走路像鸭子,讲话像鸭子,那么它一定是鸭子。”
这是很多新兴语言,比如 PHP 和 Ruby 的原则。每个字面值都是一个字符串,然后根据上下文用作另一个类型。秉承了 SQL 标准并遵循了类型错配很可能预示着编码错误的原则,DB2 一直遵守着强硬的类型规则,其中字符串和数字不能比较,除非某一个经过显式类型转换,转换成另一个。
不幸地是,Oracle 应用程序在其 SQL 中使用了弱类型,过去该应用程序可能不能在 DB2 上编译。在 DB2 9.7 中,添加了隐式的类型转换(弱类型)。也就是,可以以非常灵活的方式比较、赋值和操作字符串和数字。
此外,可以在很多地方使用无类型的 NULL,而且几乎可以在任何地方使用无类型的参数标记,这要多亏了递延准备 功能。也就是说,在发现其第一个实际值之前,DB2 不用再解析参数标记类型。
为了完成隐式类型转换,DB2 还支持默认的过程参数以及通过名称关联 argument 和 parameter。
所有 RDBM 都提供了函数库来操作数据。问题是没有哪两个数据库对这些函数使用同样的名称,尽管最终其功能都非常类似。
除了其自己传统的函数集,DB2 现在支持与 Oracle 兼容的库。以下列表提供了快速概览,当然不可能是全部的:
- 转换和类型转换函数
-
TO_DATE -
TO_CHAR -
TO_CLOB -
TO_NUMBER -
TO_SINGLE_BYTE -
TO_TIMESTAMP
-
-
日期算法
-
EXTRACT -
ADD_MONTHS -
MONTHS_BETWEEN -
NEXT_DAY - 加号 (+) 添加天的分数
-
-
字符串操作
-
LPAD -
RPAD -
INSTR -
INITCAP -
LISTAGG -
SUBSTRB -
SUBSTR2 SUBSTR扩展
-
-
其他
-
NVL -
NVL2 -
HEXTORAW -
DECODE -
LEAST -
GREATEST -
BITAND -
RATIO_TO_REPORT
-
两种产品间支持函数的重合部分不断增加表明在 DB2 上对 Oracle 应用程序开箱即用的支持得到了极大改进。
到目前为止,本文介绍了并发性、数据类型、类型规则和函数。但是 Oracle 和 DB2 之间的不同不止于此。SQL 专用语言的框架、其关键字和语义在某些方面是不同的。而且每个产品都会有一些特性是另一个不支持的。在这些特性流行时,它们限制了为两种产品提供通用 SQL 的能力,从而可以改善大大小小的语言缺点。表 6 列举了一些重点。
表 6. 新的 SQL 支持
| 特性 | 说明 |
|---|---|
CONNECT BY 递归 | 到目前为止,DB2 已经支持 ANSI SQL 递归了。现在,已经可以添加 Oracle-样式的 CONNECT BY 了,包括各种函数和伪列,比如 LEVEL 和 CONNECT_BY_PATH。 |
| (+) 连接语法 | 这种语法实际上甚至连 Oracle 都不提倡了,但是有很多应用程序和开发人员仍在使用这种形式的 OUTER JOIN 语法。 |
DUAL 表 | 单行、单列表在 Oracle 应用程序中被广泛地用作哑表。 |
ROWNUM 伪列 | 该伪列通常用于限制返回的行数并在结果集中枚举行。 |
ROWID 伪列 | Rowid 用于快速检索之前根据其物理地址获取的行。 |
MINUS SQL 操作符 | 在 Oracle 中,用 MINUS 而不是 EXCEPT 从另一个结果集中减去一个结果集。 |
SELECT INTO FOR UPDATE
| FOR UPDATE 构建在
SELECT INTO 上,允许从 DB2 中抽取一行,以便稍后在不使用游标的情况下修改它。 |
PUBLIC SYNONYM
| 公共同义字是一个没有模式名的别名。DB2 支持表对象、序列和 PL/SQL 包的公共同义字。 |
CREATE TEMPORARY TABLE
| 除了声明全局临时表之外,DB2 还支持创建全局临时表。 |
TRUNCATE 表语句 | 此语句无需激活触发器即可快速删除整个表的内容。 |
CREATE OR REPLACE 对象语句 | 该符号可以让你替换新版本中已存在的对象。 |
| 命名参数(=>) | 您可以通过使用 => 符号,按名称将参数关联起来,从而调用过程和函数,而不是依赖于位置关联。 |
| 不严格的名称解析 | DB2 9.7 不再需要命名内联视图。另外,可以更轻松地从集合操作符(比如 UNION)继承列名称。 |
到这里,对 DB2 变化的概述就结束了,这是因为有了这些变化,向 DB2 数据库提交 SQL 的 Oracle 应用程序才能保持几乎不变的运行。但是,有很多应用程序的主要部分在服务器自身上执行。Oracle 应用程序服务器端的语言选择是 PL/SQL。没有对 PL/SQL 的支持,就不要声称可以提供兼容性。
通常,应用程序从一个产品定位到另一个产品时,SQL 和过程语言也从一种 SQL 专用语言转换成另一种。这会造成几个问题:
- 由于源和目标语言之间自动的不顺畅的错配导致得到的转换后代码让人费解。
- 应用程序开发人员不熟悉目标 SQL 专用语言。这使得调试转换后的代码很困难。随着时间推移,由于缺乏技能,后续维护会成为一个难题。
- 在处理打包应用程序时,需要为该应用程序的每个新版本重复转换。
- 最后,结果只是类似,从理论上说,它要比原始程序运行得慢一些。
为了避免这些问题,DB2 9.7 包含了本机 PL/SQL 支持。这意味着什么呢?
如您在图 3 中看到的,DB2 引擎现在包括一个 PL/SQL 编译器以及一个 SQL PL 编译器。这两个编译器为 DB2 的 SQL Unified Runtime Engine 生成虚拟机代码。很重要的一点是要注意到监控和开发工具,比如 Optim Development Studio,是在运行时引擎级别被挂靠到 DB2 的。
图 3. PL/SQL 编译器支持
将 PL/SQL 作为一类过程语言集成到 DB2 中有以下几个影响:
- 没有转换。源码在模式目录中保持原样。
- 开发人员可以继续使用熟悉的语言工作。无需将逻辑移动到 DB2 的专用语言,即使新逻辑是用 SQL PL 编写的。使用不同语言的例程可以彼此调用。
- 打包应用程序供应商可以针对 Oracle 和 DB2 使用一个源代码。
- PL/SQL 和 SQL PL 都为 DB2 的 SQL Unified Runtime Engine 生成同样的虚拟机代码。因此,在设计上,PL/SQL 和 SQL PL 执行的速度一样。
- 因为调试器基础架构直接挂钩在 SQL Unified Runtime Engine 中,所以 PL/SQL 很自然地得到 Optim Development Studio 的支持。
图 4 说明了 PL/SQL 调试会话。该调试器支持标准特性,比如跳入、跳过和断点。此外,它允许用户在程序运行时,改变局部 PL/SQL 变量。
图 4. DB2 中支持的 PL/SQL 调试器
那么,PL/SQL 支持究竟意味着什么呢?首先,有一个核心语法支持。DB2 支持所有 PL/SQL 的通用构造,比如:
if then elsewhile循环:=赋值- 局部变量和常量
#PRAGMA EXCEPTION和异常处理- 各种形式的
for循环(范围、游标和查询) %TYPE和%ROWTYPE将变量和参数锚定到其他对象#PRAGMA AUTONOMOUS事务,允许在私有事务中执行过程。CCFLAGS条件编译允许根据上下文编译不同片段的 PL/SQL。该特性对于尽量减少共享 PL/SQL 代码库中的 DB2 相关代码尤其有用。- 供应商能通过打包 PL/SQL 对象,例如使用
DBMS_DDL.WRAP和BMS_DDL.CREATE_WRAPPED函数的包主体,来混合 PL/SQL 中珍贵的知识产权。
PL/SQL 可以用在各种不同的支持过程逻辑的对象中:
- 标量函数支持包括:
-
INOUT和OUT函数参数 - 使用命名参数关联的调用
- 参数默认
- 运行时 “纯度” 强制
-
- 在每行多动作触发器之前
- 在每行多动作触发器之后
- 过程支持包括:
-
INOUT和OUT过程参数 - 使用命名参数关联的调用
- 参数默认
-
- 匿名块
- PL/SQL 包
Oracle 应用程序中的大部分 PL/SQL 都包含在所谓的包 中。PL/SQL 包(不要与 DB2 包弄混)是单个对象的集合,能够区分那些外部可访问的对象和哪些仅用于包内部的帮助函数。包的 ANSI SQL 等价物是模块。DB2 现在支持 ANSI SQL 模块以及 PL/SQL 包。特别是,提供了以下功能:
CREATE [OR REPLACE] PACKAGE,定义外部访问例程的原型。它还定义了所有外部可访问的、非过程对象,比如变量和类型。CREATE [OR REPLACE] PACKAGE BODY,它实现了所有私有和公共例程以及所有其他私有对象。- 在包或包体内部,可以定义以下对象:
- 变量和常量
- 数据类型
- 异常
- 标量函数
- 过程
- 游标
- 包初始化
- 包的公共同义字
某些 Oracle 应用程序利用 RDBMS 提供的包。特别是,提供报告、电子邮件或交叉连接通信的库非常流行。为了便于 DB2 支持这些应用程序,DB2 提供了表 7 中列出的包:
表 7. DB2 提供的内置包
| 包 | 说明 |
|---|---|
| DBMS_OUTPUT | 提供基本报告功能,可以通过命令行开关。 |
| UTL_FILE | 允许处理 DB2 服务器上的文件的模块。 |
| DBMS_SQL | 除了现有 EXECUTE 和 EXECUTE IMMEDIATE 语句,该包提供了用于执行动态 SQL 的 SQL API。 |
| UTL_MAIL | 该模块允许从 SQL 发送电子邮件通知。 |
| UTL_SMTP | 低级别的 API,类似于提供 SMTP 集成的 UTL_MAIL。 |
| DBMS_ALERT | 该包使用时允许不同的会话之间彼此发信号。 |
| DBMS_PIPE | 该模块允许会话彼此发送数据。 |
| DBMS_JOB | 提供与 DB2 的任务调度器集成的可兼容 API。 |
| DBMS_LOB | Oracle API,用于 LOB 处理,回应 DB2 的内置 LOB 函数。 |
| DBMS_UTILITY | 应用程序中使用的各种过程的集合。 |
| DBMS_DDL | 用来搞混 PL/SQL 对象以保护供应商 IP 的函数。 |
Oracle Application Enablement to DB2 for LUW 维基 中还有更多可用的包。在这里,您还可以找到各种其他的提示和技巧,以及背景知识。
JDBC 是标准 Java 客户机接口。但是为了支持特定的非标准数据类型,已经向 Oracle 的 JDBC 驱动程序中添加了扩展。
为了将与基于 Java 技术的应用程序兼容性发挥到最大,除了其他支持以外,DB2 9.7 JDBC 驱动还支持使用引用游标 VARRAY 和 ROW 参数来调用过程。
很多较老的 Oracle C 应用程序使用 Oracle Client Interface (OCI) 与 DBMS 进行通信。从 Fixpack 1 开始,DB2 9.7 提供了兼容 OCI 的客户端,称为 DB2CI,它还支持超过 150 个兼容 OCI 的函数,从 OCIAttrGet 到 OCITransRollback。有了 Fixpack 2,还可以使用 OCI7 API。很多情况下,可以简单地将 OCI 应用程序重新连接到 DB2CI 库,从而可以让 OCI 应用程序正常工作,而 DB2 几乎不作任何改变。
- 只要创建以下的名为 oci.h 的包含文件:
#include <db2ci.h> - 确保在 PATH 中 oci.h 在 Oracle 的 oci.h 之前。
- 然后在 makefile 中用 -ldb2ci.dll 替换 -loci.dll 连接选项,并重新编译应用程序。
很多时候,DDL 脚本甚至报告都是使用 SQL*Plus 命令行处理器编写的。要使迁移这些脚本以及编写它们的开发人员的技能更加容易,DB2 提供了兼容 SQL*Plus 的命令行处理器,叫做 CLPPlus。该工具提供了以下功能:
- 兼容 SQL*Plus 的命令选项
- 变量替换
- 列格式化
- 报告功能
- 控制变量
图 5. 兼容 SQL*Plus 的 CLPLus 工具
Oracle Forms 是一款旧版软件产品,用于创建数据库的数据输入系统。有些客户和 ISV 拥有数百个 Oracle Forms 屏幕,这些屏幕都是应用程序的组成部分。IBM 已经和 LLC 公司及 WonderWorks Group 开展合作,提供从 Oracle Forms 到 Java 的无缝转换功能。
双方均提供了以高度自动化、高效且可维护方式将 Oracle Forms 转换成 Java 语言的一种工具,同时保持了原有的 Forms GUI 外观,并且不会新增加对第三方产品的依赖。
WonderWorks FusionPaaS 可以将典型的 Oracle Fusion Forms 应用程序(如图 6 中的程序)转换成 J2EE 应用程序(参见图 7),它完全支持 Web,例如可以在 iPad 或其他智能设备上运行,还可以集成到 Web 2.0 应用程序,如 Google Maps 中。
图 6. 原始的 Oracle Fusion Forms
图 7. 使用 FusionPaaS 转换格式
关于 WonderWorks FusionPaaS 的更多信息,请参阅 Oracle Application Enablement to DB2 for LUW 维基上的白皮书。
随着越来越多的客户和合作伙伴使用 DB2 9.7,在 DB2 9.7 Fixpack 中引进了特性请求和细化,以不断提升兼容性。
Fixpack 1 引进了以下功能:
CCFLAGS支持使供应商应用程序的 Oracle 和 DB2 之间的共享代码数量达到最大值。FORALL和BULK COLLECT支持。SUBSTRB函数和SUBSTR细化。- 针对 Boolean 表达式处理的增强。
- 兼容 OCI 应用程序的 DB2CI 客户端。
- 各个类型的
CREATE OR REPLACE - PL/SQL 函数的扩展支持,例如
INOUT参数,可从函数写入表的功能,等等。 - 与发布版结合使用,启用了 Oracle Forms 应用程序。
Fixpack 2 引进了以下功能:
NCHAR、NVARCHAR2和NCLOB支持,以及各种NCHAR函数,如TO_NCHAR和TO_NCLOB。- 使用
DBMS_DDL.WRAP和DBMS_DDL.CREATE_WRAPPED函数的 PL/SQL 代码混合。 - 函数中的命名参数调用和 DEFAULT。
- 过程中非结尾的
DEFAULT。 BULK COLLECT性能增强。
Fixpack 3 引进了以下功能:
- 对小型 LOB 进行比较,以突破页面大小限制的功能。
NUMBER性能增强。RATIO_TO_REPORT函数。RAISE_APPLICATION_ERROR的改进。- 运行时 “纯度级别” 强制。
Fixpack 4 引入了以下功能:
- 为
ROW和ARRAY OF ROW提供的 JDBC 支持。 - 多动作触发器支持。
- 对更新数据库的
BEFORE触发器的支持。 - 对
LIKE的支持,没有固定的模式。 - 对
LISTAGG字符串聚合的支持。 - 对自治事务支持的改善。
Fixpack 5 引进了以下功能:
- 为嵌套的
ROW和ARRAY提供 JDBC 支持。 - 为 PL/SQL 提供嵌入式
ROW和ARRAY支持。 - 新的
NVL2、SUBSTR2和HEXTORAW函数。 - 为
ROW和ARRAY类型中的BOOLEAN提供支持。 - 对自治事务支持的改进。
- Pro*C 支持。
- SQL 比较带有
VARCHAR2值的CHAR列的性能提升。
后续的 Fixpacks 和即将发行的 DB2 主要版本预计将提供更高级别的兼容性。
既然 DB2 已经对 PL/SQL 进行了调整,使其尽可能与 Oracle SQL 保持一致,现在就无需使用复杂的迁移工具包了。只需使用 IBM Data Movement Tool,即可轻松地将表、包或整个模式从 Oracle 中拖放到 DB2 中。在发生异常情况的时候,仅需要做少量的修改,即可将应用程序移动到 DB2,或者对应用程序进行修改,这样就可以在 DB2 和 Oracle 上操作相同的来源。
步骤可简单到只需:
- 设置必要的注册表变量:
db2set DB2_COMPATIBILITY_VECTOR=ORAdb2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
- 重启数据库管理器:
db2stopdb2start
- 创建兼容 Oracle 的数据库:
db2 create database mydb pagesize 32 Kdb2 update db cfg for mydb using auto_reval deferred_force
- 启动 IBM Data Movement Tool,并连接到 Oracle 和 DB2 数据库(参见图 6):
图 8. 使用 IBM Data Movement Tool 拖放 Oracle 模式到 DB2
连接后,就可以选择只提取 DDL 或同时提取 DDL 和数据。最后,有两个选择:通过执行生成的脚本直接部署或继续使用交互部署 面板。建议将后者用于大型应用程序。 - 使用交互部署 将所需的模式从 Oracle 移动到 DB2:
图 9. 使用 IBM Data Movement Tool 拖放 Oracle 模式到 DB2
在交互部署 模式中,您会看到一个导航树,它显示了所有从 Oracle 数据库中提取的对象。选择所有对象并执行部署菜单选项。该工具将复制这些对象到 DB2 并记录其进度。可能不能成功部署某些对象,但是该工具会为您提供选项来处理这些对象。选择对象时,您会看到 DDL 以及 DB2 遇到的错误。现在可以按需修复定义并重新部署。目标是在发生异常情况时交互式地将所有对象移动到 DB2。
那么在 DB2 9.7 中使用您的应用程序究竟有多容易呢?答案是要视情况而定。IBM 有一个供下载的工具:MEET DB2。此工具可以分析 Oracle 数据库中的所有对象并进行评分。它会生成一个报告,其中列出哪些地方可以开箱即用,哪些地方需要进行调整。要快速了解此概念,您可以 下载 MEET DB2 并自己试用它。如果您愿意,还可以通过 askdata@ca.ibm.com 与 IBM 团队取得联系,他们可以为您当前的 Oracle 数据库提供快速的兼容性评估。
图 10 显示了 MEET DB2 工具输出的示例。在此示例报告中,工具指示有 98% 的 PL/SQL 语句可立即转换至 DB2。它还可以按对象类型分解语句,并显示有多少对象在迁移过程中需要注意。
图 10. MEET DB2 报告工具执行评估
在 DB2 9.7 为期一年的测试期间,对很多应用程序(总计数十万行 PL/SQL 代码)进行了详细分析,平均开箱即用迁移率达 90%-99%。
图 11 显示了 Fixpack 4 运行时的统计数据。其中 38 个经分析的应用程序(总共 220)产生了 200 万行代码,83% 到 99.9% 的代码可立即转换至 DB2。
图 11. 支持语句的平均迁移率高达 98%
DB2 的应用程序转换方法与传统的转换完全不同。大多数供应商均提供了通过手动协助将源语言离线转换 至目标语言的工具。其结果是获得了一些非常令人费解、难以维护的代码。几乎没有供应商添加那些可以在目标语言中动态模拟 源语言的中间层。当然,设计模拟非常慢,尤其在试图实现正确语义的时候。
对于 DB2,兼容性是深入引擎各层中,由他们来处理语义和语法。DB2 已突破周期的限制,扩展到能支持必要的特性了。图 12 中的架构图突出显示了因支持 Oracle SQL 和 PL/SQL 专用语言而发生重大变化的 DB2 区域。以红色方框表示的部分(SQL 解析器并且在 SQL 编译器中重写、PL 编译器中的 PL/SQL 解析器、PL 运行时和 SQL 运行时)已经进行大量的扩展或添加了新的内容,以适应 Oracle 专用语言。
图 12. DB2 编译器和运行时引擎的架构
为 SQL 和 PL/SQL 专用语言提供的范围严格基于应用程序正在使用的版本。支持最新的 Oracle 11g 中引入的某些特性,但是不支持 Oracle 8i 中使用的某些构造。在一个涉及 38 个应用程序总共 2,048,941 行代码的研究中,83%-99.9% 的代码被原封不动的移动到了 DB2 9.7.4 中。而其他代码的调整可以自动进行或者是重复的。
这个问题很难回答!很遗憾,Oracle 许可条款中禁止任何人未经预先书面同意公布基准测试结果。不用说,我们不会自讨没趣的去询问其是否同意。但是,凭借其特别设计,又经过质量保证基准测试的确认,在 DB2 上用 PL/SQL 编写的应用程序与在 DB2 上用 SQL PL 编写的应用程序运行速度一样快。使用过这种支持过程的供应商基本上都感到惊喜。
不像大家想象的那么多。我们已经以战略方式为 DB2 9.5 完成了一些初始工作,比如 CONNECT BY 和 NUMBER。坦率地讲,这些工作会在 18 个月之内完成。我们还将继续提高兼容性。
DB2 的兼容性显然不是 100%,所以第一次在 DB2 上使用 Oracle 应用程序时可能有些小问题。但是,这些问题很多都是无足轻重的而且容易修复。例如,DB2 不支持 PIPELINED 函数。因此需要用变量赋值来替换 PIPE 语句以填充函数结果。
DB2 for LUW 支持的所有平台都支持上述的特性,包括 Windows、Linux(Intel、Power 和大型机)、HP 和 Sun Solaris。DB2 for LUW 支持所有版本的 DB2。在使用 DPF 中的 PL/SQL 函数和触发器时,有一些技术限制。
当然!可以通过转移到 DB2 9.7.5 Express C 来解除 Oracle XE 数据库大小限制。最妙的是:可以在云上使用(参阅 参考资料)。
目前为止,VARCHAR2 语义是最难实现的。“尾随空格的问题” 语义和 “NULL 是空字符串” 仍然是一个挑战。
凭借其本机多专用语言 SQL 支持,DB2 允许在 DB2 上轻松地使用 Oracle 应用程序。打包应用程序厂商可以以最少的成本提供既可用于 Oracle 又可用于 DB2 的应用程序。用户可以自由选择提供其所需技术的供应商,无需受到以前的限制。
要测试这些特性,可以下载 DB2 9.7 的试用版(参阅 参考资料)。
学习
- 在兼容模式和云中试用 IBM DB2 Express-C 9.7.5。通过使用云,您可以轻松地测试 DB2 与 Oracle DE 兼容性,而不必本地安装 DB2。
- 查看 针对数据库专业人员的 IBM DB2 工具包,注册这个电子工具包,并了解学习 DB2 for Linux, UNIX, and Windows 并通过认证是多么轻松的事。扩展您的技能,或扩展您的 DBMS 供应商支持以包含 DB2。
- Oracle Application Enablement to DB2 for LUW 维基 是支持那些在 DB2 for Linux, UNIX, and Windows 中使用 Oracle 应用程序的客户和 IBM 业务伙伴的主要资源。
- 在 DB2 9.7 launchpad 获取关于 DB2 值的概述。
- 查看 MEET DB2 并分析您的 Oracle 数据库以评估与 DB2 的兼容性。
- 访问 Chat with the Lab,收听并观看关于深入研究 DB2 9.7 技术的视频以及本文的网络广播版。
- “Moving to DB2 is Easy” 该视频演示了 DB2 对应用程序移植的支持。
- “DB2 9.7 CLPPlus” 该视频讲解了如何使用兼容 SQL*PLus 的 CLPPlus Shell。
- 观看 “DB2 9.7:Native PL/SQL Support”,该简短的视频展示了 DB2 9.7 支持的众多 PL/SQL 特性。
- 查阅 DB2 pureScale。通过使用 DB2 pureScale,您可以进行扩展并为 OLTP 应用程序提供持续的可用性。
- 在 developerWorks 中国网站 Information Management 专区 了解关于信息管理的更多信息。查找技术文档、how-to 文章、培训、下载、产品信息以及更多内容。
- 通过 专题:从 Oracle 迁移到 DB2 了解关于从 Oracle 迁移至 DB2 数据库的步骤等相关信息。
- 随时关注 developerWorks 技术活动 和 网络广播。
- 在 Twitter 上关注 developerWorks。
获得产品和技术
- 下载 DB2 9.7 for Linux, UNIX, and Windows 的试用版本。
- 下载 DB2 Express-C,这是 DB2 Express Edition 为社区提供的免费版。
- 使用可以直接从 developerWorks 下载的 IBM 试用软件 构建您的下一个开发项目。
讨论
- 参与论坛讨论。
- 从 askdata@ca.ibm.com 请求对 Oracle 至 DB2 项目的评估。
- 参与 developerWorks 博客 并加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。
- 查阅 Serge 的 SQLTips4DB2 博客。