
Oracle10g的数据迁移方桉.docx
9页Oracle10g 的数据迁移方案 2009-03-27 08:18 Lora 是 Acme 银行的数据库管理员,她现在在该银行高层管理团队高级会议上成 了大家最关注的核心人物这次会议的目的是确定一些方法,来使最终用户能 够详细分析公司主数据仓库中的数据会上提出的一种想法是创建几个小型数 据集市--每个集市根据一个特定的职能范围存储数据--这样每个数据集市就可 以由专门的团队来使用 为了有效地实现数据集市的方法,数据专家必须能将数据快速、有效地放入数 据集市中该团队面临的挑战就是解决如何用数据仓库中的数据快速刷新数据 集市中的数据,而这些数据集市又运行在各个结构不同的平台上这就是 Lora 为什么出席会议的原因她会为移动数据提出哪些可供选择的方法呢? 作为一名经验丰富、知识渊博的数据库管理员,Lora 向与会者提供了三种可能 的方法,分别是:使用可移动表空间 使用数据泵(导入和导出) 拖出表空间 本文介绍 Lora 对这三种可选方法的解释,包括它们的实施细节和优缺点可移动表空间 Lora 从可移动表空方法开始介绍把整个表空间移动到目标系统的最快速方法 是用 FTP(文件传输协议)或 rcp(远程复制)来简单地转移表空间的基本文件。
但是,仅仅复制 Oracle 数据文件还不够,目标数据库必须识别出并导入文件以 及相应的表空间,最终用户才能使用表空间数据使用可移动表空间包括复制 表空间文件和使它们中的数据在目标数据库中可用 在考虑该方法之前必须进行一些审查首先,对于要转移到目标系统的表空间 TS1,它必须是自含式的(self-contained)也就是说,在该表空间中表的所 有索引、分区及其他从属于该表的各数据段都必须在该表空间内部Lora 解释 说,如果一个表空间集合包含所有从属的数据段,那么就认为这个集合是自含 式的例如,如果表空间 TS1 和 TS2 要作为一个集合进行转移,TS1 中的一个表 在 TS2 中有一个索引,则这个表空间集合就是自含式的但是,如果 TS1 中的 一个表另一个索引在表空间 TS3 中,则该表空间集合 (TS1, TS2)就不是自含式 的 要移动表空间,Lora 提议使用 Oracle 数据库 10g 中的数据泵导出(Data Pump Export)工具数据泵是 Oracle 的新一代数据转移工具,它替换了早期的 Oracle Export (EXP)和 Import (IMP)工具。
这些老的工具使用正则 SQL 来提取和插入数据,而数据泵则与它们不同,它使用能绕过 SQL 缓冲区的专用 API,从 而使操作过程速度变得极快此外,数据泵可以提取特定的对象,如特定的存 储过程或特定表空间的表集合 数据泵的导出和导入可以由作业控制,数据库 管理员可以随时暂停、重启或终止这些作业 开会前 Lora 运行了一项测试,看看数据泵能否解决 Acme 的要求Lora 进行的 测试是转移 TS1 和 TS2 表空间,步骤如下: 1.检查 TS1 和 TS2 这个表空间集合是否是自含式的执行下面的命令:BEGIN SYS.DBMS_TTS.TRANSPORT_SET_CHECK ('TS1','TS2'); END;2.确定所有不可移动的集合如果没有选择任何行,则该表空间是自含式的:SELECT * FROM TRANSPORT_SET_VIOLATIONS;no rows selected3.确保该表空间是只读的:SELECT STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME IN ('TS1','TS2');STATUS --------- READ ONLY READ ONLY4.使用传输机制,如 FTP 或 rcp,将每个表空间中的数据文件移到远程系统,放 到/u01/oradata 目录下。
5.在目标数据库中,创建一个到源数据库的数据库链接(在下面的命令行中命 名为 srcdb) CREATE DATABASE LINK srcdb USING 'srcdb';6.在目标数据库中,使用数据泵导入工具将该表空间导入到该数据库中 impdp lora/lora123 TRANSPORT_DATAFILES= “'/u01/oradata/ts1_1.dbf', '/u01/oradata/ts2_1.dbf'“ NETWORK_LINK='srcdb' TRANSPORT_TABLESPACES=\(TS1,TS2\) NOLOGFILE=Y这一步就使 TS1 和 TS2 表空间以及它们的数据可以在目标数据库中可用 请注意,Lora 并没有从源数据库导出元数据她只是在上面的 impdp 命令中指 定参数 NETWORK_LINK 的值为 srcdb,即到源数据库的数据库链接数据泵导入 工具通过数据库链接从源数据库中获得所需的元数据,并在目标数据库中重新 创建它们 7. 最后,使源数据库中的 TS1 和 TS2 表空间成为可读写。
ALTER TABLESPACE TS1 READ WRITE; ALTER TABLESPACE TS2 READ WRITE;这一步使 TS1 和 TS2 表空间在源数据库中对用户立即可用 请注意,在前面讲的所有步骤中,最费时的是第 4 步,在这一步中要跨各系统 移动数据文件 跨不同平台的挑战Lora 知道,数据复制过程中的复杂因素之一就是源平台和目标平台经常不一致 例如,在 Acme 的环境中,当前数据仓库位于运行 Tru64 UNIX 的 HP 服务器上, 而建议的数据集市将部署在运行 Linux 和 Windows 的 Intel 硬件上 在 Oracle 数据库 10g 出现之前,在 Acme 使用可移动表空间不是一个切实可行 的方法你不能移动表空间,除非源数据库和目标数据库运行在同一个平台上有了 Oracle 数据库 10g,这一限制得到了极大的缓解在移动表空间时,数据 文件可以跨各操作系统任意复制在前面的例子中,数据文件可以从 Tru64 UNIX 复制到 Linux 或 Windows,而目标数据库仍能识别它们 但是,管理团队必须考虑另一种限制默认情况下,只有两个操作系统具有相 同的字节顺序(也被称为“endian-ness“)时才可能进行跨操作系统复制。
在 Acme 的情况下,Tru64 UNIX、基于 Intel 的 Linux 和 Windows 都使用 little- endian 字节顺序(低位在前),因此在它们之间进行文件复制是可能的但是, 有的团队成员提出了在有关数据仓库/数据集市的提案中使用 Solaris 操作系统 的想法Solaris 使用 big-endian 字节顺序(高位在前),这使得在数据库之 间进行简单的文件复制成为不可能Lora 解释说,Oracle 提供了使用 Oracle Recovery Manager (RMAN)进行字节顺 序转换的解决方案她描述了针对 RMAN 解决方案的一个测试,该测试根据前面 讲到的移动表空间解决方案的 7 个步骤,并稍作修改来适应 Solaris 到 Intel/Linux 的环境除了在第 5 步之前或之后额外增加一步以外,所有操作步 骤都一样在源(Solaris)数据库服务器上执行的额外这一步如代码清单 1 中所 示 用这些代码,可以从 Solaris 格式的/u01/oradata/ts1_01.dbf 文件创建 Intel Linux 格式的文件/u01/tts/ TS1_34。
注意最初的文件并没有被破坏;只是创建 了一个可以被导入和传输到 Linux 上的目标数据库中的新文件 然后 Lora 讨论了对 RMAN 解决方案的一些修改第一,为了提高性能,她可以 指定 PARALLELISM=子句来提高执行线程的数目第二,她可以指定在 不同的目录下以相同的文件名创建数据文件这些修改如下:RMAN> CONVERT TABLESPACE TS1 2> TO PLATFORM 'Linux IA (32-bit)' 3> DB_FILE_NAME_CONVERT 4> '/u01/oradata','/u01/tts' 5> PARALLELISM=4 6> ;这条命令用相同的文件名 ts1_01.dbf 但在/u01/tts 目录下根据原始文件 /u01/oradata/ts1_01.dbf 创建一个转换后的数据文件这种方法将所有转换后 的文件放到一个位置,这样确定转移哪个文件就更简单了 Lora 还可以在目标(Linux)数据库服务器而不是在源服务器上执行变换在这种 情况下,将在 Linux 服务器上执行转换,如下所示:RMAN> CONVERT DATAFILE 2> '/u01/oradata/ts1_1.dbf', '/u01/oradata/ts2_1.dbf' 3> TO PLATFORM='Linux IA (32-bit)' 4> FROM PLATFORM='Solaris[tm] OE (64-bit)' 5> DB_FILE_NAME_CONVERT=“ts“,“tslinux“ 6> ;这条命令通过用 tslinux 代替 ts(换句话说,将 ts1_1.dbf 转换到 Linux 上的 文件格式,新文件名为 tslinux1_1.dbf)来创建文件。
在数据库内,文件将用 这个文件名 Lora 怎么知道哪个平台用哪种字节顺序呢?在数据字典视图上执行以下查询就 会给出答案:SELECT * FROM V$TRANSPORTABLE_PLATFORM ORDER BY PLATFORM_ID;数据泵导出与导入工具选择可移动表空间的限制之一是在转移文件时源表空间必须是只读模式在现 实世界中,并不总是能满足这一要求例如,在 OLTP 数据库中,可能对表要经 常进行读写操作 Lora 提出的另一种方法是使用 Oracle 数据库 10g 中的数据泵实用工具来转移表 空间她对这种方法进行的测试包括移动 TS1 和 TS2 表空间内容的以下步骤: 1.创建一个目录对象来存放转储的文件CREATE DIRECTORY dump_dir AS '/u01/dumps';2.用数据泵导出工具导出数据 expdp lora/lora123 TABLESPACES=\(ts1,ts2\) DUMPFILE=ts1_ts2.dmp DIRECTORY=dump_dir这一步创建一个包含 TS1 和 TS2 表空间内容的文件/u01/dumps/ ts1_ts2.dmp。
3.将文件 ts1_ts2.dmp 转移到远程系统中,放在目录/u01/dumps 下(用文件传输的方法如 FTP 或 rcp) 4.在目标数据库中创建一个目录对象CREATE DIRECTORY dump_dir AS '/u01/dumps';5.使用数据泵导入工具将该文件导入到该数据库中 impdp lora/lora123 DIRECTORY=dump_dir DUMPFILE=ts1_ts2.dmp如果表空间内的数据量相对较小,则 Lora 可以只用一条命令执行上面的所有步 骤: impdp lora/lora123 DIRECTORY=dump_dir NETWORK_LINK='srcdb' TABLESPACES=\(ts1,ts2\) 这条命令使用数据泵导入工具将通过数据库链接 srcdb(在以前的章节中已讨论 过)检索到的数据加载到表中但是,由于网络带宽通常是受到限制的,因此 这种方法可能比使用导出/传输/导入周期方法要慢一些 如果只需将特定的表或表集合进行转移,那么 Lora 可以在 expdp 命令中使用 TABLES=子句来只下载特定的表或表集合。
