传输表空间:sql
可传输表空间的特性主要用于进行库对库的表空间复制,要进行传输的表空间必须置于read-only模式。若是生产库不容许表空间置为只读模式,不要紧,方法仍是有的,经过RMAN备份也能够建立可传输表空间集。要使用可传输表空间的特性,oracle至少是8i企业版或更高版本。若是是相同操做系统平台相互导入,则8i及以上版本都可支持,但若是是不一样操做系统平台,数据库版本至少10g。被传输的表空间便可以是字典管理,也能够是本地管理。而且自oracle9i开始,被传输表空间的block size能够与目标数据库的block size不一样。数据库
模拟环境(传输表空间):windows
一、首先检查环境信息:包括平台,OS版本,数据库版本,字节序等。oracle
source:app
OS:Red Hat Enterprise Linux Server release 5.4 (Tikangaless
DB:ide
SQL> select * from v$version;工具
BANNERui
--------------------------------------------------------------------------------spa
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
target:
OS:windows 7
DB:
SQL> select * from v$version;
BANNER
------------------------------------------------------------------------------------------------------------------------
----------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for 64-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
平台不一样,数据库版本一致,原则上oracle支持低版本向高版本导入数据。字节序也是一致都是小字节序。
能够查询 v$transportable_platform获得字节序信息
二、检查要转换的对象是否符合TTS规范
conn / as sysdba
exec dbms_tts.transport_set_check('P1,P2',true,true);
SQL> select * from transport_set_violations;
VIOLATIONS
--------------------------------------------------------------------------------
VIOLATIONS
--------------------------------------------------------------------------------
ORA-39908: Index SH.OBJ_IDX in tablespace USERS enforces primary constraints of
table SH.OBJ_RANGE in tablespace P1.
ORA-39911: Index SH.OBJ_INDX in tablespace USERS points to partition R1 of table
SH.OBJ in tablespace P1 outside of transportable set.
10 rows selected
SQL> select index_name,table_name,tablespace_name from user_indexes where table_name='OBJ' or table_name='OBJ_RANGE';
INDEX_NAME TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
OBJ_IDX OBJ_RANGE USERS
OBJ_INDX OBJ USERS
可见,TTS规范检查有问题,如上所示,表空间的索引对象‘SH.OBJ_IND’,'SH.OBJ_INDX' 在users表空间,故而报错。要么索引重建要么把users表空间一并传输过来。
重建索引:
SQL> alter index OBJ_IDX rebuild tablespace p1;
Index altered.
SQL> alter index OBJ_INDX rebuild tablespace p1;
Index altered.
SQL> select index_name,table_name,tablespace_name from user_indexes where table_name='OBJ' or table_name='OBJ_RANGE';
INDEX_NAME TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
OBJ_IDX OBJ_RANGE P1
OBJ_INDX OBJ P1
从新检查TTS规范:
SQL> exec dbms_tts.transport_set_check('P1,P2',true,true);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
VIOLATIONS
----------------------------------------------------------------------------------------------------
ORA-39911: Index SH.OBJ_INDX in tablespace P1 points to partition R3 of table SH.OBJ in tablespace USERS outside of transportable set.
ORA-39921: Default Partition (Table) Tablespace USERS for OBJ not contained in transportable set.
ORA-39901: Partitioned table SH.OBJ is partially contained in the transportable set.
VIOLATIONS
----------------------------------------------------------------------------------------------------
ORA-39921: Default Partition (Table) Tablespace P1 for OBJ not contained in transportable set.
ORA-39921: Default Partition (Table) Tablespace P2 for OBJ not contained in transportable set.
8 rows selected.
SQL> select table_name,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions where table_name='OBJ';
TABLE_NAME PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
OBJ R1 P1
OBJ R2 P2
OBJ R3 USERS
发现分区R3 在user表空间,因此这里须要修改分区基本信息(在修改以前必定要把原分区数据迁移出来,避免操做失误数据丢失)。
删除非法的分区:
SQL> alter table obj drop partition r3;
新增分区:
SQL> alter table obj add partition r3 values less than(maxvalue) tablespace p3;
Table altered.
SQL> select table_name,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions where table_name='OBJ';
TABLE_NAME PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
OBJ R1 P1
OBJ R2 P2
OBJ R3 P3
从新验证TTS规范:
SQL> exec dbms_tts.transport_set_check('P1,P2,P3',true,true);
SQL> select * from transport_set_violations;
VIOLATIONS
----------------------------------------------------------------------------------------------------
ORA-39921: Default Partition (Table) Tablespace USERS for OBJ not contained in transportable set.
OBJ分区表 默认的表空间是user,这里须要修改掉。
QL> select TABLE_NAME,PARTITION_COUNT,DEF_TABLESPACE_NAME from user_part_tables where table_name='OBJ';
TABLE_NAME PARTITION_COUNT DEF_TABLESPACE_NAME
------------------------------ --------------- ------------------------------
OBJ 3 USERS
待完成:
可传输表空间(还有个集)最大的优点是其速度比export/import或unload/load要快的多。由于可传输表空间主要是复制数据文件到目标路径,而后再使用export/import或Data Pump export/import等应用仅导出/导入表空间对象的元数据到新数据库。
关于可传输表空间,还有个集(Transportable Tablespace Sets)的建立,其中都提到了很重要一点,就是被传输的表空间在传输过程当中必须置为 read-only。而在实际操做过程当中,对于某些生产数据库,将表空间置为 read-only 是件很是复杂的事情甚至彻底不容许,有了 RMAN 的 Transportable Tablespace,这一切都得以免。RMAN 经过备份建立可传输表空间集,它并不须要存取活动的数据文件,相应也就不须要将表空间置为 read-only。所以,数据库可用性获得提高,尤为对于超大的表空间,由于被传输的表空间在此期间仍可进行读写操做,并且把表空间置为 read-only 模式可能会花费较长时间,
使用 RMAN 建立可传输表空间集,容许你在传输过程当中指定目标恢复时间点或 SCN,这样传输的数据能够更灵活,没必要彻底复制现有表空间,只要备份中存在,你就能够选择性的恢复数据。例如,你的备份策略为保留一周,你但愿建立的可传输表空间中数据是截止本月底最后一天的数据,那么你在下个月第一周内任什么时候候均可以进行传输操做而不须要考虑这期间生产库是否会有写入操做。
限制:
1.数据库版本至少是8或8以上的企业版版本才支持TTS特性
2.源库和目标库的字符集必须相同
3.要传输的表空间名字不能与目标库原有的表空间名字重复
4.有关联对象(物化视图,外部表)或包函对象(分区表,分区索引)通常状况下是不能被传输的,须要人为手动处理。
5.自10gR2开始,能够传输XMLType对象,不过此时必须得使用IMP/EXP工具,且参数consttraints和triggers设置为‘Y’。
6.不能传输system表空间或者sys用户对象
7.浮点类型的数据不支持impdp/expdp工具,须要使用imp/exp
环境模拟:
因为表空间之间存在索引等其余约束及关系,光迁移表空间势必产生影响,因此在迁移表空间以前须要作依赖检查,检查apptbs1,apptbs2表空间是否有交叉依赖:
execute dbms_tts.transport_set_check('apptbs1,apptbs2',true);
SQL> select * from transport_set_violations;
未选定行
结论: 此时这个表空间集已经不在违背自包含的条件,能够肯定为一个可传输表空间集。
对源数据库执行备份,在执行备份时必定要加上include current controlfile不然执行transport tablespace命令时会出现如下错误信息:
Automatic instance removed
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of tranport tablespace command at 03/26/2015 20:24:22
RMAN-03015: error occurred in stored script Memory Script
RMAN-06026: some targets not found - aborting restore
RMAN-06024: no backup or copy of the control file found to restore
RMAN> backup as backupset database format '/u05/oracle/oracle_bk/orclasm/full_%n_%T_%t_%s_%p.bak' include current controlfile plus archivelog delete input;
使用目标数据库控制文件替代恢复目录
RMAN-05026: 警告: 假定如下表空间集适用于指定的时间点
表空间列表要求具备 UNDO 段
表空间 SYSTEM
表空间 UNDOTBS1
使用 SID='ORCL' 建立自动实例
供自动实例使用的初始化参数:
db_name=ORCLASM
db_unique_name=ypkw_tspitr_ORCLASM
compatible=11.2.0.0.0
db_block_size=8192
db_files=200
sga_target=280M
processes=50
db_create_file_dest=/u05/tmp
log_archive_dest_1='location=/u05/tmp'
#No auxiliary parameter file used
启动自动实例 ORCL
Oracle 实例已启动
系统全局区域总计 292278272 字节
Fixed Size 2175128 字节
Variable Size 100667240 字节
Database Buffers 184549376 字节
Redo Buffers 4886528 字节
自动实例已建立
对恢复集表空间运行 TRANSPORT_SET_CHECK
TRANSPORT_SET_CHECK 已成功完成
内存脚本的内容:
{
# set requested point in time
set until scn 1897575;
# restore the controlfile
restore clone controlfile;
# mount the controlfile
sql clone 'alter database mount clone database';
# archive current online log
sql 'alter system archive log current';
}
正在执行内存脚本
正在执行命令: SET until clause
启动 restore 于 29-3月 -18
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: SID=81 设备类型=DISK
通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集
通道 ORA_AUX_DISK_1: 正在还原控制文件
通道 ORA_AUX_DISK_1: 正在读取备份片断 D:\FULL_05SV118N_1_1.BAK
通道 ORA_AUX_DISK_1: 段句柄 = D:\FULL_05SV118N_1_1.BAK 标记 = TAG20180329T174606
通道 ORA_AUX_DISK_1: 已还原备份片断 1
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:01
输出文件名=E:\APP\ARCH\ORCL\CONTROLFILE\O1_MF_FCSG7PG4_.CTL
完成 restore 于 29-3月 -18
sql 语句: alter database mount clone database
sql 语句: alter system archive log current
内存脚本的内容:
{
# set requested point in time
set until scn 1897575;
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile 1 to new;
set newname for clone datafile 3 to new;
set newname for clone datafile 2 to new;
set newname for clone tempfile 1 to new;
set newname for datafile 7 to
"E:/app/arch\APPLTS1.DBF";
set newname for datafile 8 to
"E:/app/arch\APPLTS2.DBF";
set newname for datafile 9 to
"E:/app/arch\APPLTS3.DBF";
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile 1, 3, 2, 7, 8, 9;
switch clone datafile all;
}
正在执行内存脚本
正在执行命令: SET until clause
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
临时文件 1 在控制文件中已重命名为 E:\APP\ARCH\ORCL\DATAFILE\O1_MF_TEMP_%U_.TMP
启动 restore 于 29-3月 -18
使用通道 ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集
通道 ORA_AUX_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_AUX_DISK_1: 将数据文件 00001 还原到 E:\APP\ARCH\ORCL\DATAFILE\O1_MF_SYS
TEM_%U_.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00003 还原到 E:\APP\ARCH\ORCL\DATAFILE\O1_MF_UND
OTBS1_%U_.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00002 还原到 E:\APP\ARCH\ORCL\DATAFILE\O1_MF_SYS
AUX_%U_.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00007 还原到 E:/app/arch\APPLTS1.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00008 还原到 E:/app/arch\APPLTS2.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00009 还原到 E:/app/arch\APPLTS3.DBF
通道 ORA_AUX_DISK_1: 正在读取备份片断 D:\FULL_04SV116V_1_1.BAK
通道 ORA_AUX_DISK_1: 段句柄 = D:\FULL_04SV116V_1_1.BAK 标记 = TAG20180329T174606
通道 ORA_AUX_DISK_1: 已还原备份片断 1
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:35
完成 restore 于 29-3月 -18
数据文件 1 已转换成数据文件副本
输入数据文件副本 RECID=8 STAMP=972064802 文件名=E:\APP\ARCH\ORCL\DATAFILE\O1_MF_
SYSTEM_FCSG7YKR_.DBF
数据文件 3 已转换成数据文件副本
输入数据文件副本 RECID=9 STAMP=972064802 文件名=E:\APP\ARCH\ORCL\DATAFILE\O1_MF_
UNDOTBS1_FCSG7YNK_.DBF
数据文件 2 已转换成数据文件副本
输入数据文件副本 RECID=10 STAMP=972064803 文件名=E:\APP\ARCH\ORCL\DATAFILE\O1_MF
_SYSAUX_FCSG7YN7_.DBF
数据文件 7 已转换成数据文件副本
输入数据文件副本 RECID=11 STAMP=972064803 文件名=E:\APP\ARCH\APPLTS1.DBF
数据文件 8 已转换成数据文件副本
输入数据文件副本 RECID=12 STAMP=972064804 文件名=E:\APP\ARCH\APPLTS2.DBF
数据文件 9 已转换成数据文件副本
输入数据文件副本 RECID=13 STAMP=972064805 文件名=E:\APP\ARCH\APPLTS3.DBF
内存脚本的内容:
{