http://www.linuxidc.com/Linux/2012-09/69588.htm
可传输表空间概述
Oracle 的可传输表空间特性通过将 元数据和数据文件 简单地从一个数据库移动到另一个数据库,提供 在数据库之间有效移动大数据的一种简易方法。代替重新创建对象,可移植表空间可以让 毫不费力地移动大对象,而所花费的时间是你手动创建这些对象的时间。 可移植表空间包括将属于源数据库的所有数据文件拷贝到目标数据库,并将关于表空间 数据目录信息从源数据库拷贝到目标数据库。因此,数据泵取导出和导入实用程序是可移 表空间特性的一部分。还可以传送属于表的索引表空间,使整个数据移植非常地快。
可移植表空间的应用场景 :
把数据从源数据库移动到数据仓库
把数据从升级数据库移动到数据集市
把数据从数据仓库移动到数据集市
执行表空间时间点恢复 (PITR)
归档历史数据
然而,在 Oracle9i 数据库和更低版本中,可传输表空间仅限于在目标数据库和源数据库都运行在同一操作系统平台上的少数情况下才有用 — 例如,您不能在 Solaris 和 HP-UX 平台之间传输表空间。
在Oracle 数据库 10g 中,这个局限消失了。
字节顺序和平台
数据文件所以不能跨平台,主要是由于不同平台的字节顺序不同,这是计算机领域由来已久的问题之一,在各种计算机体系结构中,由于对于字、字节等的存储机制有所不同,通信双方交流的信息单元(比特、字节、字、双字等)应该以什么样的顺序进行传送就成了一个问题,如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。
目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian 。
一些操作系统(包括Windows)在低位内存地址中存放二进制数据的最低有效字节,因此这种系统被称为Little Endian;一些操作系统(包括Solaris)将最高有效字节存储在低位内存地址中,因此这种系统被称为Big Endian。
举一个简单点的例子,假如1122这样一个数据要存入不同系统,对于Little Endian的系统,存储的顺序就是2211,小头在前;而对于Big Endian的系统来说,存储顺序就是1122,大头在前,显然Big Endian更符合我们通常的语言习惯。
那么跨平台的问题就出现了,当一个Little Endian的系统试图从一个Big 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
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
PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
----------- -------------------------------------- --------------
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
传输表空间
传输表空间的简要操作步骤
1) 确定平台的 Endian 格式
2) 确保表空间为自包含并使其只读(如果利用rman操作,可不用将表空间至于只读)
3) 用 exp、expdp等实用程序导出元数据
4) 转换数据文件以匹配 Endian 格式 ( 若一致可跳过)
5) 拷贝文件到目标系统
6) 使用 imp导入实用程序导入元数据
1、确定平台的 Endian 格式
源平台
SQL> col PLATFORM_NAME for a30
SQL> SELECT d.platform_name, endian_format FROM v$transportable_platform tp, v$database d WHERE tp.platform_name = d.platform_name;
PLATFORM_NAME ENDIAN_FORMAT
------------------------------ --------------
Linux IA (32-bit) Little
目标平台:
SQL> col platform_name for a40
SQL> SELECT d.platform_name, endian_format FROM v$transportable_platform tp, v$database d WHERE tp.platform_name = d.platform_name;
PLATFORM_NAME ENDIAN_FORMAT
------------------------------ --------------
Linux IA (32-bit) Little
这里平台之间的字节序一致,不需要转换。
2、确保表空间为自包含并使其只读
自包含表示用于传输的内部表空间集没有任何对象引用指向外部表空间集。自包含分为两种:一般自包含表空间集和完全(严格)自包含表空间集。
下面是一些典型的违反自包含的例子:
索引在待传输表空间集中而表却不在,即索引在内部表空间集,而表在外部表空间集。(注意,如果表在待传输表空间集中,而索引不在并不违反自包含原则,即表在内部表空间集,而索引在外部表空间集,不违反自包含。当然如果你坚持这样传输的话,会造成目标库中该表索引丢失)。
分区表中只有部分分区在待传输表空间集(对于分区表,要么全部包含在待传输表空间集中,要么全不包含,解决:需要进行分区交换,完全包含在内部表空间集中)。
待传输表空间中,对于引用完整性约束,如果约束指向的表不在待传输表空间集,则违反自包含约束;但如果不传输该约束,则与约束指向无关。
对于包含LOB列的表,如果表在待传输表空间集中,而Lob列不在,也是违反自包含原则的。
自包含还有严格(strict)或完全(full)self_contained.这时:
set the TTS_FULL_CHECK parameter to TRUE,对象及其依赖对象完全在内部表空间集
而非严格自包含,表在内部表空间集,依赖于表的对象在外部白空间集不违反,但只是依赖于表的对象在内部表空间集,而表在外部表空间集就违反了。
我们可以通过使用dbms_tts包里的存储过程transport_set_check,检查要传输的表空间是否是自包含。具体定义如下
PROCEDURE TRANSPORT_SET_CHECK
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
TS_LIST CLOB IN
INCL_CONSTRAINTS BOOLEAN IN DEFAULT
FULL_CHECK BOOLEAN IN DEFAULT
TS_LIST表示要传输的表空间名称列表,不同的表空间名称之间以逗号隔开
INCL_CONSTRAINTS表示要检查的子表外建(true表示是,false表示否。默认为false),也就是说,如果在要传输的表空间里的某个子表上存在外建,且该外建所指向的父表在其他表空间内,则INCL_CONSTRAINTS为true,表明违反了自包含。否则为false,表明没有违反自包含。
FULL_CHECK表示是否要检查表的索引(true表示是,false表示否。默认为false),也就是说,如果在要传输的表空间里的某个表的索引位于其他表空间内,FULL_CHECK则为true,表明违反了自包含。否则为false,表明没有违反自包含。检查后的结果在transport_set_violations视图中体现。
下面做一个简单测试
外建约束测试
SQL> create table t tablespace users
2 as
3 select object_id,object_name from user_objects;
Table created.
SQL> create table t_child tablespace example
2 as
3 select object_id,object_name from user_objects
4 where 1=2;
Table created.
SQL> alter table t add primary key(object_id);
Table altered.
SQL> alter table t_child add foreign key(object_id)
2 references
3* t(object_id)
进行外键检查
SQL> execute dbms_tts.transport_set_check('example',incl_constraints=>true);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
VIOLATIONS
--------------------------------------------------------------------------------
Constraint SYS_C005435 between table HR.T in tablespace USERS and table HR.T_CHI
LD in tablespace EXAMPLE
SQL> execute dbms_tts.transport_set_check('users',incl_constraints=>true);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
no rows selected
将users和example表空间一起进行检查
SQL> execute dbms_tts.transport_set_check('users,example',incl_constraints=>true);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
no rows selected
进行FULL_CHECK测试
SQL> create index t_index on t_child(object_id) tablespace indx;
Index created.
SQL> execute dbms_tts.transport_set_check('example',full_check=>true);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
VIOLATIONS
--------------------------------------------------------------------------------
Index HR.T_INDEX in tablespace INDX points to table HR.T_CHILD in tablespace EXA
MPLE
SQL> execute dbms_tts.transport_set_check('example,indx',full_check=>true);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
no rows selected
将索引和外键同时检查。
SQL> execute dbms_tts.transport_set_check('users,example,indx',true,true);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
no rows selected
现在将users,example,indx表空间置为只读
SQL> alter tablespace users read only;
Tablespace altered.
SQL> alter tablespace example read only;
Tablespace altered.
SQL> alter tablespace indx read only;
Tablespace altered.
利用rman创建只读表空间备份,这里必须有相应表空间的备份才能成功执行
RMAN>transport tablespace users tablespace destination '/export/home/oracle/oradata/users' auxiliary destination '/export/home/oracle/oradata/test1';
RMAN>transport tablespace example tablespace destination '/export/home/oracle/oradata/example' auxiliary destination '/export/home/oracle/oradata/test2';
RMAN>transport tablespace indx tablespace destination '/export/home/oracle/oradata/indx' auxiliary destination '/export/home/oracle/oradata/test3';
3、用 exp、expdp等实用程序导出元数据
$ exp \'/ as sysdba \' file=usr_exp_idx.tbs.dmp transport_tablespace=y tablespace=users,example,indx
LRM-00101: unknown parameter name 'tablespace'
EXP-00019: failed to process parameters, type 'EXP HELP=Y' for help
EXP-00000: Export terminated unsuccessfully
[oracle@dg1 ~]$ exp \'/ as sysdba \' file=usr_exp_idx.tbs.dmp transport_tablespace=y tablespaces=users,example,indx
Export: Release 10.2.0.1.0 - Production on Thu Nov 17 10:43:09 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses WE8ISO8859P1 character set (possible charset conversion)
Note: table data (rows) will not be exported
About to export transportable tablespace metadata...
...........................................................................................................
. end transportable tablespace metadata export
Export terminated successfully without warnings.
4、转换数据文件以匹配 Endian 格式 ( 若一致可跳过)
这里笔者的平台字节序是一致的不需要转换,如需转换则可以使用如下命令
$ rman target /
RMAN> convert tablespace trans
2> to platform 'Microsoft Windows IA (32-bit)'
3> format '/tmp/%N_%f';
5、拷贝文件到目标系统
$ scp /u01/app/oracle/oradata/czmmiao/indx01.dbf /u01/app/oracle/oradata/czmmiao/example.dbf /u01/app/oracle/oradata/czmmiao/users01.dbf usr_exp_idx.tbs.dmp 192.168.0.102:/home/oracle/
oracle@192.168.0.102's password:
indx01.dbf 100% 10MB 5.0MB/s 00:02
example.dbf 100% 100MB 4.4MB/s 00:23
users01.dbf 100% 5128KB 5.0MB/s 00:01
usr_exp_idx.tbs.dmp 100% 1072KB 1.1MB/s 00:01
6、使用 imp导入实用程序导入元数据
在导入之前我们需要确认目标数据库具有我们想导入的表空间内的对象的属主。
源数据库的对象属主
SQL> select distinct owner from dba_segments where tablespace_name in ('EXAMPLE','USERS','INDX');
OWNER
------------------------------
HR
SCOTT
OE
PM
SH
IX
SYS
TRANS
如果在目标平台没有存在该用户就会报如下错误。
IMP-00003: ORACLE error 29342 encountered
ORA-29342: user HR does not exist in the database
ORA-06512: at "SYS.DBMS_PLUGTS", line 1895
ORA-06512: at line 1
IMP-00000: Import terminated unsuccessfully
注意,如果在目标平台已经存在相应的表空间也无法成功导入,报错如下
IMP-00003: ORACLE error 29349 encountered
ORA-29349: tablespace 'USERS' already exists
ORA-06512: at "SYS.DBMS_PLUGTS", line 1801
ORA-06512: at line 1
IMP-00000: Import terminated unsuccessfully
执行导入命令
$ imp \'/ as sysdba \' file=usr_exp_idx.tbs.dmp transport_tablespace=y tablespaces=example,users,indxdatafiles=/home/oracle/users01.dbf,/home/oracle/example.dbf,/home/oracle/indx01.dbf
注意表空间名要与源数据库一致
将这3个表空间设为可读写
SQL> alter tablespace example read write;
Tablespace altered.
SQL> alter tablespace indx read write;
Tablespace altered.
SQL> alter tablespace users read write;
Tablespace altered.
至此,导入成功。
相关推荐
### Oracle表空间传输步骤详解 #### 一、概述 在Oracle数据库管理中,表空间传输是一种常见的数据库迁移技术,主要用于将一个或多个表空间从一个数据库迁移到另一个数据库。这种技术特别适用于数据量较大的场景,...
### ORACLE数据库表空间传输方式详解 #### 一、概述 在Oracle数据库管理中,表空间传输技术(Tablespace Transport)是一种高效的手段,用于在不同的数据库之间快速迁移数据。相较于传统的数据导出导入方法(例如...
最后,通过impdp命令导入元数据,排除传输表空间的统计信息,指定要迁移的表空间及其数据文件路径。 四、结论与展望 Oracle表空间传输模式的数据库升级方法在实际操作中表现出高效、便捷的特点,尤其对于非归档...
例如,在本实例中,源系统为Linux IA (32-bit),目标系统为Microsoft Windows IA (32-bit),两者均为Little endian格式,因此它们之间的表空间传输是可行的。如果不兼容,可能需要进行额外的转换步骤。 接下来,...
可传输表空间现在可以跨平台移植,从而使得数据发布更快更容易。此外,外部表下载使得通过转换进行数据转移的任务更简单更快。如何将数据从一个数据库转移到另一个数据库?在现有的几种方法中,有一种方法尤为出色:...
- Oracle 10g支持跨平台的表空间传输,前提是目标平台和源平台的操作系统字节顺序相同。 #### 六、平台字节顺序与兼容性 - **字节序**:不同的操作系统采用不同的字节序(big-endian或little-endian)存储多字节...
表空间传输是指在不同的 Oracle 数据库之间传输表空间的方法。这种方法可以解决不同版本、不同平台下的 Oracle 数据库之间的数据传输问题。 在不同的 Oracle 数据库之间传输数据需要考虑兼容性问题。不同的 Oracle ...
本测试主要是为了模拟XTTS的完整步骤过程。...F、将源端数据库表空间设置为READ ONLY模式。 G、最后一次执行C和D步骤。 H、在源端导出元数据,并在目标端导入。 I、将目标端的数据库表空间设置为READ WRITE。
例如,在表空间传输对象时,可以通过逻辑备份工具EXP导出相关的模式对象和数据,并在新的表空间内重新创建这些对象。对于表空间数据量大的情况,这种方法虽然繁琐且耗时,但目前仍是最直接的方法之一。 此外,文章...
使用可传输表空间的特性复制数据 知识点一:什么是可传输表空间(Transportable Tablespaces) 可传输表空间是 Oracle 提供的一种特性,用于进行库对库的表空间复制。要使用可传输表空间的特性,oracle 至少是 8i ...
oracle可传输表空间
Oracle数据库提供了强大的跨平台数据迁移功能,特别是通过RMAN(Recovery Manager)实现的可传输表空间技术。这个功能使得用户可以在不同字节序的平台上迁移数据库,从而实现硬件升级、操作系统更换或数据中心迁移等...
3. 实现表空间传输的方法:传统上,可以通过手工操作(如exp/imp工具)或利用数据库备份进行。现代方法包括使用Transport Tablespaces软件,它提供了一个直观的界面,方便在演播室环境中进行传输。 【Oracle数据库...
【Oracle 数据库传输表空间的数据压缩解决方案】 在Oracle数据库中,数据压缩是一种有效的节省存储空间的方法,尤其在处理大量数据时。本文针对某电信计费系统由于业务政策导致的数据量急剧增长,影响了系统的稳定...
知识点一:异构平台下传输表空间的实施 在异构平台间传输表空间是数据库管理中的一项高级操作。文章中提到的案例是Linux平台下的ASM(自动存储管理)到AIX平台下的ASM。传输表空间涉及的步骤包括准备、传输和导入等...
【传输表空间】是Oracle数据库系统中的一种特性,允许用户在不同的数据库实例间移动表空间,这在数据库迁移、灾难恢复或系统整合等场景中非常有用。本篇内容主要介绍了如何在Linux和AIX操作系统之间,利用RMAN...