将 PHP 应用程序从 MySQL 移到 DB2,第 2 部分: 迁移您的数据

IBM 内部网案例研究经验总结

了解为何将 PHP 应用程序迁移到 DB2®,如何计划迁移,如何执行,如何支持,如何根据 IBM intranet 应用程序案例研究的经验处理潜在风险。这个 4 部分的系列文章分享了成功的关键任务型 PHP intranet 应用程序从 MySQL 迁移到 DB2 的经验,这个案例被 IBM 全球 4,000 名用户使用,支持 ibm.com 内容制作。第 2 部分主要介绍如何迁移数据库。

Daniel Krook, 软件工程师, IBM

Daniel Krook 是大纽约地区的 IBM/Open Group 高级认证 IT 专家。他有十多年的 web 应用程序开发经验,目前他正在使用 Java EE、DB2、REST 和移动技术为 IBM 构建云基础架构。他拥有 PHP、Java EE、BlackBerry、DB2 和 Solaris 的认证,还为 IBM developerWorks 撰写了 PHP 相关的文章,合作撰写了 IBM Redbook “Developing PHP Applications for IBM Data Servers”。


developerWorks 投稿作者

Yan Li Mu, IT 架构师, IBM

Yan Li Mu 是在中国大连工作的 IT 架构师。他在 web 应用程序开发方面有超过八年的经验,特别是在 Java EE 技术、PHP 和数据库开发方面。



Mark Nusekabel, 高级 IT 架构师, IBM

Mark Nusekabel 是居住在佛罗里达地区 Tampa Bay 的 IBM/Open Group 高级认证 IT 架构师,他在信息技术方面有二十多年的经验,目前他正在使用 JavaScript、PHP、Java 和 DB2 构筑内部工具。他拥有电子商务解决方案、Java 和 XML 方面的认证。



2011 年 6 月 27 日

免费下载:IBM® DB2® Express-C 9.7.2 免费版 或者 DB2® 9.7 for Linux®, UNIX®, and Windows® 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

系列简介

MySQL 是当前最常用的数据库服务器,它和 PHP 编程语言一起用于构建动态 web 应用程序。但是,DB2 是另一个 PHP 支持的流行数据库,比 MySQL 有明显优势,这使得它最终成为许多应用程序的理想之选。

该系列文章说明了为什么将 PHP 应用程序迁移到 DB2,如何准备迁移,如何执行,如何支持,如何根据作者最近的迁移经验处理潜在风险。本文提供了许多代码和配置样例,以及帮助项目顺利进行的资源指南。

使用成功的真实转换中得来的示例和经验,您将会了解到这是一个简单的项目,有充分的文档记录,并提供显而易见的好处。

该 4 部分的系列文章分享了生产级,关键任务型 PHP intranet 应用程序成功从 MySQL 迁移到 DB2 的经验,该案例被 IBM 全球 4,000 名用户使用,支持 ibm.com 内容制作。

  • 第 1 部分介绍了迁移准备的步骤。
  • 第 2 部分介绍了迁移数据库的步骤。
  • 第 3 部分介绍了转换 PHP 代码的步骤。
  • 第 4 部分介绍了部署和支持应用程序的步骤。

您将会了解什么

该系列文章的目的就是让您了解将 PHP 应用程序从 MySQL 迁移到 DB2 通常需要什么,什么样的资源对您有帮助,以及在 2010 年初 IBM 项目团队如何完成任务。

如果您对 MySQL 到 DB2 的迁移做过调查,那么您可能已经基于产品资料了解了 DB2 提供的价值,性能基准,您在 DB2 文档中读到的功能,或者 IBM Redbooks® 中的比较,包括 MySQL to DB2 Conversion Guide(见 参考资料)。

您可能还知道 DB2 Express-C 是免费的、功能齐全的关系数据服务器,可在 Cloud 或 Amazon EC2 中使用 IBM Smart Business Development and Test 能够轻松安装和评估。这些资料的连接可以在 参考资料 部分找到。

本文为您提供了实际的迁移如何成功执行的真实例子,该例子是 2010 年 IBM 常用的 PHP intranet 应用程序,用于支持 ibm.com Web 网站各部分中发布的内容的日常管理。

在阅读完本系列之后,您将能够完成类似迁移的案例,了解需要执行的工作项目的时间和依赖关系,预测潜在风险,了解在何处寻找对各个步骤的支持。所有这些将会让您更有信心选择 DB2,为当前构建于 MySQL 上的 PHP 应用程序中最大程度地利用它。

未涉及的内容

该系列文章旨在分享从 MySQL 到 DB2 的内部 IBM 迁移中得到的经验,为您提供执行类似迁移可用的资源信息。但是它不是适用所有情况的全面迁移指南。

为了决定正确的方法,请参阅 MySQL to DB2 Conversion Guide 或者联系 Software Migration Project Office(SMPO)获取免费的迁移估算。相关链接见 参考资料


数据库迁移介绍

本文介绍了将数据库从 MySQL 迁移到 DB2 的 4 个步骤。如果需要,请参考 将 PHP 应用程序从 MySQL 移动到 DB2,第 1 部分:为您的迁移做好准备 以了解这些步骤在开始迁移之前整个迁移过程的安排。

第 1 步:将 MySQL 数据库结构转换为 DB2 格式
  • 在 DB2 中创建新的数据库
  • 提取源 MySQL 数据库结构
  • 对数据库执行反向工程以获得实体-关系图
  • 优化和修改数据模型结构
  • 转换其他的数据库对象
第 2 步:将 MySQL 数据转移到 DB2 数据库
  • 删除不需要的表和数据
  • 转换源数据库中可能与 DB2 数据类型不一致的所有数据
  • 从 MySQL 提取数据
  • 将数据加载到 DB2
  • 重置所生成的自增标识字段
第 3 步:重建用户权限和数据库管理配置
  • 创建必要的用户帐号并给他们分配相应的权限
  • 实现数据库备份和灾难恢复计划
  • 配置复制以一个 Cognos 报表机制可以使用的镜像系统
第 4 步:估计数据库迁移基线

理解现有 MySQL PTT 数据库示例案例研究

温馨提示

如果有必要,您可以先了解 参考资料 中对您完成迁移有益的资料。以下资源对于各个步骤是很有用的:

  • IBM Redbook®MySQL to DB2 Conversion Guide 的第 6、7 和 9 章
  • developerWorks 文章 “推荐读物: DB2 for Linux, UNIX, and Windows 数据库管理”
  • developerWorks 系列文章 “利用 MySQL 技能学习 DB2 Express”

当然,用于迁移数据库的工具的产品文档、IBM Data Movement Tool 和 Rational Software Architect 也是很重要的。

另一个方法是利用云来执行迁移过程。您可以使用 Amazon EC2 Linux 和 DB2 AMI,或者注册 IBM 云的 IBM Development and Test(见 参考资料)。

对于本文的示例数据库,Project Tracking Tool (PTT) 源 MySQL 数据库包含 150 个表,每个表平均有 6 个字段,总共存储有 10 GB 的内容数据。PTT 原先是基于 MySQL 3.23 开发的,并在后来的 7 年里迁移到 5.0。所有表都使用默认的 MyISAM 引擎。

PTT 数据库被用于支持 ibm.com 信息发布流程的各种功能。这个应用程序会处理二进制文件,如产品图像和产品文档,但是这些文件是保存在文件系统中,而逻辑路径则保存在数据库表的一个字段中,而不是将二制数直接保存在数据库中。

全球有 4,000 个用户通过 PHP Web 前端界面访问和修改这个数据库。在任意时刻都会有几百个用户在并发使用这个系统。

数据是来自于一个 MySQL 主服务器,它同时支持数据读和写。另外还同步了一个副本数据库,它支持只读报表和特殊查询。数据会在当晚备份和存档。

本文介绍了如何在一个新的 DB2 系统上创建一个相似的配置。您还将优化您的数据库设计,提高它的完整性和数据质量,删除一些无用或废弃的结构。这将通过减少需要移动的对象数量而帮助您简化迁移过程,通过减少迁移数据来节省空间,并且减少现有的无用数据所造成的混淆可能性。


安装迁移软件

为了准备示例数据库迁移,需要在用于执行这些迁移步骤的 Windows 工作站上安装以下组件。

源数据库的 MySQL 版本的副本
数据库迁移是一个交互过程,所以要将源 MySQL 数据库的副本安装到工作站上以方便访问。这样,性能在迁移过程中会比安装在远程系统时更好一些,而且它使我们在执行迁移步骤时可以根据需要修改源数据库。
DB2 的版本
要安装 DB2 以便在工作站上创建新的目标数据库。一般而言,这时数据库版本不需要与生产环境所使用版本相同,但是为了实现完整特性兼容,最好选择一样版数据库。为了完成本文示例,需要安装 DB2 Enterprise Server Edition Version 9.7.2。
IBM Data Movement Tool
下载并解压缩最新版本 IBM Data Movement Tool(见 参考资料),您可以使用它从 MySQL 取数据库,然后将其导入 DB2 中。
IBM 的一个基于 Eclipse 且具有数据透视图的集成开发环境(IDE)(可选)
您可以使用现有的 Rational® Software Architect 发行版,因为它是一个一体化开发工具,可用于可视化和编辑数据库模型。您可以在 参考资料 中找到 Rational Software Architect 及类似工具的链接,如 InfoSphere™ Data Architect 和 Optim™ Development Studio。

一定要详细记录您的配置决策和学习到的经验教训,这样您才能够在部署时重复这些步骤。当重要的目标实现时,一定要考虑将一个 Windows 操作系统快照保存为用毫秒数标记的虚拟镜像,从而将它作为进一步的数据库改进对比的配置备份和基线。

如果您希望捕捉一个物理主机配置的镜像,您可以通过免费的 VMware vCenter Converter 实现。此外,您可以考虑使用云来保存这些亲身实践的修改。您可以使用 Amazon EC2 DB2 AMI,或者注册 IBM Development and Test 来获得服务器硬件及安装一个操作系统和 DB2,这可以节省时间,加快迁移过程速度,以及使您更有信心试验最适合您需要的配置。所有这些产品的链接见 参考资料


第 1 步. 将 MySQL 数据库结构转换为 DB2 格式

当您在工作站上安装了必要软件之后,第一步就是从我们的 MySQL 数据库提取表,然后在新的 DB2 数据库上重新创建这些表。这个步骤包括以下的子步骤:

在 DB2 中创建一个新的数据库

PTT 应用程序需要支持全球用户,所以一定要保证新的 DB2 数据库一开始就能够支持多种不同的语言和字符集。为了支持这个需求,我们需要用 UTF-8 字符集 创建数据库。

除了选择字符集,我们还要评估哪个校对算法能够适合您的要求。校对 设置决定了 DB2 对数据库内容进行排序和比较的方式,并且它可能影响到字符串比较的性能。

为了保留基于 MySQL 的系统以字符大小写无关方式处理数据的行为,我们要选择 UCA500R1_S1 Unicode Collation Algorithm,它处理大小写和字符排序的结果是一样的。通过这个配置,字符串 roleRolerôle 的排序和比较的结果是一样的。

在您选择了编码和校对需求之后,就可以使用如 清单 1 所示的命令来创建新的 DB2 数据库。您可以在 DB2 自带的命令行处理器上执行这个命令。这里增加了换行以提高可读性。

清单 1. 用于创建新的 DB2 数据库的命令
CREATE DATABASE PTT 
USING CODESET UTF-8
TERRITORY US 
COLLATE USING UCA500R1_S1
PAGESIZE 4096;

在创建数据库时,您可以接受一些默认设置,它们会使 DB2 使用其内置的自动化特性来自动执行一些维护任务。例如,自动存储默认是打开的,并且自我调整的内存管理器也是激活的。

在创建数据库时,您还可以指定许多其他的选项。了解这些设置是很有意义的,因为在一开始就将您的数据库配置正确显然要比在后面才应用设置要好。MySQL to DB2 Conversion Guide 的 6.2.1 节(见 参考资料)详细介绍了许多此类选项。

提取 MySQL 源数据库的结构

下一个任务是从 MySQL 提取数据库结构,然后将它加载到 DB2 中。如果您的数据库较小,那么您可以使用 mysqldump 工具从 MySQL 提取源 DDL,然后手动对它修改以符合等效的 DB2 语法。MySQL to DB2 Conversion Guide 的 6.1 节(见 参考资料)介绍了每一种数据类型,并在一个表格中介绍它们可以如何映射。

如果数据库较大,如本文中包含 150 个表的示例数据库,那么要考虑使用 IBM Data Movement Tool 自动提取数据库结构。IBM Data Movement Tool 提供了一个简单的用户界面,它经过配置可以连接本地 MySQL 数据库和新创建的 DB2 数据库。关于完成此步骤的详细说明见 参考资料

对于本例,只需要选择 Data 复选框,然后单击 Extract DDL/Data,如 图 1 所示。

图 1. 提取 DDL
只提取 DDL 的 IBM Data Movement Tool

当 IBM Data Movement Tool 提取到数据库结构之后,您的 migr 目录就会有一组 DDL 文件。其中有些文件是空的。例如,由于示例 MySQL 源数据库没有用户定义的函数,所以 db2udf.sql 文件是空的。

执行 db2ddl.cmd 批处理任务将这些 DDL 加载到本地 DB2 数据库,它与 DDL 文件位于相同的目录。

对数据库执行反向工程获得实体-关系图

一旦 DDL 加载到 DB2 中,我们就可以使用 RSA 对 DB2 中的数据库结构进行反向设计。连接到新创建的 DB2 数据库,然后使用 Rational Software Architect 提取它的一个虚拟模型。这个过程称为 反向工程,它会将数据库转换为一个实体-关系(ER)图,其中包含表、字段及它们之间的联系。

这个步骤去掉了所有无用的表,修改了特定字段的数据类型,并添加了主键和外键。这是一个可选任务,但是它使您能够重新组织您的数据结构,从而更适合您的需要。

同样,您可能决定通过手动编辑 DDL 来修改您的数据模型,使之符合 DB2 语法,但是生成 ER 图表示的可视化模型有助于查看、记录和维护您的数据结构。这个 ER 图可以作为技术团队和业务涉众使用的文档。

您可以生成这个图,然后执行以下相关任务来获取下述优势。

建立表或视图之间的关系
这有助于理解关系数据库中表之间的相互关系。
用不同颜色标识作为通用功能的表
在这个例子中,USER、ACL 和 ROLE 表共同支持验证和授权功能,所以您可以通过在模型中给它们指定通用背景颜色而将它们在逻辑上关联起来。
高亮显示在数据结构迁移过程中修改过的字段,然后添加一些注释来解释它们修改的原因
这有助于跟踪这个过程中有哪些字段和表被修改过。

您可以通过阅读如果在 InfoSphere Data Architect 执行反向工程的文章(见 参考资料)来了解更多关于如何将一个数据库反向构建到数据模型的更详细信息。在 Eclipse Data Tools Platform 上开发的任何基于 Eclipse 的 IDE 上执行这个任务的基本过程都是类似的。但是您不是使用教程例子所使用的 Apache Derby 数据库,而是要连接到您的 DB2 数据库。

优化和修改数据模型结构

无论您是否生成一个 ER 图,您都可以开始在这个时候改进数据结构。您可以考虑对例子中所使用的结构进行这样的修改。

保证数据类型在主键及相关外键上是保持一致的。
例如,USER 表主键的数据类型是 SMALLINT,但是另一个表中逻辑上指向这个主键 USER_ID 外键是一个更大的数字 INTEGER 数据类型。您可能经常会在 MySQL 数据库结构中看到这种数据类型,因为一开始在 MySQL 中创建的数据类型并不支持强制性外键,所以这两种数据类型并不一定是一致的。
在需要时增大标识字段的最大值。
如果您的应用程序已经存在很长时间,标识字段值可能已经快要接近它们指定的最大值。迁移是您解决这个潜在问题的好机会。例如,如果 USER 表的 ID 数据类型为 SMALLINT,而用户数可能在将来超过 32,767,那么您现在应该将 ID 扩大为更大的数据类型,以便支持将来可能达到最高 20 亿的用户量。
在可能的情况下将 MySQL TEXT 域从 DB2 CLOB 文本对象类型修改为 VARCHAR 字符类型
DB2 中的 CLOB 有一些限制因素。CLOB 不能用于查找 DISTINCT 值,而且它们不能够加载到缓冲池中。因此,CLOB 可能无法正常执行,因为它们不能使用页缓存。如果可能,您应该考虑将 TEXT 域修改为 VARCHAR。因为底层的表空间定义了 VARCHAR 字段的最大值,它只能存储最大 32KB 的内容。
删除过期或无用的字段
例如,有一些应用程序会使用其他方法来存储报表,所以您可能会有一些很大的遗留表,它们存储了大量的无用数据,并且通常会使新加入团队的开发人员造成困惑。现在利用这个机会存档这些数据,并将它们从运行的数据库删除。
在需要时添加主键或惟一约束
除了键约束所提供的数据完整性之外,这对于 DB2 复制也是非常重要的。每一个表都需要一个主键或惟一键来将惟一值转移到备份数据库中。
定义和设置新外键
在 MySQL 示例数据库中是不存在外键的,因为应用程序一开始是用默认的 MyISAM 存储引擎创建的,这个引擎不支持外键。在数据转换阶段要添加必要的外键,以改进数据一致性,如保证 USER 表与 TASK_HISTORY 表相连,从而保证将修改与用户连接的审计记录不会出错。
转换或添加其他对象,如索引、视图、存储过程和函数
可视化数据结构可能有助于理解表之间的关系、它们的重要性及它们的访问频率,这可能对性能产生影响。这可以帮助您更好地理解在哪些位置应该应用约束,在哪些位置应该对相关操作进行分组,以便改进数据质量和提高读取速度。

如果您在 RSA 中定义了一个新的数据结构模型,那么您可以将它导出为一个 DDL 文件,然后用这个文件创建新的 DB2 数据库。根据数据库结构的复杂程度,您可能还可以考虑为不同的对象类型生成不同的 DDL 文件来保证各个方面具有合理的逻辑组织。

例如,迭代迁移有一个推荐使用的方法,那就是在一个文件中生成所有表的 DDL,然后为索引单独生成 DDL,然后再单独生成外键的 DDL。这个方法有助于在逻辑上将数据结构分离到逻辑上相关的部分。如果您希望查看到当前索引的清单(随时间改变),而不在 DDL 文件及其他几乎不变的对象(如表和视图)的定义中搜索索引,那么这个方法就给您提供了参考文档。

与之前的反向工程任务相似,您可以阅读 参考资料 中 InfoSphere 文档关于如何将一个物理数据模型转换到 DDL 的教程,了解如何利用 IBM 的基于 Eclipse 的工具来修改和导出数据模型。

转换其他的数据库对象

IBM Data Movement Tool 可以自动转换大多数数据库对象,如表、键、索引和表空间,但是如果您的 MySQL 源数据库有一些其他对象,那么您需要手动对它们进行转换。这其中包括视图、存储过程、用户定义函数(UDF)和触发器。

手动迁移这些对象并不难,因为 MySQL 和 DB2 都严格采用 SQL:2003 存储过程语法。而且,由于 DB2 触发器的功能集大于 MySQL 所提供的功能集,所以您可以很容易重建触发器。IBM Redbook Developing PHP Applications for IBM Data Servers 第 6 章详细介绍了两者的区别。

此外,为了避免数据迁移过程中第 2 步出现错误,您可以推迟执行这个任务,等到数据已经加载到 DB2 之后再通过您调整数据库的迁移阶段的另一次迭代来执行这个任务。


第 2 步. 将 MySQL 数据移到 DB2 数据库中

在这一步,您将从 MySQL 数据库提取数据,然后将它加载到 DB2 中。这个过程也使您有机会改进数据质量。包含以下几个子步骤:

删除不需要的表和数据

IBM Data Movement Tool 会生成一个表名.tables 文件,其中为每一个数据库表指定一条 SELECT 语句,从而指明了需要从源数据库提取哪些数据。例如,如果只提取前 4 年的数据,那么您需要删除其中一些语句,然后给其他语句加上 WHERE 子句来过滤移动数据的数量。

如果您不想将一个表从 MySQL 移动到 DB2,那么您应该将它从这个文件删除。如果您只希望移动其中一部分数据,那么您应该相应地修改 SELECT 子句。例如,如果不希望将 WORK_TMP 表迁移到 DB2,您要删除如 清单 2 所示的语句。

清单 2. 从 timetrac.tables 删除这一行语句
"timetrac"."work_tmp":SELECT * FROM "timetrac"."work_tmp"

再例如,您可能希望只保留 WORK 表中 2008 年后创建的数据。这时,您需要添加如 清单 3 所示的 WHERE 子句。

清单 3. 按日期过滤数据的一行语句
"timetrac"."work":SELECT * FROM "timetrac"."work" WHERE ts >= '2008-01-01'

转换与 DB2 不兼容的 MySQL 数据

另一个重要的任务是确定源数据库和新数据库之间的数据类型的兼容性。因为您在第 1 步的数据模型重组过程中修改了 DB2 数据库,所以要保证从 MySQL 导入的数据与 DB2 所定义的数据类型相兼容。

例如,MySQL 和 DB2 都有 TIME 数据类型,但是它们支持的范围是不同的。在 MySQL 中,TIME 表示范围从 -838:59:59 到 838:59:59 的时钟数。但是在 DB2 中,TIME 用一个 24 小时格式的时钟数表示的,范围是从 00:00:00 到 24:00:00。对于那些不符合 24 小时格式数据类型 TIME 的数据,我们需要在迁移之前将它们规范化为 MySQL 中兼容 DB2 的数据类型。清单 4 显示一条可用于执行转换的 SQL 语句。

清单 4. 将 MySQL 的 TIME 数据转换为 DB2 支持的数据类型
mysql> UPDATE WORK W SET W.HOUR = SUBTIME(W.HOUR, '24:00:00') WHERE W.HOUR >= '24:00:00';

源数据库中还有其他一些数据类型是需要在迁移之前修改的。MySQL to DB2 Conversion Guide 的 6.1 节(见 参考资料)介绍了每一种数据类型,并用一个表格介绍了数据兼容性。

从 MySQL 提取数据

当 MySQL 的数据作好了迁移准备后,再次打开 IBM Data Movement Tool,选择 Data 复选框,单击 Extract DDL/Data,如 图 2 所示。

图 2. 生成提取脚本
生成提取脚本

在完成之后,您会在 migr 文件夹看到 4 个文件:geninput、rowcount、timetrac.tables(其中 timetrac 是数据库名称)和 unload。

将 timetrac.tables 文件替换成您在数据库提取过程完成之后编辑的文件,从而限制所提取的数据。运行 unload 从 MySQL 提取数据。在迁移完成之后,检查 IBMDataMovementTool.log 文件中的错误消息。在成功卸载之后,会产生许多的文件,包括 db2load.cmd 文件和 data 文件夹。

将数据加载到 DB2 中

转到 migr 目录,运行 db2load.cmd 批处理脚本执行实际的迁移过程,将数据迁移到 DB2 中。

检查 db2load.log,查看是否所有数据都已经成功加载到 DB2 中。IBM Data Movement Tool 提供了一个脚本,它可用于验证 MySQL 源数据库的记录数是否与 DB2 表中的记录数相同。您可以执行 rowcount 命令来确认这两个数字是相同的。

除此之外,您可能还希望使用其他方法来验证 DB2 中的数据,如比较一些重要查询的输出结果。MySQL to DB2 Conversion Guide 的 7.7.7 节(见 参考资料)介绍了一些检查迁移数据的方法。

重置所生成的自增标识字段

一旦您迁移了数据,您可能需要更新您的数据库,使之在您自动生成的标识字段中从高于迁移数据所有值的数字开始计数。例如,如果您迁移的数据有 3,000 条记录,您可能希望修改您的数据库,使之为您将插入的新记录生成大于 3,000 标识值,如 5,000,而不是从 1 开始赋值标识数,因为这会导致标识冲突。清单 5 显示了用于重置所生成标识字段计算的字段定义。

清单 5. 重置所生成标识字段的命令
ALTER TABLE WORK ALTER COLUMN ID RESTART WITH 5000;

第 3 步. 重建用户权限和数据库管理配置

在数据库结构和数据导入到 DB2 之后,第 3 个重要步骤是保证数据访问(和管理)权限是正确的。您需要创建必要的用户帐号并给它们分配正确的权限。然后,您将基于现有系统来实现数据库备份和灾难恢复配置,这是您经过研究和咨询 DB2 专家后决定的 DB2 创建方式。最后,您将配置复制机制,以创建一个 Cognos® 业务智能系统可用来生成报表的镜像系统。

这个步骤包括以下子步骤:

转换权限模型

当您安装 DB2 后,您就创建了一个默认实例拥有者用户 ID db2inst1。在 MySQL 数据库中也有一个相似的管理用户 root。所以,显然每次您需要执行通常由 root 用户执行的函数时,您需要使用 db2inst1 代替执行。

您还需要创建另外两个用户帐号。用户 pttuser 可以执行应用程序所需要的读写操作。用户 read 在生产数据库和复制数据库都需要使用的帐号。这个帐号需要对生产数据库执行只读查询。复制数据库中的 Cognos 报告机制也使用 read 帐号。关于这些帐号的介绍见 表 1。

表 1. 用户清单
用户描述数据库
管理 (db2inst1)一个具有 SYSADM 权限的用户帐号 生产和报告
应用程序 (pttuser)一个具有生产数据库的读写权限的用户生产
报告 (read)一个具有生产和报告数据库只读权限的用户生产和报告

这些用户帐号可以在 Linux 操作系统上创建,然后使用 GRANT 语句给它们分配正确的数据库权限。这通常是当您创建了 DB2 数据库并将 MySQL 数据迁移到其中之后在另一个活动中完成的。然而,当您部署到生产数据库时,您将在用来创建数据库结构的同一个 DDL 中使用这些 GRANT 语句。

在 MySQL 中,分配权限通常是很粗粒度的,因为您可以将用户(由它们连接的主机名确定)读、写或其他管理权限分配给整个数据库。在这个例子中,pttuser 用户具有数据库的读写权限(只限于来自 Web 服务器主机名),因此能够访问和修改它的每一个表。

在 DB2 中,您可以给一个用户分配权限,但是您不能限定用户连接所使用的主机名。此外,在 DB2 中您可以如同在 MySQL 一样指定数据的查询、添加或更新权限。然而,您必须给用户分配数据库中每个表的访问权限,因为没有命令可以给整个数据库分配权限(除非您用该用户帐号来创建数据和表,但不推荐这样做)。因此,GRANT 命令通常会出现在 DDL 中的对象创建语句之后,如数据表。

清单 6 显示了在这个例子中分配给 WORK 表的权限。应用程序用户获得全部读写权限,而报告用户只能够读取数据。

清单 6. GRANT 示例语句
-- GRANT statements to provide read/write access to the application user account
GRANT DELETE ON TABLE "TIMETRAC"."WORK" TO USER "PTTUSER"; 
GRANT INSERT ON TABLE "TIMETRAC"."WORK" TO USER "PTTUSER"; 
GRANT SELECT ON TABLE "TIMETRAC"."WORK" TO USER "PTTUSER";  
GRANT UPDATE ON TABLE "TIMETRAC"."WORK" TO USER "PTTUSER"; 

-- GRANT statement to provide read only access to the reporting/ad hoc user account
GRANT SELECT ON TABLE "TIMETRAC"."WORK" TO USER "READ";

MySQL to DB2 Conversion Guide 的 7.1.3 节(见 参考资料)详细介绍了用户帐号管理和 DB2 的细致选项的区别。

转换备份和恢复过程

您现在可以实现一个灾难恢复计划,它将平衡您的高可用应用程序需求与仔细存档数据需求。

在 MySQL 中,您可以使用诸如 mysqldump 命令来备份您的数据,然后执行 SQL 来恢复数据。在示例系统中,您希望使用 mysqldump 进行每晚备份,并且您可能希望运行一个同步复制数据作为只读报告用途,它可以作为两种用途的联机故障恢复系统。

对于新数据库,要使用 DB2 所提供的工具来调度备份和恢复命令。这命令有多个选项,您可以选择进行完整备份或增量备份,脱机备份或联机备份。例如,您可能希望每天做一次联机增量备份,然后每周在维护期间执行脱机完整备份。表 2 显示了一个备份和恢复策略与调度示例。

表 2. 备份和灾难恢复计划
任务描述
每晚联机备份每晚执行一次 DB2 联机备份,然后将它存储在同一台 DB2 服务器上。这提供了一种从简单数据库问题中快速简单恢复的机制。它不要求您关闭应用程序。然而,它也不支持使用日志从备份向前回滚恢复,这意味着在备份执行和数据库崩溃期间生成的数据可能会丢失。
每周脱机备份每周末执行一次 DB2 脱机备份,然后将它存储在另一台服务器,最好是在另一个物理位置的服务器。这提供了针对重大服务器问题的更可靠恢复机制。 这要求您关闭应用程序。然而,它支持使用日志从备份向前恢复,这意味着数据可以通过备份和备份发生以来由日志回放记录的操作进行完全恢复。

MySQL to DB2 Conversion Guide 的第 9 章(见 参考资料)对于确定和实现新的备份和恢复过程是非常重要的。它提供了一个示例备份命令,以及如何使用 DB2 Control Center 或 Optim™ Development Studio 调度备份执行的指标。

转换报告复制模型

正如在 将 PHP 应用程序从 MySQL 移动到 DB2,第 1 部分:为您的迁移做好准备 所介绍的,通过采用诸如 Cognos 的工具来提升您的业务智能是促使您迁移到 DB2 的主要因素之一。因此,您执行查询和提取报告的复制数据库的配置是完成数据库迁移的关键部分。

如果您需要运行数据报告,那么您很可能会用一个只读复制数据库来减少主生产数据库的负载。这个复制数据库是运行数据库一个完整副本。您需要运行您访问和修改数据库主实例中信息的应用程序,将所有数据复制到可操作数据库中,然后在数据库的只读实例上运行所有报告。

同样,MySQL 和 DB2 处理复制的方式是不同的。在 MySQL 中,您可能会修改一些配置参数,然后实时地将整个数据库从一台服务器复制到另一台服务器。或者您可能会先得到备份,然后在稍后将它异步恢复到另一个数据库中。

在 DB2 中,您可以使用相似的操作,包括 SQL 复制Q 复制。例如,使用 SQL 复制来避免基于通道消息队列管理器所造成的复杂性,这个管理器是用来处理 Q 复制的。通过 SQL 复制,您可以创建一个配置,其中指定了您希望复制的每一个数据库表。每次您修改数据库结构时,您一定要同时修改这个配置。

此外,在 DB2 中创建复制之前,您会希望保证每一个数据库表都具有一个主键或惟一索引。虽然这是一个很好的实践方法,但是有一些数据库可能不满足要求。记住,示例 MySQL 表就缺少一些这样的值,因为它们以前是用基本的 MyISAM 存储引擎创建的。MySQL 复制可以在缺少主键和索引的情况下执行。然而,DB2 复制要求使用一个主键或惟一索引来区分一个表中的记录。如果一个表没有主键或惟一索引,那么运行中数据库的记录修改可能会被视为创建一个新记录,而不是修改现有的记录,因为这时没有键可用来查找所修改的记录。

MySQL to DB2 Conversion Guide 的第 9 章(见 参考资料)应该作为您复制配置策略的中心思想。DB2 提供了可用于管理复制设置的工具,或者您可以基于日志转换实现一个自定义解决方法。


第 4 步. 估计数据库迁移基线

至此,我们完成了从第 1-3 步的完整迭代过程,这些步骤本身包含了各自的子步骤,您现在应该在 Windows 工作站上创建一个正常运行的数据库系统,并且记录了一些您所修改的方面和所遇到的问题。

如果您使用的是虚拟机,那么您应该将 Windows 系统镜像捕捉为一个快照,它可以作为正常运行保存点,也可以作为比较将来性能变化的基线。当然,另一个方法是使用 IBM 或 Amazon Cloud 的虚拟镜像,然后采用相同的方法进行迁移。

您可能希望试验不同的迁移方法,以便得到最适合您环境的方法。一旦您在第 1-3 步中所使用的 Windows 工作站上得到满意的结果后,您就可以将数据库移到一个专用的服务器上,然后您可以测试本系列文章第 3 部分中 PHP 应用程序所作的修改。


结束语

本系列文章的目标是使您理解将一个 PHP 应用程序从 MySQL 迁移到 DB2 通常需要完成什么样的步骤,您可以利用的资源有哪些,并提供了一个成功的迁移示例。

在本系列文章的第 2 部分,您:

  • 了解了您所转换的 MySQL 源数据库
  • 了解了如何将数据库结构转换到 DB2
  • 了解了如何将数据迁移到 DB2
  • 了解了如何创建数据库管理

在本系列文章的下一部分,您将了解如何转换 PHP 代码。

致谢

作者对 Leons Petrazickis 和 Ambrish Bhargava 对本文的审阅和评论表示感谢。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management, Open source
ArticleID=682328
ArticleTitle=将 PHP 应用程序从 MySQL 移到 DB2,第 2 部分: 迁移您的数据
publish-date=06272011