目录
本文所说的备份恢复,是指物理方式的备份恢复。对数据库的备份和恢复,主要是指三大核心文件(datafile、controlfile、online redo log)的备份和恢复,这三大核心文件决定了数据库的数据内容。除此之外,还可以备份参数文件(pfile)和密码文件。
备份:
Oracle中所谓的备份,就是复制三大核心文件。不过分为冷备和热备两种,冷备指一致性关库 后复制,热备指在数据库运行时复制。实际应用中,这三大核心文件,通常存储在不同的磁盘上,并不是复制一个包含所有的目录就行。
冷备操作步骤:
1、shutdown immediate
2、cp 数据文件、控制文件、(日志文件)
3、开库
这里有些细节需要注意:
先查看有哪些数据文件需要复制:
select name from v$datafile;
查看控制文件位置:
select name from v$controlfile;
在线redo日志位置:
select * from v$logfile;
如果不是一致性关库,也可以复制三大核心文件作为备份,不过此时在线redo日志就不能少。???
热备操作步骤:
1、热备必须开归档
2、alter database begin backup 进入热备模式
3、cp 数据文件、控制文件、日志文件
4、alter database end backup 退出热备模式
5、只读表空间不需要上面的命令,直接复制即可。临时表空间不需要备份。
备份后检查有没有坏块:
dbv file=/u01/app/oracle/oradata/PROD/users01.dbf
恢复:
概述
下面从是否完全恢复这个角度,来覆盖关于恢复的知识点。
完全恢复 和 不完全恢复,最本质区别,是客户端最后一次成功提交的事务,是否丢失。按照数据库事务原理,已经提交(客户端支持commit并返回成功)的事务,不一定写到datafile中,但一定写到了联机日志中。
所以,恢复时,能否做完全恢复,关键在于,最后一次成功提交的事务时,所写那个的联机日志文件(下文简称“最后事务日志”)是否损坏,或者能否从归档日志恢复。
如果“最后事务日志”损坏无法恢复,则只能不完全恢复,反之,可以完全恢复。当然,还要归档日志连续。
完全恢复、基于时间点/SCN恢复,都需要开启归档日志,并且归档日志必须完整连续。
恢复操作的基本原理:
RESTORE DATABASE:仅从备份中还原数据文件的物理副本,
不会影响当前的 redo log 文件(联机重做日志和归档日志)。
RECOVER DATABASE:应用归档日志和联机日志,将数据文件恢复到一致状态。
完全恢复:
完全恢复场景:
一般是一个正在运行的数据库系统,突然由于某种原因,某数据文件损坏了,数据库宕机或不能正常工作。此时就要尝试用之前备份的数据文件,替换掉损坏的数据文件,然后进行恢复,恢复到最新的状态。
1、datafile损坏,当前controlfile没有损坏,当前联机日志完整,存在备份,归档日志开启并连续完整。
2、datafile损坏或没有损坏,当前controlfile损坏,当前联机日志完整,存在备份,归档日志开启并连续完整。
3、当前联机日志完整,存在备份,归档日志开启并连续完整,除此以外全都损坏。
查看checkpoint的状态,可以查询SCN获得:
select file#,checkpoint_change# from v$datafile;
select file#,checkpoint_change# from v$datafile_header;
恢复可以是整个数据库级别的,即数据库关键数据文件损坏,这种情况数据库无法启动,要在实例的mount状态下,替换所有数据文件,并且恢复。
也可以是表空间级别的,即非关键数据文件损坏,这种情况数据库可以启动,只需使损坏的表空间脱机,替换表空间所有的数据文件,并且恢复。
也可以是数据文件级别的,即非关键数据文件损坏,这种情况数据库可以启动,只需使损坏的数据文件脱机,替换数据文件,并且恢复。
这三种级别使用的命令稍有不同。
数据库级别:
startup mount;
用备份的所有数据文件替换所有数据文件。
recover database;
如果当前controlfile损坏,就用备份分controlfile替换掉损坏的,然后用下面的命令恢复:
recover database using backup controlfile;
alter database open;
或者是
alter database open resetlogs;

表空间级别:
关键表空间,在mount下恢复:
startup mount;
-- 用备份的数据文件替换所有损坏表空间的数据文件。
recover tablespace user1;
alter database open;
非关键表空间,在open下恢复:
alter tablespace user1 offline;
用备份的数据文件替换所有损坏表空间的数据文件。
recover tablespace user1;
alter tablespace user1 online;
数据文件级别:
关键数据文件,在mount下恢复:
startup mount;
-- 用备份的数据文件替换所有损坏表空间的数据文件。
recover datafile 6,8;
-- 6、8是数据文件编号,从v$datafile查得。
alter database open;
非关键数据文件,在open下恢复:
alter database datafile 6,8 offline;
-- 用备份的数据文件替换所有损坏表空间的数据文件。
recover datafile 6,8;
alter database datafile 6,8 online;
不完全恢复:
不完全恢复的一个重要场景是可以恢复到过去的某个时间点的数据库状态。
不完全恢复,总结起来,就两种情况:
1、联机日志损坏,尽可能多的恢复事务。
2、联机日志没有损坏,数据库回退到过去某个时间点或SCN。
无论使用当前控制文件还是备份控制文件,都可以恢复到过去某个时间点,都可以进行完全恢复(完全恢复的关键是联机日志是否完整),都可以做until cancel不完全恢复。唯一区别是,恢复命令是否有using backup controlfile。
不完全恢复几种场景:
1、数据库正常运行,不小心做了误操作(删改表删改记录等),想回退到误操作之前某个时间点,这种情况当前控制文件没有损坏,使用当前控制文件。
步骤:
a、关闭数据库,对当前状态做一份全备(冷备)。
b、确定要恢复的时间点或SCN号,找到这个时间点之前备份,用其数据文件替换当前的数据文件(所有数据文件)。
c、启动到mount状态,执行恢复命令:
recover database until change <scn>;
或
recover database until time '2021-07-01 19:39:43';
根据提示选择归档文件,一般选auto
d、如果恢复成功,做一次全备(冷备),然后 alter database open resetlogs; 打开数据库。
2、数据库由于种种原因,联机日志组损坏,启动失败,想要尽可能多的对数据库进行恢复,达到一致性状态,能够启动。这种情况,控制文件没有损坏,可以使用当前控制文件,进行until cancel恢复。
恢复步骤:
a、关闭数据库,对当前状态做一份全备(冷备)。
b、找到之前某一次备份,用其数据文件替换当前的数据文件(所有数据文件)。
c、启动到mount状态,执行恢复命令:
recover database until cancel;
d、如果恢复成功,做一次全备(冷备),然后 alter database open resetlogs; 打开数据库。
(注意有一部分数据已经丢失,就是损坏联机日志中,没有归档的部分)
3、数据库遇到灾难性故障,数据文件、联机日志、当前控制都损坏,但是还有备份和归档日志,想恢复到过去某个时间点或能恢复多少恢复多少。
a、关闭数据库。
b、找到之前某一次备份,用其所有数据文件、控制文件,(联机日志)替换当前的这些文件。
c、启动到mount状态,执行恢复命令:
recover database using backup contiolfile until cancel;
或 recover database using backup contiolfile until time '2021-07-01 19:39:43';
或 recover database using backup contiolfile until change <scn>;
d、如果恢复成功,做一次全备(冷备),然后 alter database open resetlogs; 打开数据库。
(注意有一部分数据已经丢失,就是损坏联机日志中,没有归档的部分)
RMAN 备份恢复:
前面的操作称为手工备份,RMAN是一个自动化备份工具,能将上面许多操作自动化。
RMAN的备份算法:
除了自动化,RMAN做全量备份时,使用了与手工备份不同的算法。

手工备份是直接复制三大关键文件。RMAN的备份时,只备份数据文件中已使用的Block(图中绿色的部分),这样备份文件更小,不过还原的时候,RMAN要对数据文件重建,也因此,RMAM备份和手工备份不兼容,RMAN恢复时,必须使用RMAN的备份。
增量备份:
RMAN还发明了增量备份(不是在备份上应用redo,是另一种原理)。假设用RMAN对整个数据库做了一次备份A(热备或冷备不影响讨论),过一段时间后,再想做一次备份,可以对当前数据文件做RMAN完整的备份,或者可以比较当前数据文件和A,有哪些Block做了修改,只备份修改了Block,这就是增量备份B,还原时,可以用A和B重建当前数据文件,在RMAN中,A称为level 0备份,B称为level 1备份。
启用块变化跟踪可以加快level 1备份的效率:
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING;
不启用BLOCK CHANGE TRACKING,也可以进行增量备份,但需要扫描数据文件,查找变更的数据块。
连接登录:
和sqlplus类似,rman工具也可以本地或远程登录它要操作的数据库实例。
rman远程登录,实例必须至少是mount状态,但是本地登录,实例没有启动也可以。
rman登录以后,服务端会为他分配一个server process,用来做备份恢复操作。
一般以sys用户登录:
rman target /
rman target sys/123456@172.32.148.156:1521/pdb1.io
命令中的target表示连接需要备份或还原的数据库,因为rman还可以同时连接另一个数据库,用来存放元数据,称为catalog数据库:
rman target sys/123456@ORCL catalog rman/rman@catalog

RMAN元数据:
RMAN的配置信息,进行备份时,备份了哪些数据文件、哪些控制文件、参数文件,存放什么位置,恢复到什么位置,level 0备份和level 1备份的关系,这些元数据信息,默认是存储在目标数据库的controlfile里的。也可以存储到另外一个数据库里,这个数据库称为目录数据库(catalog)。
RMAN常用命令:
查看所有配置:
show all;
查看所有的备份集:
list backupset/backup;
删除备份集
delete backupset <备份集号>;
delete backupset/backup;
设置配置参数:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1;
可以在RMAN命令行对数据库进行启动停止,改变状态。
RMAN对数据库做冷备:
实例进入mount状态,RMAN连接后执行:
backup database;
这个命令对数据库的所有数据文件、控制文件、参数文件做备分。
执行 list backupset;查看备份

所有的数据文件被打包到:
/u01/app/oracle/fast_recovery_area/ORCL/backupset/2022_04_27/o1_mf_nnndf_TAG20220427T193244_k6lbgwro_.bkp
spfile和控制文件被打包到:
/u01/app/oracle/fast_recovery_area/ORCL/autobackup/2022_04_27/o1_mf_s_1103139179_k6lbhd3d_.bkp
默认把RMAN备份、归档日志、controlfile和联机日志的镜像,存储到db_recovery_file_dest指向的目录,这在dbca建库时指定。
如果只启用一个 channel,默认会把所有备份的 datafile 放入到一个 backupset 里, 并且生成一
个备份片 backup piece(就是一个文件,例如前面的o1_mf_s_1103139179_k6lbhd3d_.bkp)。使用 section size 时,一个 backup set 中可以包含多个 backup piece。
channel :目标库和存储设备之间备份恢复通道(服务进程) 默认最少启动一个 channel,
可同时启动多个 channel 并发操作。
backup database命令也可以指定备份目录,例如:
backup database format='/u01/backup/rman/prod.bak'
RMAN会在元数据里记下备份集放在哪里的。
mount状态下,也可以单独备份表空间、数据文件、归档日志、控制文件,参数文件:
backup tablespace system, users; (可备份一个或同时备份多个表空间)
backup datafile 3,5; (可备份一个或同时备份多个数据文件)
backup archivelog all;
backup current controlfile;
backup spfile;
这些命令都可以加上format子句指定备份目录。
如果设置了CONFIGURE CONTROLFILE AUTOBACKUP ON;
上述操作会自动备份控制文件和参数文件。
在CDB环境中,还可以单独备份某个PDB:
RMAN> BACKUP PLUGGABLE DATABASE pdb1 FORMAT '/backup/pdb1_%U.bkp';
RMAN> RESTORE PLUGGABLE DATABASE pdb1;
RMAN> RECOVER PLUGGABLE DATABASE pdb1;
增量备份:
backup incremental level 1 database;
增量备份增加了incremental level 1,如果之前没有全量备份,这次就是全量备份。
RMAN对数据库做热备:
如果开启了归档日志,就不必在mount状态下备份,在open状态下也可以备份,命令和上文一样,不再罗列。
注意,无论冷备还是热备,RMAN备份都是不备份联机日志的,因为:
1、RMAN备份时会归档当前联机日志。
2、恢复时是不使用备份的联机日志的,恢复时如果当前联机日志可用就用当前联机日志做完全恢复,如果不可用,就用归档日志做不完全恢复。
RMAN不备份online redo log_lovely可爱欧辰的博客-优快云博客
RMAN完全恢复:
哪些情况下,可以用RMAN做完全恢复呢?
只要当前联机日志完整、存在完整备份(数据文件、控制文件、参数文件)、备份到当前联机日志的归档日志连续,那即使当前数据文件、控制文件、参数文件都损坏丢失,都可以做完全恢复。
完全恢复不会进入新的 incarnation(时间线)。
恢复步骤:
1、启动到mount状态,如果参数文件损坏,还原参数文件,如果控制文件损坏,还原控制文件:
RMAN> restore spfile;
RMAN> restore spfile from '<备份的控制文件路径>';
RMAN> restore controlfile;
RMAN> restore controlfile from '<备份的控制文件路径>';
-- 在RMAN中可以执行启动停止命令
RMAN> startup mount
2、还原数据库文件,就是从备份重建数据文件,覆盖掉损坏的:
-- 还原整个数据库(所有数据文件)
restore database;
-- 还原数据文件(使用数据文件编号)
restore datafile 1;
-- 还原表空间(使用表空间名)
restore tablespace sysaux;
3、恢复
恢复就是对前一步还原的数据文件,应用归档日志和当前联机日志,也可以从三个级别恢复:数据库、表空间、数据文件,如果不确定,就从数据库级别恢复。
对于完全恢复,recover后面不需要其它从句:
recover database;
recover tablespace users;
recover datafile 6;
对于表空间和数据文件的恢复,如果不涉及关键数据文件,即不影响实例open,则可以先使表空间或数据文件脱机,还原和恢复后,再联机,例如:
# 恢复非关键表空间
sql 'alter tablespace users offline';
restore tablespace users;
recover tablespace user;
sql 'alter tablespace users online';
# 恢复非关键数据文件
sql 'alter database datafile 7 offline';
restore datafile 7;
recover datafile 7;
sql 'alter database datafile 7 online';
4、open数据库
恢复成功就可以open数据库了。
alter database open;
RMAN不完全恢复:
不完全恢复,总结起来,就两种情况:
1、联机日志损坏,尽可能多的恢复事务。
RMAN> startup mount
RMAN> restore database;
# 从可用的联机日志,能恢复多少恢复多少
RMAN> recover database until available redo;
RMAN> alter database open resetlogs;
与完全恢复不同的地方就是:恢复命令增加了 until available redo,open时增加了resetlogs;
2、联机日志没有损坏,数据库回退到过去某个时间点或SCN或日志LSN(日志变更号)。
一个按时间点恢复的例子如下:
RMAN> startup mount;
# 要先设置时间格式
RMAN> sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"';
# 如果有多个备份,有的备份在时间点之前,有的在之后,
# 就需要指定这个时间点之前的备份,否则下面recover时会报错。
RMAN> restore database until time='2022-04-28 13:00:00';
# 应用redo日志到这个时间点
RMAN> recover database until time='2022-04-28 13:00:00';
RMAN> alter database open resetlogs;
前提是有一个这个时间点之前的数据库备份。完成这次恢复后,因为使用了resetlogs,每当做完一次不完全恢复,数据库状态就进入一个新的incarnation,所以这次备份之后要做一次全备(backup database)。
如果恢复(A)完成之后,想再次恢复到A之前的时间点,就需要修改incarnation(时间线)了,
list incarnation;

reset database to incarnation 10;
RMAN管理归档日志:
归档日志太多,或者因为不连续,有一些已经不能使用,就需要删除,但是直接删除文件是不够的,还应该删除controlfile中记录的归档日志路径。
使用RMAN可以同时删除归档文件和控制文件记录,例如:
rman target /
list archivelog all;
# 按照序号删除
delete archivelog until sequnce n;
# 删除7天前和更早的归档
delete archivelog all completed before 'sysdate-7';
# 删除所有
delete archivelog all;
2394

被折叠的 条评论
为什么被折叠?



