12C 的RMAN和Oracle Enterprise Manager Cloud Control工具支持多租户环境下的备份和恢复,RMAN可以连接到目标数据库、Data Guard、辅助实例或辅助数据库,通过连接数据库的类型不同,所完成的数据库操作也不相同,在这里我们主要描述CDB和PDB备份恢复操作,在PDB环境中支持备份或恢复单个数据文件或表空间。
在从数据丢失恢复能力而言,单独备份根和所有的PDB相当于备份整个CDB。主要的区别是在RMAN命令的数目,您必须输入和恢复时间。恢复整个CDB$ROOT的时间要比所有的PDB的时间少。
1.1. RMAN连接数据库
RMAN可通过操作系统认证和密码文件两种方式连接到一个目标数据库,使用RMAN备份恢复工具的用户需要具有SYSDBA或SYSBACKUP系统权限,如果用户需要连接到恢复目录,需要被授予RECOVERY_CATALOG_OWNER对象权限。
-
操作系统认证
我们在LINUX环境中使用操作系统认证方式连接到数据库,我们需要满足以下两个条件:
-
设定ORACLE_SID变量,例如数据库的SID为orcl,因此我们在.bash_profile文件或者命令行设置ORACLE_SID变量。
ORACLE_SID=orcl; export ORACLE_SID
-
执行rman命令用户需要具有SYSDBA或者SYSBACKUP权限,Linux环境下的OSDBA用户组为dba。
具有SYSDBA权限用户连接到RMAN
rman target '"/ as sysdba"'
具有SYSBACKUP权限用户连接到RMAN
rman target '"/ as sysbackup"'
具有SYSDBA权限用户隐式连接到RMAN
rman target /
-
密码文件认证
数据库使用密码文件认证管理用户,RMAN可以使用密码连接。使用本地或远程访问的密码文件。使用服务名方式连接数据库时,数据库必须使用一个密码文件,同样连接到数据库的用户需要具有SYSDBA或SYSBACKUP权限。
密码文件认证具有SYSDBA权限用户连接到RMAN
rman target '"zlhis@orcl assysdba"'
target database Password: password
connected to target database: orcl(DBID=39525561)
密码文件认证具有SYSBACKUP权限用户连接到RMAN
rman target '"zlhis@orcl as sysbackup"'
target database Password: password
connected to target database: orcl(DBID=39525561)
1.2. 只备份CDB
只备份CDB数据库需要具有SYSDBA或SYSBACKUP权限用户连接到CDB的root环境下,执行backupdatabase root命令即可完成对CDB的备份,方法如下:
RMAN> backupdatabase root;
启动 backup 于 17-3月 -16
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=50 设备类型=DISK
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
输入数据文件: 文件号=00001 名称=/u01/app/oracle/oradata/cdb/system01.dbf
输入数据文件: 文件号=00003 名称=/u01/app/oracle/oradata/cdb/sysaux01.dbf
输入数据文件: 文件号=00004 名称=/u01/app/oracle/oradata/cdb/undotbs01.dbf
输入数据文件: 文件号=00006 名称=/u01/app/oracle/oradata/cdb/users01.dbf
通道 ORA_DISK_1: 正在启动段 1 于 17-3月 -16
通道 ORA_DISK_1: 已完成段 1 于 17-3月 -16
段句柄=/u01/app/oracle/fast_recovery_area/CDB/backupset/2016_03_17/o1_mf_nnndf_TAG20160317T152301_cgnptp1s_.bkp标记=TAG20160317T152301 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:55
完成 backup 于 17-3月 -16
启动 Control File and SPFILE Autobackup 于 17-3月 -16段handle=/u01/app/oracle/fast_recovery_area/CDB/autobackup/2016_03_17/o1_mf_s_906737097_cgnpydod_.bkpcomment=NONE
完成 Control File and SPFILE Autobackup 于 17-3月 -16
执行backup database root不给数据文件保存位置时,备份文件默认存放在快速恢复区中。
1.3. 备份整个CDB及其下面的所有PDB
备份整个CDB数据库及其下面的所有PDB类似于非CDB数据库方法相同,使用具有SYSDBA或SYSBACKUP权限用户连接到CDB的root环境下面,然后执行backupdatabase命令即可完成整个CDB的备份,方法如下:
RMAN> backup database;
启动 backup 于 17-3月 -16
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=50 设备类型=DISK
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
输入数据文件: 文件号=00001 名称=/u01/app/oracle/oradata/cdb/system01.dbf
输入数据文件: 文件号=00003 名称=/u01/app/oracle/oradata/cdb/sysaux01.dbf
输入数据文件: 文件号=00004 名称=/u01/app/oracle/oradata/cdb/undotbs01.dbf
输入数据文件: 文件号=00006 名称=/u01/app/oracle/oradata/cdb/users01.dbf
输入数据文件: 文件号=00009 名称=/u01/app/oracle/oradata/cdb/pdb1/sysaux01.dbf
输入数据文件: 文件号=00008 名称=/u01/app/oracle/oradata/cdb/pdb1/system01.dbf
输入数据文件: 文件号=00010 名称=/u01/app/oracle/oradata/cdb/pdb1/pdb1_users01.dbf
通道 ORA_DISK_1: 正在启动段 1 于 17-3月 -16
通道 ORA_DISK_1: 已完成段 1 于 17-3月 -16
段句柄=/u01/app/oracle/fast_recovery_area/CDB/backupset/2016_03_17/o1_mf_nnndf_TAG20160317T152301_cgnptp1s_.bkp标记=TAG20160317T152301注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:55
完成 backup 于 17-3月 -16
启动 Control File andSPFILE Autobackup 于17-3月-16段handle=/u01/app/oracle/fast_recovery_area/CDB/autobackup/2016_03_17/o1_mf_s_906737097_cgnpydod_.bkpcomment=NONE
完成 Control File andSPFILE Autobackup 于17-3月-16
1.4. 备份单个和多个PDB
在CDB中允许备份一个或多少PDB数据库,备份一个PDB数据库可以通过以下两个方式备份:
-
在CDB根(root)使用BACKUP PLUGGABLE DATABASE命令备份一个或多个PDB数据库。
[oracle@localhost ~]$ rman target /
恢复管理器: Release 12.1.0.2.0 - Production on 星期二 3月 22 17:11:27 2016
Copyright (c) 1982, 2014, Oracle and/or itsaffiliates. All rights reserved.
已连接到目标数据库: CDB (DBID=2023252752)
RMAN> backuppluggable database pdb1;
启动 backup 于 22-3月 -16
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=57 设备类型=DISK
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
输入数据文件: 文件号=00009 名称=/u01/app/oracle/oradata/cdb/pdb1/sysaux01.dbf
输入数据文件: 文件号=00008 名称=/u01/app/oracle/oradata/cdb/pdb1/system01.dbf
输入数据文件: 文件号=00010 名称=/u01/app/oracle/oradata/cdb/pdb1/pdb1_users01.dbf
通道 ORA_DISK_1: 正在启动段 1 于 22-3月 -16
通道 ORA_DISK_1: 已完成段 1 于 22-3月 -16段句柄=/u01/app/oracle/fast_recovery_area/CDB/2E26709E68912450E055000000000001/backupset/2016_03_22/o1_mf_nnndf_TAG20160322T171142_ch232hxb_.bkp标记=TAG20160322T171142 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:05
完成 backup 于 22-3月 -16
启动 Control File and SPFILE Autobackup 于 22-3月 -16段handle=/u01/app/oracle/fast_recovery_area/CDB/autobackup/2016_03_22/o1_mf_s_907175569_ch234n0h_.bkpcomment=NONE
完成 Control File and SPFILE Autobackup 于 22-3月 -16
如果要备份多个pdb,只需在备份命令后面跟上多个你想备份的pdb实例的名称,如下backup pluggable database pdb1,pdb2;
-
在PDB中使用BACKUP DATABASE备份当前连接的PDB数据库,前提条件是需要配置好TNSNAMES.ORA文件。
[oracle@localhost admin]$ rman target sys/oracle@pdb1
恢复管理器: Release 12.1.0.2.0 - Production on 星期三 3月 23 09:35:16 2016
Copyright (c) 1982, 2014, Oracle and/or itsaffiliates. All rights reserved.
已连接到目标数据库: CDB (DBID=2023252752)
RMAN> backup database;
启动 backup 于 23-3月 -16
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=69 设备类型=DISK
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
输入数据文件: 文件号=00009 名称=/u01/app/oracle/oradata/cdb/pdb1/sysaux01.dbf
输入数据文件: 文件号=00008 名称=/u01/app/oracle/oradata/cdb/pdb1/system01.dbf
输入数据文件: 文件号=00010 名称=/u01/app/oracle/oradata/cdb/pdb1/pdb1_users01.dbf
通道 ORA_DISK_1: 正在启动段 1 于 23-3月 -16
通道 ORA_DISK_1: 已完成段 1 于 23-3月 -16
段句柄=/u01/app/oracle/fast_recovery_area/CDB/2E26709E68912450E055000000000001/backupset/2016_03_23/o1_mf_nnndf_TAG20160323T100113_ch3y7byj_.bkp标记=TAG20160323T100113 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:05
完成 backup 于 23-3月 -16
启动 Control File and SPFILE Autobackup 于 23-3月 -16段handle=/u01/app/oracle/fast_recovery_area/CDB/autobackup/2016_03_23/o1_mf_s_907236140_ch3y9jyb_.bkpcomment=NONE
完成 Control File and SPFILE Autobackup 于 23-3月 -16
1.5. 整体数据库恢复(CDB和所有PDB)
12C数据库加强了RMAN恢复的功能,恢复的方式基本同以前的模式一样,如果是在一个全新的异地进行恢复,同样的也是先手工创建与原库相同的CDB和PDB实例,然后关闭实例,删除所有数据文件,通过RMAN命令或者拷贝原始库的控制文件到新库上,启动CDB数据库到mount状态,如下
[oracle@localhostadmin]$rman target /
恢复管理器: Release 12.1.0.2.0 -Production on 星期三 7月 13 11:27:33 2016
Copyright(c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
已连接到目标数据库 (未启动)
RMAN>startup mount;
Oracle实例已启动
数据库已装载
系统全局区域总计 2516582400 字节
FixedSize 3048776 字节
VariableSize 671091384 字节
DatabaseBuffers 1828716544 字节
RedoBuffers 13725696 字节
RMAN>restoredatabase;
。。。。。。。(此处省略)
通道 ORA_DISK_1: 将数据文件 00098 还原到 ….ORADATA/ORCL/ZL9WZARDDATA.DBF
通道 ORA_DISK_1: 将数据文件 00099 还原到 ….ORADATA/ORCL/ZL9IDEXPSS.DBF
通道 ORA_DISK_1: 将数据文件 00100 还原到 ….ORADATA/ORCL/ZLBA5.DBF
通道 ORA_DISK_1: 将数据文件 00101 还原到 ….ORADATA/ORCL/MGMTAD4J.DBF
通道 ORA_DISK_1: 将数据文件 00102 还原到 ….ORADATA/ORCL/MGMTDBF
通道 ORA_DISK_1: 将数据文件 00103 还原到 ….ORADATA/ORCL/MGMTDEPOT.DBF
通道 ORA_DISK_1: 正在读取备份片段 /u01/app/oracle/fast_recovery_area/CDB/autobackup/01RAH8KJ_1_1
通道 ORA_DISK_1: 将数据文件 00002 还原到 ….ORADATA/CDB/PDBSEED/SYSTEM01.DBF
通道 ORA_DISK_1:` 将数据文件 00004 还原到 ….ORADATA/CDB/PDBSEED/SYSAUX01.DBF
通道 ORA_DISK_1: 正在读取备份片段D:\APP\RMAN\04RAH9B2_1_1
。。。。。。。(此处略过)
通道 ORA_DISK_1: ORA-19870:还原备份片段 /u01/app/oracle/fast_recovery_area/CDB/autobackup 04RAH9B2_1_1 时出错
ORA-19504:无法创建文件"….ORADATA/CDB/PDBSEED/SYSAUX01.DBF"
ORA-27040:文件创建错误, 无法创建文件
OSD-04002:无法打开文件
O/S-Error:(OS 3) 系统找不到指定的路径。
故障转移到上一个备份
RMAN-00571:===========================================================
RMAN-00569:=============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571:===========================================================
RMAN-03002:restore 命令 (在 07/13/2016 11:55:19 上) 失败
RMAN-06026:有些目标没有找到 - 终止还原
RMAN-06023:没有找到数据文件4的副本来还原
RMAN-06023:没有找到数据文件2的副本来还原
在还原的时候可能遇到RMAN-06023错误,这是由于恢复数据文件路径不存在导致,我只需要手工创建路径,然后重复执行下restore database命令就可以了,之前已经恢复的文件会自动略过,如下
。。。。。。。(此处省略)
正在略过数据文件111; 已还原到文件 ....ORADATA/ZLEMR/ZLDOCBASE.DBF
正在略过数据文件112; 已还原到文件 ....ORADATA/ZLEMR/ZLDOCINDEX.DBF
正在略过数据文件113; 已还原到文件 ....ORADATA/ZLEMR/ZLDOCDATA.DBF
正在略过数据文件114; 已还原到文件 ....ORADATA/ZLEMR/ZLDOCDATAINDEX.DBF
正在略过数据文件115; 已还原到文件 ....ORADATA/ZLEMR/ZLDOCXML.DBF
通道 ORA_DISK_1: 正在开始还原数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_DISK_1: 将数据文件 00002 还原到 ....ORADATA/CDB/PDBSEED/SYSTEM01.DBF
通道 ORA_DISK_1: 将数据文件 00004 还原到 ....ORADATA/CDB/PDBSEED/SYSAUX01.DBF
通道 ORA_DISK_1: 正在读取备份片段D:\APP\RMAN\04RAH9B2_1_1
通道 ORA_DISK_1: 已还原备份片段 1
通道 ORA_DISK_1: 还原完成, 用时: 00:00:55
完成 restore 于 13-7月 -16
RMAN>recoverdatabase;
。。。。。。(此处省略)
归档日志文件名=…..ARCHIVE/ARC0000000588_0915209064.0001线程=1 序列=588
归档日志文件名=…..ARCHIVE/ARC0000000589_0915209064.0001线程=1 序列=589
归档日志文件名=…..ARCHIVE/ARC0000000590_0915209064.0001线程=1 序列=590
归档日志文件名=…..ARCHIVE/ARC0000000591_0915209064.0001线程=1 序列=591
归档日志文件名=…..ARCHIVE/ARC0000000592_0915209064.0001线程=1 序列=592
归档日志文件名=…..ARCHIVE/ARC0000000593_0915209064.0001线程=1 序列=593
归档日志文件名=…..ARCHIVE/ARC0000000594_0915209064.0001线程=1 序列=594
归档日志文件名=…..ARCHIVE/ARC0000000595_0915209064.0001线程=1 序列=595
介质恢复完成, 用时: 00:04:32
完成 recover 于 13-7月 -16
RMAN>alter database open resetlogs;
已处理语句
1.6. 单个PDB数据库恢复
恢复单个PDB的前提是CDB已经能够正常启动,在CDB启动的情况下在RMAN中采用restore pluggable database pdb名称指定单个PDB数据库进行恢复,如下
RMAN>restore pluggable database orcl;
启动 restore 于 13-7月 -16
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在开始还原数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_DISK_1: 将数据文件 00056 还原到 ....ORADATA/ORCL/SYSTEM01.DBF
通道 ORA_DISK_1: 将数据文件 00057 还原到 ....ORADATA/ORCL/SYSAUX01.DBF
通道 ORA_DISK_1: 将数据文件 00058 还原到 ....ORADATA/ORCL/USERS
。。。。。。。(此处省略)
通道 ORA_DISK_1: 将数据文件 00102 还原到 ....ORADATA/ORCL/MGMT.DBF
通道 ORA_DISK_1: 将数据文件 00103 还原到 ....ORADATA/ORCL/MGMT_DEPOT.DBF
通道 ORA_DISK_1: 正在读取备份片段D:\APP\RMAN\01RAH8KJ_1_1
通道 ORA_DISK_1: 段句柄 =…..RMAN/01RAH8KJ_1_1 标记 = TAG20160712T160849
通道 ORA_DISK_1: 已还原备份片段 1
通道 ORA_DISK_1: 还原完成, 用时: 00:07:07
完成 restore 于 13-7月 -16
RMAN>recover pluggable database orcl;
启动 recover 于 13-7月 -16
使用通道 ORA_DISK_1
正在开始介质的恢复
归档日志文件名=…..ARCHIVE/ARC0000000591_0915209064.0001线程=1 序列=591
归档日志文件名=…..ARCHIVE/ARC0000000592_0915209064.0001线程=1 序列=592
归档日志文件名=…..ARCHIVE/ARC0000000593_0915209064.0001线程=1 序列=593
归档日志文件名=…..ARCHIVE/ARC0000000594_0915209064.0001线程=1 序列=594
归档日志文件名=…..ARCHIVE/ARC0000000595_0915209064.0001线程=1 序列=595
介质恢复完成, 用时: 00:01:10
完成 recover 于 13-7月 -16
最后,在以restlogs方式,打开pdb实例,如下
SQL*Plus:Release 12.1.0.2.0 Production on 星期三 7月 13 15:12:57 2016
Copyright(c) 1982, 2014, Oracle. All rightsreserved.
SQL>conn / as sysdba
已连接。
SQL>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------------------------------------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCL MOUNTED
4 ZLEMR MOUNTED
SQL>alter pluggable database pdb1 orcl resetlogs;
插接式数据库已变更。
SQL>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------------------------------------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCL READ WRITE NO
4 ZLEMR MOUNTED
1.7. 恢复PDB数据文件
数据库在open的时候,会对当前的数据的所有数据文件进行检查。
对于system,sysaux和undo表空间的数据文件,如果有问题,数据库无法open。如果是PDB中某个普通的数据文件出现丢失,我们可以先用offline方式跳过,然后再打数据库,稍后再对数据文件做恢复:
例:
SQL> startup;
ORACLE instance started.
Total System Global Area 835104768 bytes
Fixed Size 2293880 bytes
Variable Size 322965384 bytes
Database Buffers 503316480 bytes
Redo Buffers 6529024 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 6- see DBWR trace file
ORA-01110: data file 6:'/u01/app/oracle/oradata/c12/users01.dbf'
SQL> alter database datafile 6 offline;
Database altered.
SQL> alter database open;
Database altered.
使用rman
RMAN> restore datafile 6;
RMAN> recover datafile 6;
然后对数据文件进行online处理
SQL> alter database datafile 6 online;
再看看pdb的数据文件.摸拟pdb数据文件删除
[oracle@o12c pdb2]$ mv pdb2_users01.dbfpdb2_users01.dbfold
启动数据库实例
SQL> startup;
ORACLE instance started.
Total System Global Area 835104768 bytes
Fixed Size 2293880 bytes
Variable Size 322965384 bytes
Database Buffers 503316480 bytes
Redo Buffers 6529024 bytes
Database mounted.
Database opened.
由此我们可以得出一个结论,当cdb在打开的时候,数据库不会检查pdb中的数据文件。
SQL> alter pluggable database pdb2 open;
alter pluggable database pdb2 open
ERROR at line 1:
ORA-01157: cannot identify/lock data file 13- see DBWR trace file
ORA-01110: data file 13:'/u01/app/oracle/oradata/c12/pdb2/pdb2_users01.dbf'
只有在打开pluggabledatabase时,会效验PDB数据库的数据文件,。
SQL> alter session set container=pdb2;
Session altered.
SQL> alter pluggable database datafile 13 offline;
Pluggable database altered.
数据文件file#(文件号)是唯一的,但我们在CDB中操作时找不到该文件,必须要进入PDB模式,如果在CDB试图去offline一个数据文件时会报错:
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> alter database datafile 10 offline;
alter database datafile 10 offline
第 1 行出现错误:
ORA-01516: 不存在的日志文件, 数据文件或临时文件 "10"*
但是在rman中可以直接使用datafile号进行恢复
[oracle@localhost admin]$ rman target /
恢复管理器: Release 12.1.0.2.0 - Production on 星期三 3月 23 11:04:15 2016
Copyright (c) 1982, 2014, Oracle and/or itsaffiliates. All rights reserved.
已连接到目标数据库: CDB (DBID=2023252752)
RMAN> restore datafile 10;
启动 restore 于 23-3月 -16
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在开始还原数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_DISK_1: 将数据文件 00010 还原到 /u01……/backupset/2016_03_23/o1_mf_nnndf_TAG20160323T100113_ch3y7byj_.bkp
通道 ORA_DISK_1: 段句柄 = /u01…….backupset/2016_03_23/o1_mf_nnndf_TAG20160323T100113_ch3y7byj_.bkp标记 = TAG20160323T100113
通道 ORA_DISK_1: 已还原备份片段 1
通道 ORA_DISK_1: 还原完成, 用时: 00:00:01
完成 restore 于 23-3月 -16
RMAN> recover datafile 10;
启动 recover 于 23-3月 -16
使用通道 ORA_DISK_1
正在开始介质的恢复
介质恢复完成, 用时: 00:00:00
完成 recover 于 23-3月 -16;