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&nbsp;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&nbsp;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更加紧密地结合在一起,这是数据库自身功能的重要整合提升。