Oracle 12C多租户架构备份与恢复技术实践( 二 )


RMAN>backup as compressed backupset pluggable database itapdb format '/new/%d_itapdb_%t_%U_%p';
【Oracle 12C多租户架构备份与恢复技术实践】RMAN>backup archivelog all format '/new/arch%t_%s_%p';
RMAN>backup current controlfile format '/new/cf_%U';
2、问题分析
从多租户架构的定义知道,所有PDB共享一个数据库实例、一份控制文件、一份在线REDO日志文件和一组UNDO撤销数据文件 。
在控制文件中记录了所有数据文件的记录和数据库的物理性更改(如新建表空间、数据文件备份、检查点发生的SCN等) 。
当执行restore database、recover database操作进行全库恢复时,由于备份数据只包括ITAPDB数据库的备份文件,那么恢复时自然会报数据文件找不到错误 。
为了验证分析,首先查询控制文件中包含哪些数据文件:
RMAN> report schema;
从查询结果发现报错信息中找不到的数据文件编号都是其他项目PDB数据库中的数据文件,再查询v$datafile_header动态视图:
SQL> select FILE#,CHECKPOINT_CHANGE# from v$datafile_header;
可以发现ITAPDB库的相关数据文件的文件头Checkpoint SCN值已经变化,而其他库的数据文件头SCN为零,这说明ITAPDB库的相关数据文件已经完成restore操作,SCN值已经恢复到备份时的SCN,而其他PDB库由于缺少数据文件备份,restore时报错,因此SCN值还为0,这进一步验证了分析的正确性 。
对于上面的分析,有如下思考:
① 前面章节提到,在CDB容器库中包括一个CDB$ROOT、一个PDB$SEED和多个PDB数据库,其中CDB$ROOT库主要用于存储元数据等管理数据,PDB$SEED库是只读种子库,主要作为模板为其他PDB库建立时提供模板 。那么CDB$ROOT、PDB$SEED两个库的备份数据是否是数据恢复必需的?
② 控制文件中记录了所有多租户架构下的数据文件、表空间等信息,当只恢复ITAPDB数据库时是否可以采用显示跳过方式规避掉其他不需要恢复的数据文件?
三、多租户备份、恢复方法研究
带着上面的疑问,经过多次数据恢复测试、问题查找与研究,我们总结出一整套Oracle 12C多租户数据库的备份、恢复方法,具体步骤如下:
① 首先联系生产管理员对CDB$ROOT、PDB$SEED和ITAPDB三个库重新进行备份,而不再只备份ITAPDB数据库的数据,备份脚本变为:
RMAN>backup as compressed backupset pluggable database "CDB$ROOT","PDB$SEED",itapdb format '/new/%d_itapdb_%t_%U_%p';
RMAN>backup archivelog all format '/new/arch%t_%s_%p';
RMAN>backup current controlfile format '/new/cf_%U';
之后将将备份数据放置到脱敏环境指定目录下(为便于后面说明,假设目录为/data/backup) 。
② 创建数据库参数文件并启动至nomount状态 。
参数文件中一般需要制定如下参数:
Control_files
Sga_target
Db_name
Compatible
Diagnostic_dest
SQL> startup nomount pfile=/tmp/initPOOL1DB.ora ;(参数文件存放目录为/tmp/initPOOL1DB.ora)
③ 恢复控制文件并将数据库启动到mount状态 。
Rman> restore controlfile from ‘/data/backup/itapdb.cf’;
Rman> alter database mount;
④ 重新编目控制文件 。
Rman>catalog start with ’/data/backup/’;
说明:由于生产系统部署在ASM存储+RAC架构下,而脱敏环境为本地磁盘+非RAC架构,生产与恢复环境的数据存放目录不一致,需要将备份文件编目至控制文件中 。
⑤ 执行restore恢复数据文件 。
在开始restore恢复数据文件之前,可以使用crosscheck命令对备份集有效性进行检查,对于在控制文件中记录而在数据库服务器上没有存储的备份集会被标记为expired状态 。
Rman>crosscheck backup;
之后开始进行三个库的数据文件恢复,命令如下:
Rman>run{
set newname for database to '/data/itapdb/%U';-------------->指定恢复路径
restore database root ; ----------------->CDB$ROOT
restore database "PDB$SEED"; ------------->PDB$SEED
restore database ITAPDB; --------------->ITAPDB
switch datafile all ;
}
⑥ 使用归档日志进行数据恢复 。
与单租户数据恢复不同,由于控制文件中记录了所有PDB数据库及其表空间信息,如果在恢复时不跳过相应PDB对应的表空间,使用recover database恢复会报如下错误:
RMAN-06067: RECOVER DATABASE required with a backup or created control file
通过显式跳过,可以offline并drop掉不需要恢复的PDB和对应的表空间 。具体恢复方法如下:
Rman> Run {


推荐阅读