本文所说的备份恢复,是指物理方式的备份恢复。对数据库的备份和恢复,主要是指三大核心文件(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
恢复:
完全恢复:
完全恢复是一种比较特殊的场景,只看字面会有误解,这里说的完全恢复是这样一种场景:
1、controlfile、online redo log都没有损坏,只有datafile损坏,使用备份和归档日志,恢复损坏的datafile。
2、有一份之前做的备份(冷备或热备都可以),且自这次备份以来的归档日志和当前联机日志是连续完整的。
一般是一个正在运行的数据库系统,突然由于某种原因,某数据文件损坏了,数据库宕机或不能正常工作。此时就要尝试用之前备份的数据文件,替换掉损坏的数据文件,然后进行恢复,恢复到最新的状态。
需要关库并启动到mount状态,进行恢复操作。
恢复的状态可以查询SCN获得:
select file#,checkpoint_change# from v$datafile;
select file#,checkpoint_change# from v$datafile_header;
恢复可以是整个数据库级别的,即替换所有数据文件,并且恢复。
也可以是表空间级别的,即只替换某个表空间所有的数据文件,并且恢复。
也可以是数据文件级别的,即只替换某个数据文件,并且恢复。
要在实例的mount状态下,进行恢复操作。
数据库级别:
startup mount;
用备份的数据文件替换所有数据文件。
recover database;
alter database open;
表空间级别:
关键表空间,在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;
不完全恢复:
完全恢复和不完全恢复,的本质区别,是已提交的数据是否丢失。
其中关键的关键是联机日志是否完整,没有损坏。无论是否使用当前控制文件,只要归档日志与备份连续,联机日志没有损坏,都可以进行完全恢复。
除此之外,不完全恢复的一个重要场景是可以恢复到过去的某个时间点的数据库状态。
无论使用当前控制文件还是备份控制文件,都可以恢复到过去某个时间点,都可以进行完全恢复(完全恢复的关键是联机日志是否完整),都可以做基于取消不完全恢复。唯一区别是,恢复命令是否有using backup controlfile。
当然,需要过去的数据文件和控制文件的备份,和完整连续的归档日志。
需要关库并启动到mount状态,进行恢复操作。
不完全恢复主要是指下面几种场景的恢复:
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、数据库由于种种原因,联机日志组损坏,启动失败,想要尽可能多的对数据库进行恢复,达到一致性状态,能够启动。这种情况,控制文件没有损坏,可以使用当前控制文件,进行基于取消的恢复。
恢复步骤:
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; 打开数据库。
(注意有一部分数据已经丢失,就是损坏联机日志中,没有归档的部分)