Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3385992
  • 博文数量: 631
  • 博客积分: 10716
  • 博客等级: 上将
  • 技术积分: 8397
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-01 22:35
文章分类

全部博文(631)

文章存档

2020年(2)

2019年(22)

2018年(4)

2017年(37)

2016年(22)

2015年(1)

2013年(12)

2012年(20)

2011年(19)

2010年(20)

2009年(282)

2008年(190)

分类: 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

看到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.dmp
datafiles=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/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
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 成功完成

阅读(3640) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~