16.7 如何对数据进行跨平台移植
在两个Oracle数据库之间移植数据是很方便的。如果两个数据库的操作系统平台相同,可以利用第14章中介绍的方法,把一个表、一个用户或者一个表空间在两个数据库之间进行移植。
如果两个数据库所处的操作系统平台不同,也可以利用导入与导出的方法把一个表或者一个用户在数据库之间进行移植。如果要移植的数据量比较大,最好的方法是对一个表空间进行移植。尽管在不同平台之间文件的格式是不相同的,但是Oracle数据库在跨平台移植方面有一些很受欢迎的特点,使得这样的移植非常容易。在有些平台之间可以直接移植数据文件,不需要进行格式转换。下面分两种情况对不同平台下数据文件的移植方法进行介绍。
16.7.1 字节存储次序相同时的移植
在不同的操作系统平台下,数据文件的格式差别就在于字节存储次序的不同。在动态性能视图v$transportable_platform中能够查询Oracle所支持的操作系统平台的ID和名称,以及在这些平台下数据文件的字节存储次序。例如:
SQL>SELECT platform_id, platform_name, endian_format
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 x86 64-bit Little
13 Linux x86 64-bit Little
……
如果数据文件在两个操作系统平台中的字节存储次序(ENDIAN_FORMAT)是相同的,比如都是Little,那么数据文件可以在两个数据库之间直接移植,不需要进行格式转换。
在对数据文件进行跨平台移植之前,首先确定数据文件在这个两个操作系统之中的字节存储次序是否相同。从动态性能视图v$database中可以获得当前数据库所处操作系统平台的ID和名称。例如,下面两条SQL语句分别获得两个数据库的操作系统平台信息:
SQL>SELECT platform_id, platform_name
FROM v$database;
PLATFORM_ID PLATFORM_NAME
12 Microsoft Windows x86 64-bit
SQL>SELECT platform_id, platform_name
FROM v$database;
PLATFORM_ID PLATFORM_NAME
13 Linux x86 64-bit
然后从动态性能视图v$transportable_platform中可以得知,数据文件在这两个操作系统下的字节存储次序是相同的,都是Little。这样,在这两个数据库之间移植一个表空间就很方便了。假设要从第一个数据库中将表空间users移植到第二个数据库中,实施的步骤如下:
1)在第一个数据库中将表空间置为READ ONLY状态。例如:
SQL>ALTER TABLESPACE USERS READ ONLY;
2)利用EXP命令将表空间的结构信息导出到元数据文件中。
3)将表空间中的数据文件和元数据文件复制到第二个数据库所在的系统中。
4)利用IMP命令将表空间导入到第二个数据库中。
5)在第一个数据库中将表空间置为READ WRITE状态。例如:
SQL>ALTER TABLESPACE USERS READ WRITE;
在导出表空间时,要求用户在第一个数据库中具有EXP_FULL_DATABASE系统权限,在导入表空间时,用户需要在第二个数据库中具有IMP_FULL_DATABASE系统权限。例如,下面两条命令分别用来在两个数据库中对表空间users进行导出和导入操作:
$exp\'sys/1234 AS SYSDBA\'FILE=users.exp\TRANSPORT_TABLESPACE=Y TABLESPACES=users
$imp\'sys/1234 AS SYSDBA\'FILE=users.exp\TRANSPORT_TABLESPACE=Y DATAFILES=(/home/oracle/users01.dbf)
从上面的过程可以看出,在不同操作系统平台下移植表空间时,如果数据文件在两个操作系统中的字节存储次序相同,那么这个移植过程与两个相同平台之间表空间的移植方法是一样的,这无疑是很方便的。