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