--=================================
-- 基于 catalog 的 RMAN 备份与恢复
--=================================
RMAN 的备份与恢复存储仓库的数据通常存放于控制文件或恢复目录中,本文主要讲述基于 catalog 的备份与恢复。
关于 catalog 的创建请参考: RMAN catalog 的创建和使用
catalog 方式的 RMAN 备份与恢复只不过是将备份恢复信息数据放在 catalog 目录内,普通的 rman 方式则是存放在控制文件中
catalog 方式可以存储常用或特定的备份与恢复的脚本
有关 catalog 方式 RMAN 存储脚本请参考: 基于 catalog 创建RMAN 存储脚本
一、基于 catalog 来备份数据库 ( 目标数据库 orcl ,恢复目录数据库 asmdb)
首先基于 catalog 创建备份脚本
-- 连接到 RMAN
[oracle@oradb ~]$ rman target sys / redhat@orcl catalog rman / rman@asmdb
connected to target database : ORCL ( DBID = 1263182651 )
connected to recovery catalog database
-- 创建全局删除废弃备份的脚本
RMAN > create global script global_del_obso comment 'A script for obsolete backup and delete it' {
2 > allocate channel ch1 device type disk ;
3 > delete obsolete recovery window of 7 days ;
4 > release channel ch1 ;
5 > }
new incarnation of database registered in recovery catalog
starting full resync of recovery catalog
full resync complete
created global script global_del_obso
-- 创建全局归档日志的备份脚本
RMAN > create global script global_arch
2 > comment ' A script for archivelog and delete it '
3 > {
4 > allocate channel ch1 device type disk ;
5 > sql " alter system archive log current" ;
6 > set limit channel ch1 readrate = 10240 ;
7 > set limit channel ch1 kbytes = 2048000 ;
8 > backup as compressed backupset archivelog all delete input
9 > format = '/u01/bk/rmbk/arch_%d_%U'
10 > tag = 'Archbk' ;
11 > release channel ch1 ;
12 > }
created global script global_arch
-- 创建全局 0 级增量备份脚本
RMAN > create global script global_inc0
2 > comment ' A script for backup database using incremental level 0'
3 > {
4 > execute global script global_del_obso ;
5 > allocate channel ch1 device type disk ;
6 > set limit channel ch1 readrate = 10240 ;
7 > set limit channel ch1 kbytes = 2048000 ;
8 > backup as compressed backupset incremental level 0 database
9 > format = '/u01/bk/rmbk/inc0_%d_%U'
10 > tag = 'Inc0' ;
11 > release channel ch1 ;
12 > execute global script global_arch ;
13 > }
created global script global_inc0
-- 列出已经创建的全局脚本
RMAN > list global script names ;
List of Stored Scripts in Recovery Catalog
Global Scripts
Script Name
Description
-----------------------------------------------------------------------
global_arch
A script for archivelog and delete it
global_del_obso
A script for obsolete backup and delete it
global_inc0
A script for backup database using incremental level 0
-- 启用控制文件的自动备份功能
RMAN > configure controlfile autobackup on ;
RMAN > configure controlfile autobackup format for device type disk to '/u01/bk/rmbk/auto_ctl_%d_%f' ;
-- 删除以前的备份
RMAN > delete noprompt backupset ;
-- 备份前验证归档日志是否存在
RMAN > crosscheck archivelog all;
-- 删除无效的归档日志信息
RMAN > delete noprompt expired archivelog all;
-- 使用 0 级增量备份数据库
RMAN > run { execute global script global_inc0 ;}
-- 查看刚刚完成的备份情况
RMAN > list backupset summary ;
RMAN > list backupset ;
RMAN > list backup of controlfile ;
RMAN > list backup of archivelog all;
RMAN > list backup of database ;
RMAN > list backup of datafile n ;
二、恢复操作
1. 非系统表空间的恢复步骤
a . alter datafile n offline immediate ; | alter tablespace tbs_name offline immediate ;
b . restore
c . recover
d . alter datafile n online ; | alter tablespace tbs_name online
-- 删除非系统表空间 users 的数据文件 ( 数据库位于 open 状态 )
[oracle@oradb orcl]$ pwd
/ u01 / oracle / oradata / orcl
[oracle@oradb orcl]$ rm users01 . dbf
lion@ORCL > select * from tb2 ;
select * from tb2
*
ERROR at line 1 :
ORA - 01116 : error in opening database file 4
ORA - 01110 : data file 4 : '/u01/oracle/oradata/orcl/users01.dbf'
ORA - 27041 : unable to open file
Linux Error : 2 : No such file or directory
Additional information : 3
RMAN > run {
2 > allocate channel ch1 device type disk ;
3 > sql " alter tablespace users offline immediate " ;
4 > restore tablespace users ;
5 > recover tablespace users ;
6 > sql " alter tablespace users online " ;
7 > }
lion@ORCL > select * from tb2 ;
ID NAME
---------- ---------------
1 Robinson
也可以使用下面的恢复方式来完成恢复
RMAN > run {
2 > allocate channel ch1 device type disk ;
3 > sql " alter database datafile 4 offline " ;
4 > restore datafile 4 ;
5 > recover datafile 4 ;
6 > sql " alter database datafile 4 online " ;
7 > }
如果介质恢复时,需要用的日志尚未归档,需要指定联机重做日志文件所在的位置
注意
表空间几种不同的脱机方式
offline normal :
表空间脱机的缺省方式,将位于 SGA 中且与该表空间所有的数据文件相关的数据块 ( blocks ) 写入到数据文件之后再进行脱机
再次联机时不需要做介质恢复。
offline temporary :
实施检查点进程,即同样将 SGA 中且与该表空间所有的数据文件相关的数据块 ( blocks ) 写入到数据文件之后再进行脱机
不保证所有的数据能够写入到数据文件。再次联机时要做介质恢复。
offline immediate :
不保证表空间的数据可用,也不实施检查点进程而直接脱机,再次联机时要做介质恢复。
offline temporary , offline immediate 脱机方式不适用于数据文件
lion@ORCL > alter database datfile 4 offline immediate ;
alter database datfile 4 offline immediate
*
ERROR at line 1 :
ORA - 02231 : missing or invalid option to ALTER DATABASE
lion@ORCL > alter database datfile 4 offline temporary ;
alter database datfile 4 offline temporary
*
ERROR at line 1 :
ORA - 02231 : missing or invalid option to ALTER DATABAS
更多关于表空间与数据文件的管理,请参考: Oracle 表空间与数据文件
对于表空间存在多个数据文件的情况 , 而单个或较少的数据文件受损 , 应尽可能使用第二种方式来恢复 . 即 resotre & recover datafile n
2.UNDO 表空间的恢复
关于 UNDO 表空间的管理请参考: Oracle 回滚(ROLLBACK) 和撤销(UNDO)
恢复步骤 ( undo 丢失后 )
alter database datafile 2 online ;
alter database datafile 2 offline ;
select * from v$recover_file ;
restore datafile 2 ; -- 用 RMAN 完成
recover datafile 2 ;
alter database datafile 2 online ;
-- 首先做一些操作,将数据填充到 undo 表空间
lion@ORCL > select * from tb2 ;
ID NAME
---------- ---------------
1 Jack
lion@ORCL > insert into tb2 select 2 , 'Jackson' from dual ;
lion@ORCL > commit ;
lion@ORCL > delete from tb2 where id = 1 ;
lion@ORCL > select * from tb2 ;
ID NAME
---------- ---------------
2 Jackson
lion@ORCL > ho rm $ORACLE_BASE / oradata / orcl / undotbs01 . dbf
注意: undo 表空间不能被 offline , 也不能被 readonly
使用 alter database datafile 2 online | offline 强制执行该步骤 , 以告知 oracle undo 表空间被损坏 , 执行后会话被终止 , 如下
lion@ORCL > alter database datafile 2 online ;
alter database datafile 2 online
*
ERROR at line 1 :
ORA - 01116 : error in opening database file 2
ORA - 01110 : data file 2 : '/u01/oracle/oradata/orcl/undotbs01.dbf'
ORA - 27041 : unable to open file
Linux Error : 2 : No such file or directory
Additional information : 3
lion@ORCL > alter database datafile 2 offline ;
ERROR :
ORA - 03114 : not connected to ORACLE
alter database datafile 2 offline
*
ERROR at line 1 :
ORA - 00603 : ORACLE server session terminated by fatal error
-- 接下面再来进行恢复
RMAN > run {
2 > allocate channel ch1 device type disk ;
3 > restore datafile 2 ;
4 > recover datafile 2 ;}
starting media recovery -- 还原被成功执行 , 介质恢复失败,且会话被终止
media recovery failed
ORA - 00603 : ORACLE server session terminated by fatal error
-- 重新登录到数据库服务器并查看 v$recover_file 视图以及进行介质恢复
sys@ORCL > select * from v$recover_file ;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- --------------- ---------- ---------
2 OFFLINE OFFLINE UNKNOWN ERROR 493982 23 - NOV - 10
sys@ORCL > recover datafile 2 ; -- 进行介质恢复,恢复后可以看到提示回话被终止
ORA - 00603 : ORACLE server session terminated by fatal error
sys@ORCL > conn / as sysdba -- 再次连接
Connected .
sys@ORCL > select name , status from v$datafile where name like '%undo%' ; --undo 表空间已经处于 offline 状态
NAME STATUS
--------------------------------------------- -------
/ u01 / oracle / oradata / orcl / undotbs01 . dbf OFFLINE
sys@ORCL > alter database datafile 2 online ;
Database altered .
sys@ORCL > select * from lion . tb2 ;
ID NAME
---------- ---------------------------------------------
2 Jackson
可以看到表中 ID 为的记录已经丢失 , 事实上在 undo 的数据文件丢失前 , 该事务并没有提交 , 由此可以推断,该事务进行了隐式提交 .
3. 系统表空间的恢复 ( system , sysaux )
系统表空间只能在 Mount 状态下来完成恢复,步骤如下
startup mount ;
restore datafile 1 ;
recover datafile 1 ;
alter database open ;
-- 创建新表 tb3 ,并插入记录。其数据字典信息则位于 system 表空间,数据内容位于 users 表空间
lion@ORCL > create table tb3 tablespace users as select * from tb2 ;
lion@ORCL > insert into tb3 select 1 , 'Johnson' from dual ;
lion@ORCL > commit ;
lion@ORCL > select * from tb3 order by id ;
ID NAME
---------- ---------------------------------------------
1 Johnson
2 Jackson
-- 删除表空间 system01.dbf , sysaux01.dbf
sys@ORCL > ho rm $ORACLE_BASE / oradata / orcl / system01 . dbf
sys@ORCL > ho rm $ORACLE_BASE / oradata / orcl / sysaux01 . dbf
sys@ORCL > startup mount force ;
RMAN > run {
2 > allocate channel ch1 device type disk ;
3 > restore datafile 1 , 3 ;
4 > recover datafile 1 , 3 ;
5 > alter database open ;
6 > release channel ch1 ;}
sys@ORCL > select * from lion . tb3 order by id ; -- 成功恢复后表 tb3 也被恢复
ID NAME
---------- ---------------------------------------------
1 Johnson
2 Jackson
4. 控制文件的恢复
步骤
connect to target db and catalog ( nocatalog ) db
startup nomount
restore controlfile [from autobackup]
alter database mount
recover database
alter database open resetlogs
由于控制文件采取了自动备份策略,因此在每次备份或重大系统结果发生变化时,控制文件将被自动备份
sys@ORCL > ho rm $ORACLE_BASE / oradata / orcl /*.ctl -- 删除所有的控制文件 */
sys@ORCL > select file# , status from v$datafile ; -- 查看 v$datafile 视图时,系统已检测到错误发生
select file# , status from v$datafile
*
ERROR at line 1 :
ORA - 00210 : cannot open the specified control file
ORA - 00202 : control file : '/u01/oracle/oradata/orcl/control01.ctl'
ORA - 27041 : unable to open file
Linux Error : 2 : No such file or directory
Additional information : 3
sys@ORCL > shutdown abort ;
-- 重新连接到 RMAN ,注意连接 target 时使用 /, 否则提示 TNS 无法解析
[oracle@oradb dbs]$ uniread rman target / catalog rman / rman@asmdb
connected to target database : orcl (not started )
connected to recovery catalog database
RMAN > startup nomount ;
RMAN > run {
2 > allocate channel ch1 device type disk ;
3 > restore controlfile ;
4 > sql " alter database mount " ;
5 > recover database ;
6 > sql " alter database open resetlogs " ;
7 > release channel ch1 ;}
注:在此处有可能不要介质恢复,如果提示需要介质恢复,直接在 RMAN 或 SQLPlus 下执行 recover database 即可
使用 open resetlogs 之后,一个新的 incarnation 将被生成,再此建议立即全备数据库。
更多关于控制文件
Oracle 控制文件的备份与恢复
5. 联机重做日志文件的恢复 ( online redo log )
当数据库置为 mount 状态,且将要转换为 open 状态时,数据文件,联机日志文件被打开,因此联机日志的丢失可以在 mount 状态完成
恢复步骤
a . 启动到 mount 状态 ( startup mount force )
b . 还原数据库 ( restore database )
c . 恢复数据库 ( recover database )
下面对删除日志并进行恢复
lion@ORCL > select * from tb2 ;
ID NAME
---------- ---------------
2 Jackson
lion@ORCL > select current_scn from v$database ; -- 查看数据库当前的 SCN
CURRENT_SCN
-----------
1020638
lion@ORCL > insert into tb2 select 1 , 'Johnson' from dual ; -- 为表 tb2 新增一条记录
lion@ORCL > commit ;
lion@ORCL > select current_scn from v$database ; -- 数据库当前的 SCN 发生了变化为
CURRENT_SCN
-----------
1020685
lion@ORCL > select file# , checkpoint_change# from v$datafile_header ; -- 数据文件头部的 checkpoint_change
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1020368
2 1020368
3 1020368
4 1020368
5 1020368
6 1020368
lion@ORCL > ho rm - f $ORACLE_BASE / oradata / orcl /*.log -- 删除所有的日志文件 */
lion@ORCL > insert into tb2 select 2 , 'wilson' from dual ; -- 为表插入新记录
lion@ORCL > commit ;
lion@ORCL > select current_scn from v$database ; -- 数据库当前的 SCN 发生了变化为
CURRENT_SCN
-----------
1020708
lion@ORCL > alter system archive log current ; -- 对日志进行归档时提示错误发生
alter system archive log current
*
ERROR at line 1 :
ORA - 16038 : log 1 sequence# 1 cannot be archived
ORA - 00312 : online log 1 thread 1 : '/u01/oracle/oradata/orcl/redo01.log'
lion@ORCL > conn / as sysdba
sys@ORCL > startup mount force ;
[oracle@oradb ~]$ uniread rman target / catalog rman / rman@asmdb -- 退出 RMAN 后并重新连接
RMAN > run {
2 > allocate channel ch1 device type disk ;
3 > restore database ;
4 > recover database ;
5 > release channel ch1 ;}
RMAN - 06054 : media recovery requesting unknown log : thread 1 seq 1 lowscn 1020365
sys@ORCL > recover database until cancel ; -- 回到 SQLPlus 直接使用 until cancel 来进行恢复
sys@ORCL > alter database open resetlogs ; -- 执行 opensetlogs 打开数据库
sys@ORCL > select * from lion . tb2 ; -- 在日志未完成自动归档前,删除日志的后数据全部丢失
ID NAME
---------- ---------------
2 Jackson
关于单个日志文件丢失或日志文件组受损,请参考: Oracle 联机重做日志文件(ONLINE LOG FILE)
6. 所有数据全部丢失的处理
步骤
a . 启动到 nomount 状态 ( startup nomount )
b . 还原控制文件 ( restore controlfile from autobackup )
c . 还原数据 ( restore database )
d . 将数据切换到 mount 状态 ( alter database mount )
e . 恢复数据库 ( recover database using backup controlfile until cancel )
f . 使用 open resetlogs 打开数据库 ( alter database open resetlogs )
-- 下面演示数据文件、日志文件、控制文件全部丢失的处理
sys@ORCL > ho rm $ORACLE_BASE / oradata / orcl /* -- 删除所有的数据文件、日志文件、控制文件 */
sys@ORCL > startup nomount ;
[oracle@oradb ~]$ uniread rman target / catalog rman / rman@asmdb
RMAN > startup nomount ;
RMAN > restore controlfile from autobackup ;
RMAN > run {
2 > allocate channel ch1 device type disk ;
3 > restore database ;
4 > sql " alter database mount " ;
5 > recover database ;}
RMAN - 06004 : ORACLE error from recovery catalog database : RMAN - 20003 : target database incarnation not found in
recovery catalog
idle > recover database using backup controlfile until cancel ; -- 使用 SQLPlus 来完成恢复操作
idle > alter database open resetlogs ;
三、 更多参考
有关基于用户管理的备份和备份恢复的概念请参考:
Oracle 基于用户管理恢复的处理 ( 详细描述了介质恢复及其处理 )
有关 RMAN 的恢复与管理请参考:
有关 Oracle 体系结构请参考:
Oracle 实例和Oracle 数据库(Oracle 体系结构)
Oracle 联机重做日志文件(ONLINE LOG FILE)