oracle表空间传输

表空间传输




一、简介


可传输表空间(还有个集)最大的优势是其速度比export/import或unload/load要快的多。因为可传输表空间主要是复制数据文件到目标路径,然后再使用export/import或Data Pump export/import等应用仅导出/导入表空间对象的元数据到新数据库。


(1)可传输表空间的特性主要用于进行库对库的表空间复制,要进行传输的表空间必须置于read-only模式。如果生产库不允许表空间置为只读模式,没关系,方法还是有的,通过RMAN备份也可以创建可传输表空间集。
(2)要使用可传输表空间的特性,oracle至少是8i企业版或更高版本。如果是相同操作系统平台相互导入,则8i及以上版本均可支持,但如果是不同操作系统平台,数据库版本至少10g。
(3)被传输的表空间即可以是字典管理,也可以是本地管理。并且自oracle9i开始,被传输表空间的block size可以与目标数据库的block size不同。


一些操作系统(包括 Windows)在低位内存地址中用最低有效字节存储多字节二进制数据;因此这种系统被称为低地址低字节序。相反,其它的操作系统(包括 Solaris)将最高有效字节存储在低位内存地址中,因此这种系统被称为低地址高字节序。当一个低地址高字节序的系统试图从一个低地址低字节序的系统中读取数据时,需要一个转换过程— 否则,字节顺序将导致不能正确解释读取的数据。不过,当在相同字节顺序的平台之间传输表空间时,不需要任何转换。
如果平台间的endian不同,那么在执行导入操作之之前必须首先转换源平台的表空间到目标格式,如果平台间endian format相同,则可以跳过转换的步骤,即使是不同平台。当然前提是各平台的数据库版本都不低于10g。
在表空间可被传输到不同平台之前,数据文件的文件头必须能够识别其所属的原平台是什么,对于oracle数据库初始化参数中COMPATIBLE置为10.0.0或更高之后,你必须至少将表空间置为read-write一次,这点非常重要。




http://database.ctocio.com.cn/tips/341/7700841.shtml


表空间传输是通过oracle的逻辑导出命令exp/imp添加参数transport_tablespace=y进行导出导入。
执行表空间传输有以下限制条件:
(1)源数据库和目标数据库必须处于相同的平台。10g以后可以用RMAN命令修改数据文件实现跨平台移动表空间。
(2)对于源数据库和目标数据库版本不同时,源数据库的版本必须低于目标数据库。
(3)两边设置的数据库字符集和国家字符集必须一致。
(4)目标数据库不能存在需要导入的表空间。
(5)源数据库和目标数据库的blocksize必须一致(9i前)。




自oracle10gR2开始,可以传输含XMLTypes的表空间,不过必须使用imp/exp而不能选择数据泵(impdp/expdp)。并确保imp/exp命令的CONSTRAINTS和TRIGGERS参数设置为Y。
下列脚本可以列出数据库中哪些表空间含XMLTypes:
select distinct p.tablespace_name   
from dba_tablespaces p,
     dba_xml_tables x,
     dba_users u,
     all_all_tables t
where t.table_name = x.table_name
  and t.tablespace_name = p.tablespace_name
  and x.owner = u.username




传输表空间的一些限制:
(1)高级队列(Advanced Queues):可传输表空间的特性并不支持8.0兼容的高级队列
(2)系统表空间(SYSTEM Tablespace Objects):不能传输SYSTEM表空间或者SYS用户拥有的对象。
(3)映射类型(Opaque Types):由应用指定并且映射到数据库(如RAW,BFILE等)的类型可以被传输,但是它们并不会被做为跨平台转换的一部分。其实际类型是什么只有指定它的应用清楚,所以必须保证这个应用解决读取各种endian问题后再考虑将其传输到新平台。
(4)浮点数据(Floating-Point Numbers):BINARY_FLOAT和BINARY_DOUBLE类型可以使用数据泵导入导出但不支持EXP。






二、表空间传输的步骤:




1、需要移动的表空间必须是自包含的。
如果表空间中的数据与其他表空间中的数据有参照关系,那么在移动表空间时,凡是相关的表空间都需要一同移动。、
可以通过如下命令检查是否为自包含表空间:
SQL>execute dbms_tts.transport_set_check(ts_list=>'',incl_constraints=>TRUE);
参数ts_list指定需要传输的表空间,incl_constraints指定是否检查完整性约束。执行完后,检查临时表transport_set_violations,如果没有返回信息,表示表空间为自包含。


2、将需要传输的表空间设置为只读。
SQL>alter tablespace XXX read only;
如果生产库不允许表空间只读,可以选择通过RMAN备份生成表空间集的方式进行


3、以sysdba身份连接数据库执行exp导出。
C:>exp userid='sys/sys@jiong as sysdba' file=d:\testspace.dmp log=d:\testspaceexp.log transport_tablespace=y tablespaces=testspace buffer=10240000
只是导出的待传输表空间的目录结构信息(元数据),并不包含实际数据,因此导出的速度非常快,而且文件也很小


4、使用RMAN转换所要传输表空间的数据文件头为目标系统文件(10g下在不同的平台传输时)
这步转换可以在源数据库也可以在目标数据库进行。
RMAN>convert tablespace "TESTSPACE" to platform 'Microsoft Windows IA (32-bit)' format 'd:\TESTSPACE01.DBF'
记住这步结束后别忘了将表空间置回可写:
alter tablespace TESTSPACE read write


关于platform参数可以通过查询v$db_transportable_platform得到。
(1)v$db_transportable_platform
V$DB_TRANSPORTABLE_PLATFORM displays all platforms to which the database can be transported using the RMAN CONVERT DATABASE command. The transportable database feature only supports transports of the same endian platform. Therefore, V$DB_TRANSPORTABLE_PLATFORM displays fewer rows than V$TRANSPORTABLE_PLATFORM.
(2)v$transportable_platform
V$TRANSPORTABLE_PLATFORM displays all platform names and their identifiers




5、复制表空间转换后的数据文件及导出文件到目标平台


6、使用imp导入表空间
这里需要注意,在目标数据库需要先建立原先表空间里对象所属的用户,但是又不能使用同名的表空间,所以这个用户会建立在其他表空间上。
还有,如果传输的表空间集block_size与目标库的默认block_size不同,那你的第一步就得是设置目标库中DB_nK_CACHE_SIZE的初始化参数(9i以上)。
c:>imp userid='sys/sys@mood as sysdba' file=d:\testspace.dmp log=d:\testspaceimp.log tablespaces=testspace datafiles=d:\TESTSPACE01.DBF transport_tablespace=y
将用户默认表空间修改为导入的表空间:
alter user TUSER default tablespace TESTSPACE
如果需要,将导入到目标数据库的表空间置为可写,因为导入后也是处于read only状态。
alter tablespace TESTSPACE read write






===================================================测 试========================================================




1、创建测试表空间和测试用户、表
create tablespace TESTSPACE datafile
'E:\oracle\product\10.2.0\oradata\jiong\TESTSPACE01.DBF' size 50m
autoextend on next 64m maxsize unlimited
extent management local
segment space management auto


create user tuser identified by tuser default tablespace TESTSPACE
grant connect,resource to tuser
conn tuser/tuser@jiong
create table tobject as select * from all_objects


2、检查自包含性
conn sys/sys@jiong as sysdba
SQL>execute dbms_tts.transport_set_check(ts_list=>'TESTSPACE',incl_constraints=>TRUE);
select * from transport_set_violations;
设置表空间只读
alter tablespace TESTSPACE read only


3、执行导出
exp userid='sys/sys@jiong as sysdba' file=d:\testspace.dmp log=d:\testspaceexp.log transport_tablespace=y tablespaces=TESTSPACE buffer=10240000


4、模拟平台转换(同一平台传输不需要这步)
RMAN>convert tablespace "TESTSPACE" to platform 'Microsoft Windows IA (32-bit)' format 'd:\TESTSPACE01.DBF'  --这个是转换的目标地址


5、复制表空间转换后的数据文件及导出文件到目标平台
即上面的'd:\TESTSPACE01.DBF'和'd:\testspace.dmp'


6、先在目标数据库创建用户TUSER
create user tuser identified by tuser  --由于还没有TESTSPACE所以用户默认表空间是其他表空间
grant connect,resource to tuser
使用imp导入表空间
c:>imp userid='sys/sys@mood as sysdba' file=d:\testspace.dmp log=d:\testspaceimp.log tablespaces=testspace datafiles=d:\TESTSPACE01.DBF transport_tablespace=y
alter user TUSER default tablespace TESTSPACE  --将默认表空间修改为TESTSPACE






============================================================================================================================================


ORACLE传输表空间的补充




对于跨平台的传输,查询V$TRANSPORTABLE_PLATFORM视图检查两平台的endian format。如果你准备传输表空间集到不同endian平台,必须首先转换表空间集的endian与目标平台相同。前面提到,如果涉及了endian的转换,可以在生成可传输表空间集时进行(源平台进行),或者在导入表空间集之前进行(目标平台进行),转换的命令都是一个,只是参数略有不同,关于命令的用法暂且不提,后面会有专门章节介绍和实践。在这里我们先来深入一个这个操作究竟放在哪里合适。按说这个操作放在哪里执行都可以,应该没有什么可争辩的,但是值的注意的是针对我们操作的数据库,特别是对于正在运行的生产数据库,三思建议你采用在目标平台上进行转换的操作,缘由如下:
(1)缩短停机时间
  在创建可传输表空间集之前,需要将要传输的表空间状态置为read-only。你可以将数据文件迅速复制一份镜像,并生成包含元数据的export文件,然后即可将表空间状态置为read-write状态。这种安排使得表空间必须保持为只读的时间尽可能的短。
(2) 提高执行性能
  生产数据库往往同时在处理多个应用,而此时如果再用其进行转换操作可能增加系统负载,并且系统此时由于执行的任务较多,转换效率也并非最高。将转换操作移到目标平台进行,通常对于目标平台都是做为备份角色,其系统负载相对是比较低的,执行转换操作的效率相对也会更高。
(3)简化复制操作
  通过在目标平台执行转换命令时指定db_file_name_convert参数,直接将数据文件转换到目标目录内,简化复制时的操作。






===========================================================================================================================================


表空间不能置read only时的表空间传输




常规的表空间传输要求被传输的表空间在传输过程中必须置为read-only,而在实际操作过程中,对于某些生产数据库,将表空间置为read-only 是件非常复杂的事情甚至完全不允许,尤其对于超大的表空间,因为被传输的表空间在此期间仍可进行读写操作,而且把表空间置为read-only 模式可能会花费较长时间。
这里借助RMAN的数据库复制功能,通过复制数据库来解决这一问题,具体操作如下:




一、创建测试表空间和测试用户、表
create tablespace TESTSPACE datafile
'E:\oracle\product\10.2.0\oradata\mood\TESTSPACE01.DBF' size 50m
autoextend on next 64m maxsize unlimited
extent management local
segment space management auto;


create user tuser identified by tuser default tablespace TESTSPACE;
grant connect,resource to tuser;
conn tuser/tuser@mood
create table tobject as select * from all_objects;




二、检查自包含性
conn sys/sys@mood as sysdba
SQL>execute dbms_tts.transport_set_check(ts_list=>'TESTSPACE',incl_constraints=>TRUE);
select * from transport_set_violations;




三、构造“只读”的表空间(关键步骤)
[设置表空间只读 alter tablespace TESTSPACE read only;] 此步在24小时生产系统一般不允许,这里由RMAN的数据库复制功能实现。


1、确认目标数据库具有必须的备份
E:\oracle>rman target sys/sys@mood
RMAN>list backup; --一般生产环境都是有备份的
如果没有则进行全备:
RMAN> backup database plus archivelog delete input;


2、生成可传输集
E:\oracle>rman target sys/sys@mood  --连接生产数据库
RMAN>transport tablespace TESTSPACE TABLESPACE DESTINATION = 'e:\exp' auxiliary destination = 'E:\auxiliary';
生成的可传输文件将会被存储至tablespace destination参数指定的位置,其它辅助文件生成到auxiliary destination参数指定的位置


这句生成语句,可以有很多变化,这一点是read only表空间无法比拟的:
(1)加UNTIL SCN XXX,指定SCN号
(2)UNTIL TIME 'SYSDATE-1',指定时间点
(3)DATAPUMP DIRECTORY ttsdir  --指定已定义的DIRECTORY
          DUMP FILE 'dmpfile.dmp'           --指定元数据文件
          IMPORT SCRIPT. 'impscript.sql'  --指定导入脚本
          EXPORT LOG 'explog.log';          --指定导出日志文件
dmpfile.dmp及explog.log文件会自动存储到ttsdir指向的物理路径,其它文件均被生成到TABLESPACE DESTINATION目录内


注意:这里不需要像RMAN数据库复制那样自己创建辅助实例并使用,RMAN自己会构建辅助实例,并在完成数据文件和相关元数据导出操作后将这个辅助实例删除。在参考其他文档时描述了大量辅助实例创建的步骤,但其实都是不需要的。如果在生成传输集时连接了自定义的辅助实例,那么会报错:RMAN-05022: TRANSPORT TABLESPACE may not be used with user-managed auxiliary instance


注意:TRANSPORT TABLESPACE 命令执行过程中,恢复集文件并不会自动转换到目标数据库的endian 格式。如果需要转换,你必须在创建可传输集前使用rman 的convert 命令转换数据文件到目标数据库的endian 格式:
RMAN>convert tablespace "TESTSPACE" to platform 'Microsoft Windows IA (32-bit)' format 'd:\TESTSPACE01.DBF'  --这个是转换的目标地址


RMAN在删除自动实例时,最后会报无法删除文件的错误,可能为一个BUG,但对于实际使用无影响,因为辅助实例在传输完后已无用,可以直接手动删除。RMAN自动实例的数据文件均在auxiliary destination参数指定位置下的一个文件夹中,由于复制了生产库,所以在实际操作中应该需要注意这个空间要足够大。




四、复制到目标平台后执行导出
登入目标数据库,执行前面TABLESPACE DESTINATION目录下自动生成的impscrpt.sql脚本就OK了:
sqlplus sys/sys@RUI as sysdba  --执行脚本前先确认目标数据库已创建传输的表空间的用户,这里是前面建的tuser
SQL>@e:\exp\impscrpt.sql
也可以自己写impdp,注意这里使用的是datapump,所以切记前面传输的表空间中
impdp sys/sys@rui as sysdba DUMPFILE=e:\exp\DMPFILE.DMP DIRECTORY=DATA_PUMP_DIR TRANSPORT_DATAFILES=e:\exp\TESTSPACE01.DBF
通过impdp 导入有一个好处,可以通过REMAP_SCHEMA 参数指定表空间所属的schema,而不用创建表空间在源库中对应的用户




五、将目标数据库新复制的表空间置为read write
SQL>alter user tuser default tablespace TESTSPACE;
SQL>alter tablespace TESTSPACE read write;


传输完成!










============================================================================================================================================




实战RMAN备份传输表空间
http://space.itpub.net/7551038/viewspace-614393






前面各章从理论到实践详细论述了关于可传输表空间,还有个集(Transportable Tablespace Sets)的创建,其中都提到了很重要一点,就是被传输的表空间在传输过程中必须置为read-only。而在实际操作过程中,对于某些生产数据库,将表空间置为read-only是件非常复杂的事情甚至完全不允许,有了RMAN的Transportable Tablespace,这一切都得以避免。RMAN通过备份创建可传输表空间集,它并不需要存取活动的数据文件,相应也就不需要将表空间置为read-only。因此,数据库可用性得到提升,尤其对于超大的表空间,因为被传输的表空间在此期间仍可进行读写操作,而且把表空间置为read-only模式可能会花费较长时间,


使用RMAN创建可传输表空间集,允许你在传输过程中指定目标恢复时间点或SCN,这样传输的数据可以更灵活,不必完全复制现有表空间,只要备份中存在,你就可以选择性的恢复数据。例如,你的备份策略为保留一周,你希望创建的可传输表空间中数据是截止本月底最后一天的数据,那么你在下个月第一周内任何时候都可以进行传输操作而不需要考虑这期间生产库是否会有写入操作。


使用rman备份创建Transportable Tablespace Sets主要是通过RMAN中的TRANSPORT TABLESPACE命令完成的。
提示:即使并未使用rman备份数据库,TRANSPORT TABLESPACE命令也可以用来创建transportable tablespace sets。不过,你必须有要传输的表空间集数据文件拷贝,然后使用rman的catalog命令将数据文件、归档日志等文件的拷贝载入rman资料库。只有rman拥有了所需备份才能够正常执行TRANSPORT TABLESPACE。




一、适用场合




基本上,任何需要传输表空间的情况,你都可以使用rman的TRANSPORT TABLESPACE命令去创建,只要拥有所需的备份。






二、相关概念




RMAN创建可传输表空间集与RMAN Tablespace Point-in-Time Recovery (TSPITR)极其相似,如果你有过TSPITR的操作经验,那么操作这个同样不在话下。


单枪不能成事,Oracle的霸业就是靠无数相互关联的对象以不同方式巧妙组合而成。对于创建TTS而言,RMAN仍然不是一个人在战斗,他不是一个人:
  RMAN客户端(Recovery Manager client)
  源库(source database),即要传输的表空间所在库。
  源库归档及备份(Archived redo logs and backups)
  辅助实例(auxiliary instance),这个大家应该都比较熟了,如果你还不了解可以参见"Duplicate创建副本数据库"系列第2章。
  辅助集(auxiliary set),包括数据文件等其它传送所需但又并不是恢复集一部分的文件。例如SYSTEM表空间,Undo表空间之类。而辅助实例通常也不是一个人,它也有一些关联文件,例如控制文件、初始化参数文件、在线日志等,这些文件并不属于辅助集,虽然是起辅助目的,但它们的老主顾显然是辅助实例。


    辅助文件暂存地(auxiliary destination)即辅助集所包含的对象在rman transport tablespace命令执行过程中物理存放的位置,执行完之后这些文件会被删除。
提示:auxiliary destination并非必须指定,如果不指定的话,必须确保协助实例相关的各文件在初始化参数中均已指定具体存储位置。
    表空间目的地(tablespace destination),tablespace transport命令执行期间生成的传输集数据文件及其它输出文件的存储路径。
    可传输集(transportable set),由待传输表空间数据文件以及expdp生成的导出文件(export dump file)组成的,用于填充到目标数据库表空间的集合,默认情况下,这些集合中的文件保存在表空间目的地指定路径下。
    RMAN自动生成的导入脚本(import script)以及expdp生成的导出日志(export log),可传输集的一部分。






三、命令格式:关于Transport Tablespaces命令




过rman备份创建可传输表空间集避免通过源库当前活动的数据文件。同样恢复时可以恢复到备份中包含的任意时间而不会被限定仅能恢复到当前时间。其创建的工作就是由一个名为Transport Tablespaces的RMAN命令来实现,其格式如下:
Transport Tablespace命令的参数不少,不过幸运的是并不复杂,并且其参数与前面介绍的关联实体名称相同,由此仅通常参数名我们也大致能猜出所代表的意义,下面通常几个应用的示例加深一下印象:




1、最简单的可传输表空间集的创建:
transport tablespace tbs_1, tbs_2
   tablespace destination '/disk1/transportdest'
   auxiliary destination '/disk1/auxdest';
本例中,待传输表空间为tbs_1和tbs_2两个(如果待传输的表空间有多个,中间以逗号分隔),生成的可传输文件将会被存储至tablespace destination参数指定的位置,其它辅助文件生成到auxiliary destination参数指定的位置。




2、创建时指定恢复时间点
TRANSPORT TABLESPACE tbs_3
   TABLESPACE DESTINATION '/disk1/transportdest'
   AUXILIARY DESTINATION '/disk1/auxdest'
   UNTIL SCN 11379;
本例中,通过指定SCN的方式控制恢复的内容。


又如下例中通过指定时间控制恢复的内容:
TRANSPORT TABLESPACE tbs_2
   TABLESPACE DESTINATION '/disk1/transportdest'
   AUXILIARY DESTINATION '/disk1/auxdest'
   UNTIL RESTORE POINT 'before_upgrade';


指定恢复点方式控制恢复的内容:
TRANSPORT TABLESPACE tbs_2
   TABLESPACE DESTINATION '/disk1/transportdest'
   AUXILIARY DESTINATION '/disk1/auxdest'
   UNTIL TIME 'SYSDATE-1';
提示:需要注意指定的恢复时间点必须存在于备份的redo log或归档文件中。




3、创建时指定文件的生成路径:
TRANSPORT TABLESPACE tbs_2
   TABLESPACE DESTINATION '/disk1/transportdest'
   AUXILIARY DESTINATION '/disk1/auxdest'
   DATAPUMP DIRECTORY ttsdir
   DUMP FILE 'dmpfile.dmp'
   IMPORT SCRIPT. 'impscript.sql'
   EXPORT LOG 'explog.log';


只要你想,就可以。默认情况下:
DATAPUMP DIRECTORY参数指定已定义的DIRECTORY:ttsdir
DUMP FILE参数指定元数据文件,命名为:dmpfile.dmp
IMPORT SCRIPT参数指定导入脚本,命名为:impscript.sql
EXPORT LOG参数指定导出日志文件,命名为:explog.log
dmpfile.dmp及explog.log文件会自动存储到ttsdir指向的物理路径,其它文件均被生成到/disk1/transportdest目录内。






实战RMAN备份传输表空间


一、检查平台是否支持


查询源数据库平台信息
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;
查询Oracle10g支持的平台转换
SQL> select * from v$transportable_platform;


二、检查待传输表空间是否自包含
execute dbms_tts.transport_set_check('TEST', true);
若报过程dbms_tts.transport_set_check不存在,则用sys的数据库用户执行脚本"$ORACLE_HOME/rdbms/admin/dbmsplts.sql"建立之。
SELECT * FROM TRANSPORT_SET_VIOLATIONS;
若查询结果为空,说明表空间是自包含的;否者查询结果说明哪些地方违反了自包含。


三、检查备份
先做好备份


***归档Alter system archive log current;
四、生成可传输集
RMAN>transport tablespace nnd
     TABLESPACE DESTINATION = 'k:\exp'
     auxiliary destination = 'k:\aux1';


删除自动实例
自动实例已删除
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: tranport tablespace 命令 (在 11/19/2007 15:23:45 上) 失败
ORA-27056: 无法删除文件
OSD-04024: 无法删除文件。
O/S-Error: (OS 32) 另一个程序正在使用此文件,进程无法访问


O/S-Error: (OS 32)通常跟windows平台有关,尝试换用linux平台执行...........一切正常!


报错是在删除辅助实例文件时,此时传输集已经生成了,不会影响我们后续操作。那我们就手工删除这些文件好了,基本上就是auxiliary destination参数指定路径下的文件,干脆直接连这个目录也删掉。


五、复制文件到目标平台


六、执行导入脚本
注意,导入表空间在源平台所属的用户必须存在,另外一旦复制到目标库后文件路径如果发生变化,一定要修改impscript.sql文件中相应的路径。
[oracle@jsslinux ~]$ sqlplus "/ as sysdba"
SQL> @/opt/oratmp/oradata/impscript.sql









































你可能感兴趣的:(oracle)