级别: 初级 【程序编程相关:C#Builder 处理 DB2 通用数】
【推荐阅读:用 DB2 例程来简化迁移】 【扩展信息:构建模型驱动的 Windows 应用程序】allan w. tham
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.
清单 1. oracle imp 的语法 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 实用程序:
命令行 例如:imp system/password fromuser=scott touser=scott file=acct_pay.dmp图 1. 使用命令行调用 oracle 导入实用程序
带有 parfile 选项的命令行 例如:imp system/manager parfile=acct_pay.txt图 2. 使用带有 parfile 参数的命令行调用 oracle 导入实用程序
命令行交互图 3. 交互调用 oracle 导入实用程序
一共有 4 种不同的导入方式.下面,您将看到一些使用导入实用程序的例子.在开始考查这些例子时,您将看到很多重要的考虑因素.例如,为了尽可能减少错误,最好使用 constraints=n 来禁用参照完整性.在导入结束时,将启用约束.同时,还应禁用触发器.在导入完成后,dba 通常执行一个脚本来生成这些触发器.
只有 oracle exp 实用程序所生成的导出转储(dump)可以使用.较高版本的 imp 可以读取相同或更低版本的导出转储.然而,当试图从较低版本的导出实用程序导入转储文件时,将发生错误.
以下是 4 种导入方式的例子:
全导入 - full=y. 若参数 full=y,那么将导入所有之前使用 full=y 所导出的对象.为了确保可以成功执行全导入,要注意一些步骤.有关更多细节,请查阅 场景 小节. 用户级导入 - fromuser 与 touser 例如,要导入用户模式 scott 的所有对象,就发出命令: imp system/password fromuser=scott touser=allan file=acct_pay.dmp.图 4. 使用 fromuser 与 touser 参数进行导入
表级导入 - tables = (*) 使用 table = (*) 进行导入.例如,要导入模式 scott 中的所有表,就发出命令: imp system/password fromuser=scott touser=allan file=acct_pay.dmp tables=(*).图 5. 导入所有表
使用 tables = (a, b, c) 进行导入.例如, imp system/password fromuser=scott touser=allan file=acct_pay.dmp tables=(bonus,emp) constraints=n.图 6. 导入所选择的表
导入分区表,tables = (t:p1, t:p2) - 例如,imp scott/tiger file=scottt.dmp tables=(empp:p1, empp:p2).图 7. 导入分区表
表空间级导入 - transport_tablepspace = y.tablespaces=(a,b,c) 与 datafiles=xxx.有关 oracle 的表空间级导入的更多细节,请查阅 场景 小节.oracle - sql loader
sql loader 是 oracle 提供的一个实用程序,用以将外部文件装入 oracle 数据库.我们认为 sql loader 比 imp 更强大.更灵活.sql loader 可以筛选进行装入的数据,同时允许装入用于修改数据的 oracle sql 函数.除了变量.定长数据与流式数据以外,它还可以装入面向对象的数据.lob 数据与集合.装入方式有两种:常规路径与直接路径.从 oracle 9i 开始,最快的方法就是使用外部表(具有并行性与直接插入).通过外部表,您可以发出一条 sql select 语句来装入文件内容.
清单 2 中显示了 oracle sql loader 的语法.注意,您可以通过在命令提示符处发出 sqlldr 命令来获得完整的语法.
清单 2. sql loader 的语法 ... 下一页