2.6 Oracle 12c表空间传输的简化和增强
在Oracle 12c中,对之前的表空间传输过程做出了简化和增强,现在通过RMAN中的一条命令即可完成备份集以及元数据的导出工作,使得整个技术处理过程更加清晰和规范。以下通过测试来体验一下这个新的特性。
传输表空间之前首先需要将表空间置于只读模式:
SQL> alter tablespace users read only;
表空间已更改。
然后,可以通过执行BACKUP FOR TRANSPORT命令完成连续的两个转储操作:
RMAN> BACKUP
2> FOR TRANSPORT
3> FORMAT 'e:\Trans\users_ts.bck' TABLESPACE users
4> DATAPUMP FORMAT 'e:\Trans\users_ts_dmp.bck';
启动 backup于 23-6月 -13
使用通道 ORA_DISK_1
在指定表空间运行 TRANSPORT_SET_CHECK
TRANSPORT_SET_CHECK 已成功完成
正在为指定的表空间执行元数据导出...
EXPDP>
警告:连接到容器数据库的根或种子时通常不需要 Oracle Data Pump操作。
EXPDP>启动 "SYS"."TRANSPORT_EXP_YUNHE_drur":
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/TABLE
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/INDEX/INDEX
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/TABLE_STATISTICS
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/STATISTICS/MARKER
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
EXPDP>已成功加载/卸载了主表 "SYS"."TRANSPORT_EXP_YUNHE_drur"
EXPDP> ****************************************************************************
EXPDP> SYS.TRANSPORT_EXP_YUNHE_drur的转储文件集为:
EXPDP> C:\APP\ORACLE\PRODUCT\12.1.0\DBHOME_1\DBS\BACKUP_TTS_YUNHE_20261.DMP
EXPDP> ****************************************************************************
EXPDP>可传输表空间 USERS所需的数据文件:
EXPDP> C:\APP\ORACLE\ORADATA\YUNHE\DATAFILE\O1_MF_USERS_8S4HKJQC_.DBF
EXPDP>作业 "SYS"."TRANSPORT_EXP_YUNHE_drur"已于 星期日 6月 23 17:44:23 2013 elapsed 0 00:01:28 成功完成
导出完毕
通道 ORA_DISK_1:正在启动全部数据文件备份集
通道 ORA_DISK_1:正在指定备份集内的数据文件
输入数据文件: 文件号=00006 名称=C:\APP\ORACLE\ORADATA\YUNHE\DATAFILE\O1_MF_USERS_8S4HKJQC_.DBF
通道 ORA_DISK_1:正在启动段 1于 23-6月 -13
通道 ORA_DISK_1:已完成段 1于 23-6月 -13
段句柄=E:\TRANS\USERS_TS.BCK 标记=TAG20130623T174230 注释=NONE
通道 ORA_DISK_1:备份集已完成,经过时间:00:00:01
通道 ORA_DISK_1:正在启动全部数据文件备份集
输入数据泵转储文件=C:\app\oracle\product\12.1.0\dbhome_1/dbs/backup_tts_YUNHE_20261.dmp
通道 ORA_DISK_1:正在启动段 1于 23-6月 -13
通道 ORA_DISK_1:已完成段 1于 23-6月 -13
段句柄=E:\TRANS\USERS_TS_DMP.BCK 标记=TAG20130623T174230 注释=NONE
通道 ORA_DISK_1:备份集已完成,经过时间:00:00:01
完成 backup于 23-6月 -13
完成备份操作后,在指定位置生成了两个备份文件,一个是数据文件,另一个是导出的元数据文件:
E:\Trans>dir
2013/06/23 17:44 <DIR> .
2013/06/23 17:44 <DIR> ..
2013/06/23 17:44 1,409,024 USERS_TS.BCK
2013/06/23 17:44 241,664 USERS_TS_DMP.BCK
在这个备份的过程中,也可以通过指定filesperset参数定义每个备份片中包含的文件数量,类似如下备份命令指定每个备份片中仅仅包含一个数据文件:
BACKUP
FOR TRANSPORT
FILESPERSET 1
FORMAT ’/tmp/xplat_backups/db_multiple_%U’ TABLESPACE example
DATAPUMP FORMAT ’/tmp/xplat_backups/db_multiple.dmp’;
对于特殊的大文件,可以通过MAXPIECESIZE参数指定每个备份片的大小,由此可以将大文件进行分片备份:
RUN {
ALLOCATE CHANNEL c1 DEVICE TYPE disk MAXPIECESIZE 512000;
BACKUP FOR TRANSPORT?
FORMAT '/tmp/xplat_backups/example_multi_piece%U.bck'?TABLESPACE example?
DATAPUMP FORMAT '/tmp/xplat_backups/example_multi_piece_dmp.bck';
}
以下测试将USERS表空间进行了分片备份:
E:\Restore>rman target /
恢复管理器: Release 12.1.0.1.0 - Production on星期一 6月 24 10:56:42 2013
Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights reserved.
已连接到目标数据库: YUNHE (DBID=2226951170)
RMAN> RUN {
2> ALLOCATE CHANNEL c1 DEVICE TYPE disk MAXPIECESIZE 512000;
3> BACKUP FOR TRANSPORT
4> FORMAT 'e:\backup\users_multi_piece%U.bck' TABLESPACE users
5> DATAPUMP FORMAT 'e:\backup\users_multi_piece_dmp.bck';
6> }
启动 backup于 24-6月 -13
在指定表空间运行 TRANSPORT_SET_CHECK
TRANSPORT_SET_CHECK 已成功完成
正在为指定的表空间执行元数据导出...
EXPDP>
警告:连接到容器数据库的根或种子时通常不需要 Oracle Data Pump操作。
EXPDP>启动 "SYS"."TRANSPORT_EXP_YUNHE_CDhl":
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/TABLE
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/INDEX/INDEX
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/TABLE_STATISTICS
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/STATISTICS/MARKER
EXPDP>处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
EXPDP>已成功加载/卸载了主表 "SYS"."TRANSPORT_EXP_YUNHE_CDhl"
EXPDP> ****************************************************************************
EXPDP> SYS.TRANSPORT_EXP_YUNHE_CDhl的转储文件集为:
EXPDP> C:\APP\ORACLE\PRODUCT\12.1.0\DBHOME_1\DBS\BACKUP_TTS_YUNHE_13557.DMP
EXPDP> ****************************************************************************
EXPDP>可传输表空间 USERS所需的数据文件:
EXPDP> E:\RESTORE\USERS.DBF
EXPDP>作业 "SYS"."TRANSPORT_EXP_YUNHE_CDhl"已于 星期一 6月 24 10:58:11 2013 elapsed 0 00:00:54 成功完成
导出完毕
通道 c1:正在启动全部数据文件备份集
通道 c1:正在指定备份集内的数据文件
输入数据文件: 文件号=00012 名称=E:\RESTORE\USERS.DBF
段句柄=E:\BACKUP\USERS_MULTI_PIECE0OOD00Q7_1_1.BCK 标记=TAG20130624T105705 注释=NONE
段句柄=E:\BACKUP\USERS_MULTI_PIECE0OOD00Q7_2_1.BCK 标记=TAG20130624T105705 注释=NONE
段句柄=E:\BACKUP\USERS_MULTI_PIECE0OOD00Q7_3_1.BCK 标记=TAG20130624T105705 注释=NONE
通道 c1:备份集已完成,经过时间:00:00:03
通道 c1:正在启动全部数据文件备份集
输入数据泵转储文件=C:\app\oracle\product\12.1.0\dbhome_1/dbs/backup_tts_YUNHE_13557.dmp
通道 c1:正在启动段 1于 24-6月 -13
通道 c1:已完成段 1于 24-6月 -13
段句柄=E:\BACKUP\USERS_MULTI_PIECE_DMP.BCK 标记=TAG20130624T105705 注释=NONE
通道 c1:备份集已完成,经过时间:00:00:01
完成 backup于 24-6月 -13
释放的通道: c1
对于跨平台的表空间传输,则可以指定PLATFORM参数,在备份时进行转换,同时生成备份集和元数据导出文件:
RMAN> BACKUP TO PLATFORM 'Solaris[tm] OE (64-bit)'
2> FORMAT 'e:\Trans\users_ts.bck' TABLESPACE users
3> DATAPUMP FORMAT 'e:\Trans\users_ts_dmp.bck';
启动 backup于 23-6月 -13
使用通道 ORA_DISK_1
在指定表空间运行 TRANSPORT_SET_CHECK
TRANSPORT_SET_CHECK 已成功完成
……
输入数据文件: 文件号=00006 名称=C:\APP\ORACLE\ORADATA\YUNHE\DATAFILE\O1_MF_USERS_8S4HKJQC_.DBF
通道 ORA_DISK_1:正在启动段 1于 23-6月 -13
通道 ORA_DISK_1:已完成段 1于 23-6月 -13
段句柄=E:\TRANS\USERS_TS.BCK 标记=TAG20130623T181203 注释=NONE
通道 ORA_DISK_1:备份集已完成,经过时间:00:00:01
通道 ORA_DISK_1:正在启动全部数据文件备份集
输入数据泵转储文件=C:\app\oracle\product\12.1.0\dbhome_1/dbs/backup_tts_YUNHE_20607.dmp
通道 ORA_DISK_1:正在启动段 1于 23-6月 -13
通道 ORA_DISK_1:已完成段 1于 23-6月 -13
段句柄=E:\TRANS\USERS_TS_DMP.BCK 标记=TAG20130623T181203 注释=NONE
通道 ORA_DISK_1:备份集已完成,经过时间:00:00:01
完成 backup于 23-6月 -13
通过备份执行恢复时,同样得到了操作简化,以下一系列命令将之前的备份文件导入了数据库中,元数据会被自动恢复:
RMAN> RESTORE
2> FOREIGN TABLESPACE users
3> FORMAT 'e:\restore\users.dbf'
4> FROM BACKUPSET 'e:\Trans\users_ts.bck' DUMP FILE
5> DATAPUMP DESTINATION 'e:\restore'
6> FROM BACKUPSET 'e:\Trans\users_ts_dmp.bck';
启动 restore于 23-6月 -13
使用通道 ORA_DISK_1
通道 ORA_DISK_1:正在开始还原数据文件备份集
通道 ORA_DISK_1:正在指定从备份集还原的数据文件
通道 ORA_DISK_1:正在还原外部表空间 USERS中的所有文件
通道 ORA_DISK_1:正在读取备份片段 e:\Trans\users_ts.bck
通道 ORA_DISK_1:正在将外部文件 6还原到 E:\RESTORE\USERS.DBF
通道 ORA_DISK_1:外部片段句柄=e:\Trans\users_ts.bck
通道 ORA_DISK_1:已还原备份片段 1
通道 ORA_DISK_1:还原完成,用时: 00:00:02
通道 ORA_DISK_1:正在开始还原数据文件备份集
通道 ORA_DISK_1:正在指定从备份集还原的数据文件
通道 ORA_DISK_1:正在将数据泵转储文件还原到 e:\restore/backup_tts_YUNHE_76982.dmp
通道 ORA_DISK_1:正在读取备份片段 e:\Trans\users_ts_dmp.bck
通道 ORA_DISK_1:外部片段句柄=e:\Trans\users_ts_dmp.bck
通道 ORA_DISK_1:已还原备份片段 1
通道 ORA_DISK_1:还原完成,用时: 00:00:02
正在执行元数据导入…
IMPDP>
警告:连接到容器数据库的根或种子时通常不需要 Oracle Data Pump操作。
IMPDP>已成功加载/卸载了主表 "SYS"."TSPITR_IMP_YUNHE_eBsn"
IMPDP>启动 "SYS"."TSPITR_IMP_YUNHE_eBsn":
IMPDP>处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK
IMPDP>处理对象类型 TRANSPORTABLE_EXPORT/TABLE
IMPDP>处理对象类型 TRANSPORTABLE_EXPORT/INDEX/INDEX
IMPDP>处理对象类型 TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
IMPDP>处理对象类型 TRANSPORTABLE_EXPORT/TABLE_STATISTICS
IMPDP>处理对象类型 TRANSPORTABLE_EXPORT/STATISTICS/MARKER
IMPDP>处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
IMPDP> 作业 "SYS"."TSPITR_IMP_YUNHE_eBsn" 已于 星期日 6 月 23 19:03:51 2013 elapsed 0 00:00:31 成功完成
导入完毕
完成 restore于 23-6月 -13
恢复完成之后,可以看到传输过来的表空间文件,位置位于FORMAT子句中指定的目录,该表空间仍然处于只读状态,需要更改为读写模式后才能够被使用:
SQL> select file_name from dba_data_files where tablespace_name='USERS';
FILE_NAME
-------------------------------------------------------------------------
E:\RESTORE\USERS.DBF
恢复期间生成的文件都位于恢复目录中:
E:\Restore>dir
2013/06/23 19:01 217,088 BACKUP_TTS_YUNHE_38376.DMP
2013/06/23 19:03 217,088 BACKUP_TTS_YUNHE_76982.DMP
2013/06/23 19:03 5,251,072 USERS.DBF
进一步的,Oracle 12c中支持简化的跨平台数据库备份,当然跨平台的全库迁移只支持同字节序的平台。以下在Windows 64位平台执行向Solaris 64位平台的备份集创建,会以错误而告终:
RMAN> backup to platform='Solaris[tm] OE (64-bit)'
2> format 'e:\backup\win12c64%U' database;
启动 backup于 23-6月 -13
使用通道 ORA_DISK_1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: backup命令 (在 06/23/2013 19:33:43上)失败
RMAN-06921: 转换数据库检查失败
而对于同字节序的平台转移,如向Linux IA (64-bit) 平台转换是完全正常的:
RMAN> backup to platform='Linux IA (64-bit)'
2> format 'e:\backup\win12c64%U' database;
启动 backup于 23-6月 -13
使用通道 ORA_DISK_1
通道 ORA_DISK_1:正在启动全部数据文件备份集
通道 ORA_DISK_1:正在指定备份集内的数据文件
输入数据文件: 文件号=00005 名称=C:\APP\ORACLE\ORADATA\YUNHE\DATAFILE\O1_MF_UNDOTBS1_8S4HKL1T_.DBF
输入数据文件: 文件号=00003 名称=C:\APP\ORACLE\ORADATA\ENMO\O1_MF_SYSAUX.DBF
输入数据文件: 文件号=00001 名称=C:\APP\ORACLE\ORADATA\YUNHE\DATAFILE\O1_MF_SYSTEM_8S4HGV37_.DBF
输入数据文件: 文件号=00011 名称=C:\APP\ORACLE\ORADATA\YUNHE\DATAFILE\O1_MF_UDEFAULT_8WFOG26W_.DBF
输入数据文件: 文件号=00012 名称=E:\RESTORE\USERS.DBF
通道 ORA_DISK_1:正在启动段 1于 23-6月 -13
通道 ORA_DISK_1:已完成段 1于 23-6月 -13
段句柄=E:\BACKUP\WIN12C640KOCUBJG_1_1 标记=TAG20130623T195008 注释=NONE
通道 ORA_DISK_1:备份集已完成,经过时间:00:03:28
通道 ORA_DISK_1:正在启动全部数据文件备份集
通道 ORA_DISK_1:正在指定备份集内的数据文件
输入数据文件: 文件号=00008 名称=C:\APP\ORACLE\ORADATA\YUNHE\B2C289435E834608AAC0 C5AA4DF65206\DATAFILE\O1_MF_SYSAUX_8S4KDVRG_.DBF
输入数据文件: 文件号=00007 名称=C:\APP\ORACLE\ORADATA\YUNHE\B2C289435E834608AAC0 C5AA4DF65206\DATAFILE\O1_MF_SYSTEM_8S4KDVQZ_.DBF
输入数据文件: 文件号=00010 名称=C:\APP\ORACLE\ORADATA\YUNHE\B2C289435E834608AAC0 C5AA4DF65206\DATAFILE\O1_MF_EYGLE_8V332TNY_.DBF
输入数据文件: 文件号=00009 名称=C:\APP\ORACLE\ORADATA\YUNHE\B2C289435E834608AAC0 C5AA4DF65206\DATAFILE\O1_MF_USERS_8S4KJ9J1_.DBF
通道 ORA_DISK_1:正在启动段 1于 23-6月 -13
通道 ORA_DISK_1:已完成段 1于 23-6月 -13
段句柄=E:\BACKUP\WIN12C640LOCUBQ0_1_1 标记=TAG20130623T195008 注释=NONE
通道 ORA_DISK_1:备份集已完成,经过时间:00:02:26
通道 ORA_DISK_1:正在启动全部数据文件备份集
通道 ORA_DISK_1:正在指定备份集内的数据文件
输入数据文件: 文件号=00004 名称=C:\APP\ORACLE\ORADATA\YUNHE\DATAFILE\O1_MF_SYSAUX_8S4HS91O_.DBF
输入数据文件: 文件号=00002 名称=C:\APP\ORACLE\ORADATA\YUNHE\DATAFILE\O1_MF_SYSTEM_8S4HS943_.DBF
通道 ORA_DISK_1:正在启动段 1于 23-6月 -13
通道 ORA_DISK_1:已完成段 1于 23-6月 -13
段句柄=E:\BACKUP\WIN12C640MOCUBUI_1_1 标记=TAG20130623T195008 注释=NONE
通道 ORA_DISK_1:备份集已完成,经过时间:00:02:15
完成 backup于 23-6月 -13
在Oracle 12c中,关于迁移表空间增强,实际上是在RMAN中整合了Data Pump的功能,在此核心基础上,Oracle可以实现很多之前无法做到的功能。这其中就包括从备份集中进行表级恢复。表级别的恢复实际上是通过创建辅助实例,通过数据泵导出表数据,再进一步通过导入完成数据恢复。
以下测试命令实现基于日志序列的表级恢复,恢复之后的数据表被重新命名:
RECOVER TABLE SCOTT.EMP
UNTIL SEQUENCE 5466
AUXILARY DESTINATION '/tmp/recover'
REMAP TABLE ’SCOTT’.’EMP’:’MY_EMP’;
以下测试命令实现基于时间的数据表恢复,恢复之后的数据表映射到新的表空间:
RECOVER TABLE SCOTT.EMP, SCOTT.DEPT
?UNTIL TIME "TO_CHAR('06/23/2013 12:00:00','mm/dd/yyyy hh24:mi:ss')"
AUXILIARY DESTINATION ’/tmp/oracle/recover’?
REMAP TABLESPACE ’EXAMPLE’:’MY_TBS’;
通过以上的分析测试可以看到:Oracle在12c中,两大备份恢复工具RMAN和Data Pump更加紧密地结合在一起,这是数据库自身功能的重要整合提升。