分类: Oracle
2012-06-12 16:19:16
1.3.6 跨平台表空间传输
需要注意的是,在Oracle 10g之前,数据文件是不能够跨平台传输使用的,从Oracle 10g开始,Oracle支持跨平台的表空间传输,这极大地增强了数据迁移的便利性。
1. 字节顺序和平台
数据文件所以不能跨平台,主要是由于不同平台的字节顺序不同,这是计算机领域由来已久的问题之一,在各种计算机体系结构中,由于对于字、字节等的存储机制有所不同,通信双方交流的信息单元(比特、字节、字、双字等)应该以什么样的顺序进行传送就成了一个问题,如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。
目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian 。
一些操作系统(包括Windows)在低位内存地址中存放二进制数据的最低有效字节,因此这种系统被称为Little Endian;一些操作系统(包括Solaris)将最高有效字节存储在低位内存地址中,因此这种系统被称为Big Endian。
举一个简单点的例子,假如1122这样一个数据要存入不同系统,对于Little Endian的系统,存储的顺序就是2211,小头在前;而对于Big Endian的系统来说,存储顺序就是1122,大头在前,显然Big Endian更符合我们通常的语言习惯。
那么跨平台的问题就出现了,当一个Little Endian的系统试图从一个Big Endian的系统中读取数据时,就需要通过转换,否则不同的字节顺序将导致数据不能被正确读取。
说明:据考证,Endian这个词来源于Jonathan Swift在1726年写的讽刺小说《Gulliver's Travels》(《格利佛游记》)。该小说在描述Gulliver畅游小人国时碰到了如下的一个场景。在小人国里的小人因为非常小(身高6英寸)所以总是碰到一些意想不到的问题。有一次因为对水煮蛋该从大的一端(Big-End)剥开还是小的一端(Little-End)剥开的争论而引发了一场战争,并形成了两支截然对立的队伍:支持从Big-End剥开的人Swift就称作Big-Endians,而支持从Little-End剥开的人就称作Little-Endians(后缀ian表明的就是支持某种观点的人)。Endian这个词由此而来。
清楚了这个问题,接下来就可以来看看Oracle是如何处理这种情况的。
2. 源平台和目标平台
首先在迁移之前,需要确认一下源平台和目标平台的平台信息,这些信息可以通过视图v$transportable_platform和v$database视图联合查询得到。以下是源平台的信息:
SQL> col PLATFORM_NAME for a30 SQL> SELECT d.platform_name, endian_format 2 FROM v$transportable_platform tp, v$database d 3 WHERE tp.platform_name = d.platform_name; PLATFORM_NAME ENDIAN_FORMAT ------------------------------ -------------- Solaris[tm] OE (64-bit) Big |
查询目标数据库平台信息:
SQL> col platform_name for a40 SQL> SELECT d.platform_name, endian_format 2 FROM v$transportable_platform tp, v$database d 3 WHERE tp.platform_name = d.platform_name; PLATFORM_NAME ENDIAN_FORMAT ---------------------------------------- -------------- Microsoft Windows IA (32-bit) Little |
SQL> col PLATFORM_NAME for a40 SQL> select * from v$transportable_platform; PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT ----------- ---------------------------------------- -------------- 1 Solaris[tm] OE (32-bit) Big 2 Solaris[tm] OE (64-bit) Big 7 Microsoft Windows IA (32-bit) Little 10 Linux IA (32-bit) Little 6 AIX-Based Systems (64-bit) Big 3 HP-UX (64-bit) Big 5 HP Tru64 UNIX Little 4 HP-UX IA (64-bit) Big 11 Linux IA (64-bit) Little 15 HP Open VMS Little 8 Microsoft Windows IA (64-bit) Little 9 IBM zSeries Based Linux Big 13 Linux 64-bit for AMD Little 16 Apple Mac OS Big 12 Microsoft Windows 64-bit for AMD Little 17 Solaris Operating System (x86) Little 18 IBM Power Based Linux Big 17 rows selected. |
SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /data2/ora10g/oradata/mars/system01.dbf /data2/ora10g/oradata/mars/undotbs01.dbf /data2/ora10g/oradata/mars/sysaux01.dbf /data2/ora10g/oradata/mars/users01.dbf SQL> create tablespace trans SQL> create user trans identified by trans SQL> grant connect,resource to trans; SQL> connect trans/trans SQL> select count(*) from test; |
SQL> connect / as sysdba Connected. SQL> alter tablespace trans read only; Tablespace altered. |
$ exp \'/ as sysdba\' tablespaces=trans transport_tablespace=y file=exp_trans.dmp
Export: Release 10.2.0.1.0 - Production on Thu Mar 22 16:31:15 2007 Connected to: Oracle Database 10g Enterprise Edition |
$ rman target /
Recovery Manager: Release 10.2.0.1.0 - Production on Thu Mar 22 16:34:30 2007 RMAN> convert tablespace trans Starting backup at 22-MAR-07 |
$ ls -l /tmp/TRANS* -rw-r----- 1 oracle dba 10493952 Mar 22 16:37 /tmp/TRANS_5 |
D:\oradata\EYGLE\DATAFILE>ftp 172.16.33.50 Connected to 172.16.33.50. 220 testdbserver.hurray.com.cn FTP server (SunOS 5.8) ready. User (172.16.33.50:(none)): gqgai 331 Password required for gqgai. Password: 230 User gqgai logged in. ftp> bin 200 Type set to I. ftp> mget /export/home/oracle/exp_trans.dmp 200 Type set to I. mget /export/home/oracle/exp_trans.dmp? y 200 PORT command successful. 150 Binary data connection for /export/home/oracle/exp_trans.dmp (172.16.34.89,5006) (3072 bytes). 226 Binary Transfer complete. ftp: 收到 3072 字节,用时 0.00Seconds 3072000.00Kbytes/sec. ftp> mget /tmp/TRANS_5 200 Type set to I. mget /tmp/TRANS_5? y 200 PORT command successful. 150 Binary data connection for /tmp/TRANS_5 (172.16.34.89,5008) (10493952 bytes). 226 Binary Transfer complete. ftp: 收到 10493952 字节,用时 1.13Seconds 9270.28Kbytes/sec. |
D:\oradata\EYGLE\DATAFILE>rman target /
恢复管理器: Release 10.2.0.1.0 - Production on 星期四 3月 22 17:18:50 2007 连接到目标数据库: EYGLE (DBID=1417824532) RMAN> convert datafile 'D:\oradata\EYGLE\DATAFILE\TRANS_5' |
SQL> create user trans identified by trans; |
SQL> grant connect,resource to trans; |
D:\oradata\EYGLE\DATAFILE>imp '/ as sysdba' tablespaces=trans transport_tablespace=y file=exp_trans.dmp datafiles=D:\oradata\EYGLE\DATAFILE\TRANS01.DBF Import: Release 10.2.0.1.0 - Production on 星期四 3月 22 17:34:27 2007 连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production |
SQL> select name from v$datafile; NAME ------------------------------------------------------------ D:\ORADATA\EYGLE\DATAFILE\O1_MF_SYSTEM_2G8OHFX6_.DBF D:\ORADATA\EYGLE\DATAFILE\O1_MF_UNDOTBS1_2G8OJ6NB_.DBF D:\ORADATA\EYGLE\DATAFILE\O1_MF_SYSAUX_2G8OJHP9_.DBF D:\ORADATA\EYGLE\DATAFILE\O1_MF_USERS_2G8OJYYS_.DBF D:\ORADATA\EYGLE\DATAFILE\O1_MF_EYGLE_2YDGSVH7_.DBF D:\ORADATA\EYGLE\DATAFILE\TRANS01.DBF 已选择6行。 SQL> select count(*) from trans.test; |
SQL> select tablespace_name,status from dba_tablespaces; TABLESPACE_NAME STATUS ------------------------------ --------- SYSTEM ONLINE UNDOTBS1 ONLINE SYSAUX ONLINE TEMP ONLINE USERS ONLINE EYGLE ONLINE TRANS READ ONLY |
SQL> alter tablespace trans read write; |
E:\Oracle\oradata\eygle\dpdata>impdp eygle/eygle dumpfile=trans.dmp directory=dpdata transport_datafiles ='E:\Oracle\oradata\eygle\EYGLE\DATAFILE\TRANS01.DBF' Import: Release 10.1.0.2.0 - Production on 星期二, 27 4月, 2004 15:03 连接到: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production |