WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606
全部博文(599)
分类: Oracle
2009-12-07 13:05:12
下列步骤列出了传输一个表空间的大致过程。
1、检查平台
对于跨平台的传输,查询V$TRANSPORTABLE_PLATFORM视图检查两平台的endian format。如果相同平台的传输可以跳过此步。
2、选择自包含表空间集(self-contained set of tablespaces)
提示:啥叫自包含呢,自包含表示用于传输的内部表空间集没有任何对象引用指向外部表空间集。自包含分为两种:一般自包含表空间集和完全(严格)自包含表空间集。
下面是一些典型的违反自包含的例子:
l 索引在待传输表空间集中而表却不在。(注意,如果表在待传输表空间集中,而索引不在并不违反自包含原则,当然如果你坚持这样传输的话,会造成目标库中该表索引丢失)。
l 分区表中只有部分分区在待传输表空间集(对于分区表,要么全部包含在待传输表空间集中,要么全不包含)。
l 待传输表空间中,对于引用完整性约束,如果约束指向的表不在待传输表空间集,则违反自包含约束;但如果不传输该约束,则与约束指向无关。
l 对于包含LOB列的表,如果表在待传输表空间集中,而Lob列不在,也是违反自包含原则的。
看看,条件和限制还是黑多,虽然我们的大脑里的脑细胞也黑多,但是如果你要传输大量数据,还想依靠脑细胞一个个做判断显然是不明智的,幸运的是额们地神想到了这一点,于是它给了我们一张小纸条,上面写着几百个大字:检查是否自包含,请用DBMS_TTS.TRANSPORT_SET_CHECK,疗效好。该产品采用纯中药制成,无毒无副作用,口服针剂均可,ooo错了,是分严格方式和非严格方式验证。那么对于严格方式和非严格方式又有什么区别呢,这个问题如果又要用描述恐怕不仅占用大量字节而且又会将你的脑袋搅的一团乱,所以我们留待实践操作的时候通过来说明吧。
3、生成可传输表空间,还有个集(transportable tablespace set)
首先将要导出的表空间状态置为READ-ONLY。
可传输表空间集包含表空间集对应的数据文件以及含表空间结构信息即元数据的export文件(可以通过EXPDP或EXP执行导出)。
再次提示,如果导出的表空间中含XMLTypes,则必须使用EXP导入。
如果你准备传输表空间集到不同endian平台,必须首先转换表空间集的endian与目标平台相同。转换操作即可以在源库生成传输表空间集时进行,也可以在目标服务器导入传输表空间之前进行。注意,何时转换并非完全随意,它跟你的策略是有很大关系的,后面会有黑详细的介绍,瞪大眼睛表错过。
可传输表空间集创建完之后,可以将源库的表空间状态置为read-write。
4、传输表空间集
复制数据文件以及export文件到目标。
如果需要转换,应该何时执行转换操作呢?
前面提到,如果涉及了endian的转换,可以在生成可传输表空间集时进行(源平台进行),或者在导入表空间集之前进行(目标平台进行),转换的命令都是一个,只是参数略有不同,关于命令的用法暂且不提,后面会有专门章节介绍和实践。在这里我们先来深入一个这个操作究竟放在哪里合适。按说这个操作放在哪里执行都可以,应该没有什么可争辩的,但是值的注意的是针对我们操作的数据库,特别是对于正在运行的生产数据库,三思建议你采用在目标平台上进行转换的操作,缘由如下:
1). 缩短停机时间
在创建可传输表空间集之前,需要将要传输的表空间状态置为read-only。你可以将数据文件迅速复制一份镜像,并生成包含元数据的export文件,然后即可将表空间状态置为read-write状态。这种安排使得表空间必须保持为只读的时间尽可能的短。
2). 提高执行性能
生产数据库往往同时在处理多个应用,而此时如果再用其进行转换操作可能增加系统负载,并且系统此时由于执行的任务较多,转换效率也并非最高。将转换操作移到目标平台进行,通常对于目标平台都是做为角色,其系统负载相对是比较低的,执行转换操作的效率相对也会更高。
3). 简化复制操作
通过在目标平台执行转换命令时指定db_file_name_convert参数,直接将数据文件转换到目标目录内,简化复制时的操作。
5、导入表空间集
使用IMPDP或IMP导入表空间集元数据到目标库,如果你采用的是Data Pump Import/Export,还可以将步骤更简练,Data Pump支持一个名为NETWORK_LINK的参数,通过该参数指定的数据链,你甚至可以跳过Expdp生成源库元数据的操作,Impdp通过数据库链接从源数据库中获得所需的元数据,并在目标数据库中重新创建它们。
导入完成之后,如果需要,将目标库中导入的表空间状态置为read-write。
这样我们整个跨平台的传输就完成了,整体来看步骤非常简单,就是"导出->复制->导入",简称传输三板斧。困难处并不是这把斧子重,而是不同情况下,你得能够明智的选择斧势,是劈是砍还是砸呢,不同的选择会有不同的结果,有时候你选择了开头,却选择不了这结果,一旦结果不是你想要的,没关系,oracle会再给你新的选择,下面我们就来看看这结果吧