日期:2014-05-16  浏览次数:20524 次

深究Oracle 9i和10g之间如何进行传输表空间

关于传输表空间可以参考笔者的这篇文章

http://czmmiao.iteye.com/blog/1260792

当一个Little Endian的系统试图从一个Big Endian的系统中读取数据时,就需要通过转换,否则不同的字节顺序将导致数据不能被正确读取。那么另外一个问题出现了,如果字节序相同的不同平台进行文件交互,数据能否被正确读取呢

理论上的确是可以的,但是由于在不同的平台上操作系统会在数据文件头写上系统信息,这部分信息无法跨越平台,所以仍然会导致跨平台的文件无法被数据库正确识别(Oracle10g中同字节序平台数据文件头不再存在跨平台的迁移问题)。

接下来让我们通过Windows和Linux平台来进行一个跨平台测试,相信通过这个测试可以对以上提出的问题作出一个很好的回答。
实验环境:Windows XP + Oracle10g 10.2.0.1:

SQL> select * from v$version;
BANNER
----------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

Red Hat Enterprise Linux AS release 3 + Oracle 9iR2 9.2.0.4

SQL> select * from v$version;
BANNER
----------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production

看一下Linux平台,文件头被操作系统保留了8192字节:

SQL> select file_name,bytes from dba_data_files
2 where tablespace_name='USERS';
FILE_NAME BYTES
----------------------------------- ----------
/opt/oracle/oradata/eygle/users.dbf 10485760

SQL> !
[oracle@jumper eygle]$ ll users.dbf
-rw-r----- 1 oracle dba 10493952 Mar 23 10:14 users.dbf
[oracle@jumper eygle]$ exit
exit

SQL> select 10493952 -10485760 diff from dual;
DIFF
----------
8192

Windows平台上数据文件头同样保留了8192字节:

SQL> select file_name,bytes from dba_data_files
2 where tablespace_name='USERS';
FILE_NAME BYTES
--------------------------------------------------- ----------
D:\ORADATA\EYGLE\DATAFILE\O1_MF_USERS_2G8OJYYS_.DBF 5242880

SQL> host dir D:\ORADATA\EYGLE\DATAFILE\O1_MF_USERS_2G8OJYYS_.DBF
驱动器 D 中的卷是 PRIVAT
卷的序列号是 94B0-FD3B

D:\ORADATA\EYGLE\DATAFILE 的目录

2007-03-22 17:41 5,251,072 O1_MF_USERS_2G8OJYYS_.DBF
1 个文件 5,251,072 字节
0 个目录 1,635,913,728 可用字节
SQL> select 5251072 -5242880 diff from dual;
DIFF
----------
8192

可以通过Linux和Windows平台来进行一个小测试实验,这两个平台都是Little Endian的系统:

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
............
17 rows selected.

首先在Linux下Oracle 9204中创建一个测试表空间:

[oracle@jumper oracle]$ cd oradata/eygle
[oracle@jumper eygle]$ sqlplus "/ as sysdba"
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production