《循序渐进Oracle》第一章连载-之九

来源:互联网 发布:debian网络安装不动 编辑:程序博客网 时间:2024/06/05 10:15

《循序渐进Oracle》第一章连载-之九

作者:eygle |English Version 【转载时请以超链接形式标明文章出处和作者信息及本声明】
链接:http://www.eygle.com/archives/2007/08/stepbs_oracle_chp1_09.html
站内相关文章|Related Articles
  • 《循序渐进Oracle》一书及相关信息
  • 《循序渐进Oracle》再次重印
  • 《循序渐进Oracle》一书重印
  • 《循序渐进Oracle》之后写什么?
  • 《循序渐进Oracle》一书序言
  • 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'sTravels》(《格利佛游记》)。该小说在描述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

    看到Windows平台和Solaris平台的字节顺序是不同的,Windows是Little-Endian,而Solaris是Big-Endian的。
    可以通过数据库查询Oracle 10g支持的平台转换:


    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.

    3. 源平台的导出及转换

    接下来开始我们的测试,创建一个独立的自包含表空间,并创建一个测试表:

    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
    2 datafile '/data2/ora10g/oradata/mars/trans.dbf' size 10M;
    Tablespace created.

    SQL> create user trans identified by trans
    2 default tablespace trans;
    User created.

    SQL> grant connect,resource to trans;
    Grant succeeded.

    SQL> connect trans/trans
    Connected.
    SQL> create table test as select * from dict;
    Table created.

    SQL> select count(*) from test;
    COUNT(*)
    ----------
    617

    将表空间设置为只读:

    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
    Copyright (c) 1982, 2005, Oracle. All rights reserved.

    Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
    With the Partitioning, OLAP and Data Mining options
    Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set
    Note: table data (rows) will not be exported
    About to export transportable tablespace metadata...
    For tablespace TRANS ...
    . exporting cluster definitions
    . exporting table definitions
    . . exporting table TEST
    . exporting referential integrity constraints
    . exporting triggers
    . end transportable tablespace metadata export
    Export terminated successfully without warnings.

    使用RMAN转换文件格式:

    $ rman target /

    Recovery Manager: Release 10.2.0.1.0 - Production on Thu Mar 22 16:34:30 2007
    Copyright (c) 1982, 2005, Oracle. All rights reserved.
    connected to target database: MARS (DBID=1034439893)

    RMAN> convert tablespace trans
    2> to platform 'Microsoft Windows IA (32-bit)'
    3> format '/tmp/%N_%f';

    Starting backup at 22-MAR-07
    using target database control file instead of recovery catalog
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: sid=140 devtype=DISK
    channel ORA_DISK_1: starting datafile conversion
    input datafile fno=00005 name=/data2/ora10g/oradata/mars/trans.dbf
    converted datafile=/tmp/TRANS_5
    channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:01
    Finished backup at 22-MAR-07

    确认导出文件已生成:

    $ ls -l /tmp/TRANS*
    -rw-r----- 1 oracle dba 10493952 Mar 22 16:37 /tmp/TRANS_5

    3. 文件传输

    通过FTP获得两个文件,注意应该使用二进制方式传输(bin模式):

    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.

    4. 目标数据库的导入

    在目标数据库中,也可以使用RMAN对备份文件进行转换,以使数据文件具有更规范的名称:

    D:/oradata/EYGLE/DATAFILE>rman target /

    恢复管理器: Release 10.2.0.1.0 - Production on 星期四 3月 22 17:18:50 2007
    Copyright (c) 1982, 2005, Oracle. All rights reserved.

    连接到目标数据库: EYGLE (DBID=1417824532)

    RMAN> convert datafile 'D:/oradata/EYGLE/DATAFILE/TRANS_5'
    2> db_file_name_convert
    3> 'D:/oradata/EYGLE/DATAFILE/TRANS_5','D:/oradata/EYGLE/DATAFILE/TRANS01.DBF';

    启动 backup 于 22-3月 -07
    使用目标数据库控制文件替代恢复目录
    分配的通道: ORA_DISK_1
    通道 ORA_DISK_1: sid=144 devtype=DISK
    通道 ORA_DISK_1: 启动数据文件转换
    输出文件名=D:/ORADATA/EYGLE/DATAFILE/TRANS_5
    已转换的数据文件 = D:/ORADATA/EYGLE/DATAFILE/TRANS01.DBF
    通道 ORA_DISK_1: 数据文件转换完毕, 经过时间: 00:00:08
    完成 backup 于 22-3月 -07
    然后需要在目标数据库创建相应的用户:
    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.dmpdatafiles=D:/oradata/EYGLE/DATAFILE/TRANS01.DBF

    Import: Release 10.2.0.1.0 - Production on 星期四 3月 22 17:34:27 2007
    Copyright (c) 1982, 2005, Oracle. All rights reserved.

    连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining options

    经由常规路径由 EXPORT:V10.02.01 创建的导出文件
    即将导入可传输的表空间元数据...
    已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
    . 正在将 SYS 的对象导入到 SYS
    . 正在将 SYS 的对象导入到 SYS
    . 正在将 TRANS 的对象导入到 TRANS
    . . 正在导入表 "TEST"
    . 正在将 SYS 的对象导入到 SYS
    成功终止导入, 没有出现警告。

    注意:此处也可以在IMP时通过fromuser/touser参数将数据导入其他用户下。
    现在这个表空间已经被插入到新的数据库中,并且数据全部传输过来:

    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;
    COUNT(*)
    ----------
    617

    导入后的表空间还处于read only状态,确认后可以更改为读写模式:

    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
    已选择7行。

    SQL> alter tablespace trans read write;
    表空间已更改。

    同样,传输表空间也可以通过数据泵来完成,以下是Oracle 10gR1中插入表空间的简单示例:

    E:/Oracle/oradata/eygle/dpdata>impdp eygle/eygledumpfile=trans.dmp directory=dpdatatransport_datafiles='E:/Oracle/oradata/eygle/EYGLE/DATAFILE/TRANS01.DBF'

    Import: Release 10.1.0.2.0 - Production on 星期二, 27 4月, 2004 15:03
    Copyright (c) 2003, Oracle. All rights reserved.

    连接到: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
    With the Partitioning, OLAP and Data Mining options
    已成功加载/卸载了主表 "EYGLE"."SYS_IMPORT_TRANSPORTABLE_01"
    启动 "EYGLE"."SYS_IMPORT_TRANSPORTABLE_01": eygle/******** dumpfile=trans.dmp directory=dpdata transport_datafiles='E:/
    Oracle/oradata/eygle/EYGLE/DATAFILE/TRANS01.DBF'
    处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK
    处理对象类型 TRANSPORTABLE_EXPORT/TABLE
    处理对象类型 TRANSPORTABLE_EXPORT/TTE_POSTINST/PLUGTS_BLK
    作业 "EYGLE"."SYS_IMPORT_TRANSPORTABLE_01" 已于 15:03 成功完成

    5. 同字节序文件的跨平台

    前面说过,当一个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

    SQL> create tablespace eyglee datafile size 10M;
    Tablespace created.

    创建测试用户并创建一个测试表:

    SQL> create user eyglee identified by eyglee default tablespace eyglee;
    User created.

    SQL> grant connect,resource to eyglee;
    Grant succeeded.

    SQL> connect eyglee/eyglee
    Connected.
    SQL> create table eyglee as select * from dict;
    Table created.

    SQL> select count(*) from eyglee;
    COUNT(*)
    ----------
    477

    将表空间设置为只读:

    SQL> connect / as sysdba
    Connected.

    SQL> alter tablespace eyglee read only;
    Tablespace altered.

    SQL> select file_name from dba_data_files where tablespace_name='EYGLEE';
    FILE_NAME
    ------------------------------------------------------------
    /opt/oracle/oradata/eygle/o1_mf_eyglee_309yc9gr_.dbf

    压缩文件以方便传输:

    [oracle@jumper eygle]$ tar -cvf eyglee.tar o1_mf_eyglee_309yc9gr_.dbf
    o1_mf_eyglee_309yc9gr_.dbf
    [oracle@jumper eygle]$ gzip eyglee.tar

    导出表空间:

    [oracle@jumper eygle]$ exp /'/ as sysdba/' tablespaces=eyglee transport_tablespace=y file=trans_eyglee.dmp

    Export: Release 9.2.0.4.0 - Production on Sat Mar 24 18:17:32 2007
    Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

    Connected to: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
    With the Partitioning option
    JServer Release 9.2.0.4.0 - Production
    Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set
    Note: table data (rows) will not be exported
    About to export transportable tablespace metadata...
    For tablespace EYGLEE ...
    . exporting cluster definitions
    . exporting table definitions
    . . exporting table EYGLEE
    . exporting referential integrity constraints
    . exporting triggers
    . end transportable tablespace metadata export
    Export terminated successfully without warnings.

    [oracle@jumper eygle]$ ll *eyglee*
    -rw-r--r-- 1 oracle dba 32985 Mar 24 18:14 eyglee.tar.gz
    -rw-r----- 1 oracle dba 10493952 Mar 24 18:13 o1_mf_eyglee_309yc9gr_.dbf
    -rw-r--r-- 1 oracle dba 16384 Mar 24 18:17 trans_eyglee.dmp

    传输文件到Windows平台:

    D:/oradata/EYGLE/DATAFILE>dir *eyglee*
    D:/oradata/EYGLE/DATAFILE 的目录

    2007-03-24 18:21 32,985 eyglee.tar.gz
    2007-03-24 18:21 16,384 trans_eyglee.dmp

    D:/oradata/EYGLE/DATAFILE>gzip -d eyglee.tar.gz
    D:/oradata/EYGLE/DATAFILE>tar -xvf eyglee.tar
    tar: blocksize = 20
    x o1_mf_eyglee_309yc9gr_.dbf, 10493952 bytes, 20496 tape blocks

    在Windows上创建新用户:

    SQL> create user eyglee identified by eyglee;
    用户已创建。

    SQL> grant connect ,resource to eyglee;
    授权成功。

    如果此时导入会出现ORA-00600错误:

    D:/oradata/EYGLE/DATAFILE>imp '/ as sysdba'tablespaces=eyglee transport_tablespace=y file=trans_eyglee.dmpdatafiles=d:/oradata/EYGLE/DATAFILE/o1_mf_eyglee_309yc9gr_.dbf

    Import: Release 10.2.0.1.0 - Production on 星期六 3月 24 18:59:23 2007
    Copyright (c) 1982, 2005, Oracle. All rights reserved.

    连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining options

    经由常规路径由 EXPORT:V09.02.00 创建的导出文件
    即将导入可传输的表空间元数据...
    已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
    . 正在将 SYS 的对象导入到 SYS
    . 正在将 SYS 的对象导入到 SYS
    IMP-00017: 由于 ORACLE 错误 600, 以下语句失败:
    "BEGIN sys.dbms_plugts.beginImpTablespace('EYGLEE',9,'SYS',1,0,8192,1,1899"
    "6106462,1,2147483645,8,128,8,0,1,0,8,1407686520,1,1,18996106397,NULL,0,0,NU"
    "LL,NULL); END;"
    IMP-00003: 遇到 ORACLE 错误 600
    ORA-00600: 内部错误代码, 参数: [krhcvt_filhdr_v10_01], [], [], [], [], [], [], []
    ORA-06512: 在 "SYS.DBMS_PLUGTS", line 1801
    ORA-06512: 在 line 1
    IMP-00000: 未成功终止导入

    其中"参数: [krhcvt_filhdr_v10_01]"提示指文件头无法正确识别。
    可以通过对这个文件进行一个特殊操作,为文件更换一个Windows下数据文件的文件头,则数据文件就应该能够被数据库识别。以下是这个"小手术"操作的过程。
    首先提取一个Windows数据文件头:

    D:/oradata/EYGLE/DATAFILE>dd if=O1_MF_USERS_2G8OJYYS_.DBF of=header.dbf bs=8192 count=1
    1+0 records in
    1+0 records out

    然后去除Linux下的数据文件头:

    D:/oradata/EYGLE/DATAFILE>dd if=o1_mf_eyglee_309yc9gr_.dbf of=eyglee.dbf bs=8192 skip=1
    1280+0 records in
    1280+0 records out

    最后将这两个文件合二为一:

    D:/oradata/EYGLE/DATAFILE>copy /b header.dbf+eyglee.dbf eygleee.dbf
    header.dbf
    eyglee.dbf
    已复制 1 个文件。

    现在拥有的新文件eygleee.dbf就具有了一个Windows平台的文件头以及Linux下的"文件身"。
    至此这个文件就能够被Windows上的Oracle识别了,可以执行导入操作:

    D:/oradata/EYGLE/DATAFILE>imp '/ as sysdba'tablespaces=eyglee transport_tablespace=y file=trans_eyglee.dmpdatafiles=d:/oradata/EYGLE/DATAFILE/eygleee.dbf

    Import: Release 10.2.0.1.0 - Production on 星期六 3月 24 19:22:13 2007
    Copyright (c) 1982, 2005, Oracle. All rights reserved.

    连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining options

    经由常规路径由 EXPORT:V09.02.00 创建的导出文件
    即将导入可传输的表空间元数据...
    已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
    . 正在将 SYS 的对象导入到 SYS
    . 正在将 SYS 的对象导入到 SYS
    . 正在将 EYGLEE 的对象导入到 EYGLEE
    . . 正在导入表 "EYGLEE"
    成功终止导入, 没有出现警告。

    此时数据已经能够被正确识别:

    SQL> connect eyglee/eyglee
    已连接。
    SQL> select count(*) from eyglee;

    COUNT(*)
    ----------
    477

    最后将表空间更改为读写模式,可以进行正常的数据操作:

    SQL> connect / as sysdba
    已连接。
    SQL> alter tablespace eyglee read write;
    表空间已更改。
    SQL> connect eyglee/eyglee
    已连接。
    SQL> insert into eyglee select * from eyglee;
    已创建477行。
    SQL> insert into eyglee select * from eyglee;
    已创建954行。
    SQL> insert into eyglee select * from eyglee;
    已创建1908行。
    SQL> commit;
    提交完成。
    SQL> select count(*) from eyglee;
    COUNT(*)
    ----------
    3816

    通过这个实验,还可以得出另外一个结论,Oracle 9i的数据文件可以通过表空间传输迁移到Oracle 10g中使用。


    历史上的今天...
          >> 2006-08-03文章:
                 任何伟大的网站都死过至少一次
          >> 2005-08-03文章:
                 Google与DBA
                 Oracle10gR2中一些新特性
                 Oracle9i安装make错误解决一例
                 GreenBrowser开源
    ------
    这篇 【《循序渐进Oracle》第一章连载-之九】来自 www.eygle.com | CSDN技术网摘| del.icio.us|365Key
    原创粉丝点击