可传输表空间现在可以跨平台移植,从而使得数据发布更快更轻易。此外,外部表下载使得通过转换进行数据转移的任务更简单更快。
如何将数据从一个数据库转移到另一个数据库?在现有的几种方法中,有一种方法尤为出色:可传输表空间。在这种方法中,使用一组自包含、只读的表空间,只导出元数据,在操作系统层将这些表空间的数据文件拷贝至目标平台,并将元数据导入数据字典 — 这个过程称为插入。
操作系统文件拷贝一般比其它传统的数据转移方法(如导出/导入或 SQL*Loader)要快得多。然而,在 Oracle9i 数据库和更低版本中,可传输表空间仅限于在目标数据库和源数据库都运行在同一操作系统平台上的少数情况下才有用 — 例如,不能在 Solaris 和 HP-UX 平台之间传输表空间。
在 Oracle 数据库 10g 中,这个局限消失了:只要操作系统字节顺序相同,就可以在平台之间传输表空间。本文将不就字节顺序展开长篇的讨论,但这里只要提几句话就足够了:一些操作系统(包括 Windows)在低位内存地址中用最低有效字节存储多字节二进制数据;因此这种系统被称为低地址低字节序。相反,其它的操作系统(包括 Solaris)将最高有效字节存储在低位内存地址中,因此这种系统被称为低地址高字节序。当一个低地址高字节序的系统试图从一个低地址低字节序的系统中读取数据时,需要一个转换过程 — 否则,字节顺序将导致不能正确解释读取的数据。(有关字节顺序的具体说明,请阅读嵌入式系统编程的 2002 年 1 月刊中的一篇极好的文章“字节顺序介绍”。)不过,当在相同字节顺序的平台之间传输表空间时,不需要任何转换。
怎么知道哪一种操作系统采用哪一种字节顺序?不需猜测或搜索互联网,相反只需简单地执行以下查询:
SQL> select * from v$transportable_platform order by platform_id;
PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
----------- ----------------------------------- --------------
1 Solaris[tm] OE (32-bit) Big
2 Solaris[tm] OE (64-bit) Big
3 HP-UX (64-bit)Big
4 HP-UX IA (64-bit) Big
5 HP Tru64 UNIX Little
6 AIX-Based Systems (64-bit)Big
7 Microsoft Windows IA (32-bit) Little
8 Microsoft Windows IA (64-bit) Little
9 IBM zSeries Based Linux Big
10 Linux IA (32-bit) Little
11 Linux IA (64-bit) Little
12 Microsoft Windows 64-bit for AMDLittle
13 Linux 64-bit for AMDLittle
15 HP Open VMS Little
16 Apple Mac OSBig
假设想从一台在 Intel 体系结构上运行 Linux 操作系统的主机 SRC1 中将一个表空间 USERS 传输到运行 Microsoft Windows 操作系统的计算机 TGT1 上。源平台和目标平台都是低地址低字节序的。表空间 USERS 的数据文件是 users_01.dbf。将按照类似以下的方法来进行操作。
使表空间为只读:
alter tablespace users read only;
导出表空间。在操作系统提示符下执行:
eXP tablespaces=users transport_tablespace=y file=exp_ts_users.dmp
exp_ts_users.dmp 文件只包含元数据(不是表空间 USERS 的内容)因此它将非常小。将文件 exp_ts_users.dmp 和 users_01.dbf 拷贝至主机 TGT1。假如使用 FTP,那么将需要指定二进制选项。
将表空间插入到数据库中。在操作系统命令提示符下执行下面的语句:
imp tablespaces=users transport_tablespace=y
file=exp_ts_users.dmp datafiles='users_01.dbf'
在第 4 步之后,目标数据库将有一个名称为 USERS 的表空间,并将提供该表空间的内容。请记住,系统 SRC1 和 TGT1 分别是 Linux 和 Windows。到 Oracle9i 为止,运行在 TGT1 上的数据库不能识别第 4 步中的数据文件 users_01.dbf,从而使得整个过程无用。您将必须求助其它一些方法(如常规的导出和导入、创建纯文本文件并通过 SQL*Loader 加载,或直接在不同的数据库间连接加载插入)。
在 10g 中,不再需要这些替代方法,因为目标数据库能够识别来自另一个平台的数据文件。在我们的示例中,源主机和目标主机运行的操作系统的字节顺序是相同的(低地址低字节序),因此不需要任何转换。
这个功能在数据仓库中非凡有用,其中更小的面向对象的数据集市经常在刷新之后从仓库中进行填充。利用 10g,这些数据集市现在能够放在更小、更廉价的计算机(如运行 Linux 的 Intel boxes)中,而将数据仓库服务器放在更大的企业级计算机中。从本质上讲,利用可传输表空间,现在可以更好地利用各种硬件和操作系统的组合。
跨不同字节顺序的平台
假如平台是不同字节顺序的,那么将如何实现可传输性?正如我之前说明的,目标计算机的字节顺序假如与源计算机的字节顺序不同,那么将不能正确地读取数据文件,因而不可能简单地拷贝数据文件。但别灰心,在 Oracle 10g RMAN 实用程序中提供了帮助,它支持将数据文件从一种字节顺序向另一种字节顺序转换。
在上面的例子中,假如主机 SRC1 运行在 Linux 上(低地址低字节序),而目标主机 TGT1 运行在 HP-UX 上(低地址高字节序),那么需要在第 3 步和第 4 步之间引入另一个步骤,以进行转换。利用 RMAN,您将在源计算机 SRC1 上把数据文件从 Linux 转换成 HP-UX 格式(假定已经使表空间变为只读):
RMAN> convert tablespace users
2> to platform 'HP-UX (64-bit)'
3>format='/home/oracle/rman_bkups/%N_%f';
Starting backup at 14-MAR-04
using channel ORA_DISK_1
channel ORA_DISK_1:starting datafile conversion
input datafile fno=00004 name=/usr/oradata/dw/starz10/users01.dbf
converted datafile=/home/oracle/rman_bkups/USERS_4
channel ORA_DISK_1:datafile conversion complete,
elapsed time: 00:00:07
Finished backup at 14-MAR-04
这个步骤在目录 /home/oracle/rman_bkups 中创建了一个标准 RMAN 文件格式_ 的文件。注重我们没有触及表空间 USERS 的数据文件;而是为 HP-UX 创建了一个新文件。现在可以将这个文件拷贝至目标系统,剩下的步骤很简单。
这个 RMAN 转换命令非常强大。按照上面给定的形式,它可以按顺序创建数据文件。对于包含多个数据文件的表空间,可以命令同时转换并运行多个数据文件。要实现这一目的,将需要在上述命令中添加一个子句:
parallelism = 4
该子句创建四个 RMAN 通道,每一个通道处理一个数据文件。不过,一种更有用的方法是用一个步骤转换大量的表空间,在这种情况下并行转换将真正带来很大的帮助。下面我们将两个表空间 USERS 和 MAINTS 转换至 HP-UX:
RMAN> convert tablespace users, maints
2> to platform 'HP-UX (64-bit)'
3> format='/home/oracle/rman_bkups/%N_%f'
4> parallelism = 5;
Starting backup at 14-MAR-04
using target database controlfile instead of recovery catalog
allocated channel:ORA_DISK_1
channel ORA_DISK_1:sid=244 devtype=DISK
allocated channel:ORA_DISK_2
channel ORA_DISK_2:sid=243 devtype=DISK
allocated channel:ORA_DISK_3
channel ORA_DISK_3:sid=245 devtype=DISK
allocated channel:ORA_DISK_4
channel ORA_DISK_4:sid=272 devtype=DISK
allocated channel:ORA_DISK_5
channel ORA_DISK_5:sid=253 devtype=DISK
channel ORA_DISK_1:starting datafile conversion
input datafile fno=00004 name=/usr/oradata/dw10/dw10/users01.dbf
channel ORA_DISK_2:starting datafile conversion
input datafile fno=00005 name=/usr/oradata/dw10/dw10/users02.dbf
channel ORA_DISK_3:starting datafile conversion
input datafile fno=00006 name=/usr/oradata/dw10/dw10/maints01.dbf
channel ORA_DISK_4:starting datafile conversion
input datafile fno=00007 name=/usr/oradata/dw10/dw10/maints02.dbf
converted datafile=/home/oracle/rman_bkups/USERS_4
channel ORA_DISK_1:datafile conversion complete, elapsed time: 00:00:03
converted datafile=/home/oracle/rman_bkups/USERS_5
channel ORA_DISK_2:datafile conversion complete, elapsed time: 00:00:00
converted datafile=/home/oracle/rman_bkups/MAINTS_6
channel ORA_DISK_3:datafile conversion complete, elapsed time: 00:00:01
converted datafile=/home/oracle/rman_bkups/MAINTS_7
channel ORA_DISK_4:datafile conversion complete, elapsed time: 00:00:01
Finished backup at 14-MAR-04
在上述例子中,转换后的文件名难于辨认并很难与原始文件关联(例如,文件 users01.dbf 变为 USERS_4)。相反,还可以使用其它格式来为数据文件命名。