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

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

使用rman 备份创建Transportable Tablespace Sets 主要是通过RMAN 中的TRANSPORT TABLESPACE 命令完成的。

提示:即使并未使用rman 备份数据库,TRANSPORT TABLESPACE 命令也可以用来创建transportabletablespace 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 创建TTS 的步骤嘛,也分三步吧:
1、启动辅助实例
首先启动辅助实例到nomount 模式,当然启动之前你得先创建好初始化参数文件。然后从备份中恢复控制文件到初始化参数文件中指定的控制文件所在路径,直接拷过来也靠谱(前提是源库和目标库的操作系统一致),加载辅助实例到mount 模式。

2、恢复辅助实例
一旦辅助实例中控制文件被正确加载,RMAN 从备份中恢复辅助集和可传输集相关的数据文件,存储辅助文件到指定的辅助文件暂存地,可传输集文件存储到表空间目的地。然后RMAN 在辅助实例执行switch 操作加载数据文件。
然后TRANSPORT DATABASE 命令按指定的时间点对辅助实例进行恢复(如未指定目标时间,则执行完全恢复),所有辅助文件暂存地中的可用归档日志都将被用于恢复操作,并会在应用后自动删除这些文件。
一旦恢复完成,RMAN 将以resetlogs 方式加载辅助数据库。

3、将辅助实例看做源库应用传输表空间。
将辅助实例中待恢复的表空间置为read-only 模式,并调用expdp 生成表空间原数据的导出文件。导出文件一般都保存在表空间目的地(当然,你也可以指定dp 文件的保存路径,后面会有介绍)。
此时,RMAN 自动生成导入脚本。脚本自动被保存在表空间目的地指定路径下,并命名为impscript.sql。
所有的操作都成功执行之后,RMAN 将shutdown 辅助实例并删除TRANSPORT TABLESPACE 命令执行过程中创建的除数据文件、dmp 文件,expdp 日志和impscript.sql 外其它临时文件。

提示:
- TRANSPORT TABLESPACE 命令执行过程中,恢复集文件并不会自动转换到目标数据库的endian 格式。如果需要转换,你必须在创建可传输集前使用rman 的convert 命令转换数据文件到目标数据库的endian 格式。
- 如果impdp 导入脚本不在TRANSPORT TABLESPACE 命令默认生成路径下,要注意更新脚本位置。

是不是觉着步骤超级多,使用超复杂,甚至一度对其实用性有了怀疑,实际操作完全没有这么复制。特别是10g 之后,只需要执行一个transport tablespace 命令,并通过auxiliary destination 参数指定临时辅助文件的存放位置,RMAN 会自动创建和销毁auxiliary database,非常方便。

五、注意事项
如果你决定使用RMAN 备份创建可传输表空间地话,除了记住前面我们提到过的关于可传输表空间特
性应用的限制之外呢,你又得将自己的脑袋置为read-write 状态了,这个明显是黑正常的嘛,应用的技术越
多,可能碰到的问题也会越多,相应需要注意的地方也越多,花费的精力也越大,哎,无数干技术活的(非
特指IT)脑袋就是这么秃地呀~~~~~

- 必须拥有执行TRANSPORT TABLESPACE 操作所需的所有相关的表空间的备份以及归档日志文件。
提示:即使RMAN 不是你备份策略的一部分,你也仍可能使用TRANSPORT TABLESPACE 命令,只要所需的数据文件和归档日志均可被rman 有效访问。
- 因为rman 创建transportable tablespaces 需与expdp 和impdp 配合使用,因此不能传输含XMLTypes的表空间。
- 由于rman 会在相同节点上创建自动辅助实例做为源实例用于修复、恢复操作,这在TRANSPORT TABLESPACE 命令执行期间会造成一定的性能开销
- 如果你删除或重命名了一个表空间,那就不能在之后又使用TRANSPORT TABLESPACE 试图传输包含了该表空间的可传输表空间集。
- 对于有关联约束关系的表必须同时传输。
- transportable set(可传输集)和auxiliary set(辅助集)数据文件都不能包含下列的类型:
- 复制主表
- 分区表
- 含VARRAY 类型列的表,嵌套表或扩展文件
- 快照记录或快照表
- 含undo 或rollback segments 的表空间,或含SYS 对象的表空间。

如果你在nocatalog 模式下执行TRANSPORT TABLESPACE 命令,还会有下列的限制:
- 如果过去创建一个传输集做为一个时间点,那么在TRANSPORT TABLESPACE 执行时,源库表空间回滚段必须与传输集中表空间回滚段时间点相同。
包括回滚段的表空间做为目标SCN 在TRASNPORT TABLESPACE 操作中必须是auxiliary set 的一部分。不像在catalog 模式,rman 资料库在控制文件中只包含那些包括回滚段的表空间。
- 如果数据库重用了控制文件中TRANSPORT TABLESPACE 命令所需的备份信息,则命令会失败,因为RMAN 不能定位需要的备份文件位置。你得通过catalog 命令将这些备份文件加入rman 资料库中。如果数据库已经重写了控制文件,那么很不幸你可能就会丢失这部分备份了。

Trackback

no comment untill now

Add your comment now

切换到手机版