比较指南
级别: 初级
DB2 售前技术专家, ASEAN Techline, IBM
2005 年 5 月 05 日
如果您具有 Oracle 方面的经验,现在开始学习 DB2® Universal Database™,那么本文将帮助您利用以前的经验,并教您快速提升之道,以了解如何从一台机器到另一台或者从一种平台到另一种平台移动数据。
简介
两个数据库之间的数据移动是 DBA 的普通日常工作。大多数成熟的数据库提供了从一个数据库到同一平台或机器中的另一数据库,或者到其他平台或机器的另一个数据库移动数据的方法。
如果您具有 Oracle 方面的经验,并且现在开始学习 DB2,那么本文将简化您的学习过程。其意图就是使 Oracle DBA 在记住这两者的区别时,快速提升 DB2 Universal Database(DB2 UDB)的经验。我们将介绍执行数据移动所需的工具和命令,并比较和对照这两种数据库系统。此外,还要来看一些进行数据移动的场景。
注意,本文不会介绍用于数据移动的复制机制,例如 Oracle Advanced Replication 和 数据复制走上快车道,也不会考虑使用通过 JDBC、PERL DBI 和 ODBC 的定制编码获得的连通性或数据移动,因为这些接口不用于移动大量数据。
主题
本文着重介绍这两种数据库所提供的数据移动实用程序及其特性和功能。同时,我们还将考虑每个实用程序或方法的利弊。本文将涉及下列主题。在考虑这些主题时,我们要来看一些场景,以便更好地理解每个实用程序的特性和功能。
- 导入
- 导出
- 工具比较
- 快速基准测试
- 其他可用工具
- 数据移动场景
数据移动需求
在特殊的某一天,DBA 可能要参与管理工作,例如将数据文件移动到生产机器上更大的文件系统中,为测试目的创建生产数据的一个子集,或复制整个数据库用于开发。通过在开发机器上复制数据集,开发人员可以测试并丢弃数据,而无需担心其结果。每当需要一个新的数据集时,简单的恢复就可以使数据返回其初始状态,以进行另一测试循环。
在涉及万亿字节(TB)的环境中,特别是在仓库环境中,为测试目的复制整个数据库是不可行的。本例中,您可能需要一个数据子集,并具有完好的参照完整性。同时,您还可能需要为操作应用程序模块的开发人员在测试机器中部署多个合适的数据集。在完成测试时,经常必须将数据移至生产中。
进行数据移动的另一理由可能是出于各种原因需要将数据库迁移至一个新的平台。
下面总结了一些最常见的数据移动场景:
- 在当前文件系统已满时,将数据文件移至另一文件系统。
- 出于测试/开发目的,移动整个数据库或数据库子集。
- 将数据库从一个平台迁移到另一个平台。
DBA 通常基于数据库的大小、维护窗口和诸如网络/IO、CPU/内存这样的系统资源来选择数据移动的方法。在下一小节中,我们将考查进行数据移动的各种方法。
导入实用程序
首先,我们将介绍 Oracle 为数据导入所提供的实用程序。Oracle 提供了下列实用程序以导入数据:
- Oracle - imp
- Oracle - SQL Loader
Oracle - imp
Oracle 导入实用程序 imp 已经存在相当长一段时间了。imp 实用程序用于导入中小型数据库,例如大小在 100 MB 到 10 GB 之间。为了加快导入过程,您可以一次使用多个 imp 作业。而为了使用 imp,首先必须运行驻留在 /rdbms 目录中的 catalog.sql 脚本或 catexp.sql 脚本。
为了使用导入实用程序,需要包含在角色 CONNECT 中的权限 CREATE SESSION。
其中涉及两种导入模式(import schema)的方式:
- 导入同一用户模式 -
若要将对象导入同一用户模式,需要将系统和对象权限都授予给该用户,特别是 RESOURCE 角色。
- 导入其他用户模式 -
数据库对象可以由一个用户导出,而由其他用户导入。如果导入另一模式,就必须启用 IMP_FULL_DATABASE 角色。
清单 1 中显示了执行导入的语法。关于所有参数的完整解释,请查阅 Oracle Utility Guide,或者就从命令提示符发出 imp help=y。
imp keyword=value [,keyword=value,...] where keywords are USERID username/password BUFFER size of data buffer FILE input files (EXPDAT.DMP) SHOW list file contents (N) IGNORE ignore create errors (N) GRANTS import grants (Y) INDEXES import indexes (Y) ROWS import data rows (Y) LOG log file of screen output FULL import entire file (N) FROMUSER list of owner usernames TOUSER list of usernames TABLES list of table names RECORDLENGTH length of IO record INCTYPE incremental import type COMMIT commit array insert (N) PARFILE parameter filename CONSTRAINTS import constraints (Y)
或者,您可以用命令 imp help=y 获得在线帮助。
有三种方法调用 imp 实用程序:
- 命令行
例如:
图 1. 使用命令行调用 Oracle 导入实用程序imp system/password fromuser=scott touser=scott file=acct_pay.dmp - 带有 parfile 选项的命令行
例如:
图 2. 使用带有 parfile 参数的命令行调用 Oracle 导入实用程序imp system/manager parfile=Acct_Pay.txt - 命令行交互
图 3. 交互调用 Oracle 导入实用程序
一共有 4 种不同的导入方式。下面,您将看到一些使用导入实用程序的例子。在开始考查这些例子时,您将看到很多重要的考虑因素。例如,为了尽可能减少错误,最好使用 CONSTRAINTS=N 来禁用参照完整性。在导入结束时,将启用约束。同时,还应禁用触发器。在导入完成后,DBA 通常执行一个脚本来生成这些触发器。
只有 Oracle exp 实用程序所生成的导出转储(dump)可以使用。较高版本的 imp 可以读取相同或更低版本的导出转储。然而,当试图从较低版本的导出实用程序导入转储文件时,将发生错误。
以下是 4 种导入方式的例子:
- 全导入 - FULL=Y。
若参数 FULL=Y,那么将导入所有之前使用 FULL=Y 所导出的对象。为了确保可以成功执行全导入,要注意一些步骤。有关更多细节,请查阅 场景 小节。
- 用户级导入 - FromUser 和 Touser
例如,要导入用户模式 scott 的所有对象,就发出命令:
图 4. 使用 Fromuser 和 Touser 参数进行导入imp system/password fromuser=scott Touser=allan file=Acct_Pay.dmp。 - 表级导入 - Tables = (*)
- 使用 Table = (*) 进行导入。例如,要导入模式 Scott 中的所有表,就发出命令:
imp system/password fromuser=scott touser=allan file=Acct_Pay.dmp tables=(*)。 图 5. 导入所有表 - 使用 Tables = (A, B, C) 进行导入。例如,
imp system/password
- 使用 Table = (*) 进行导入。例如,要导入模式 Scott 中的所有表,就发出命令:






