手工完全恢复
手工完全恢复
1 基本概念
1.1 完全恢复的步骤
用户管理的数据库完全恢复:
- 将数据库恢复到最新的SCN
- 可以一次处理整个数据库,也可以一次处理一个数据文件或表空间
- 需要当前控制文件
- 需要有待恢复的所有文件的备份·需要到目前为止的所有归档日志
restore:OS拷贝命令还原所有或部分datafile
recover:SQL*PLUS利用归档日志和当前的redo日志做恢复
1.2 完全恢复可以基于三个级别
recover database 所有数据文件损坏,或包括大部分datafile丢失,一般在mount状态完成
recover tablespace 非关键表空间损坏,表空间某些数据文件不能访问,一般在open下完成
recover datafile 单一或少数数据文件损坏,可以在mount或open状态完成
1.3 什么是关键文件
如果关键文件损坏,数据库将不能维持在open状态,或崩溃或死机
关键文件:
- system file
- undotbs file
- control file
- current log file
1.4 恢复过程可以查看的视图
1)v$recover_file 查看需要恢复的datafile
2)v$recovery_log 查看recover需要的redo日志
3)v$archived_log 查看已经归档的日志
2 适用场景实验
有一套datafile全备,使用当前控制文件,自上次备份以来的归档日志和当前联机日志是完整
recover恢复要用到redo日志、归档日志,模拟故障实验时不要删除日志
3 recover database
所有或大部分数据文件损坏,mount或open下进行恢复。如果system01.dbf 损坏,只能mount下恢复
OS:
使用cp还原受损的dbf(不一定是全部,v$recover_file记录的都需要还原)
SQLPLUS:
recover database;
alter database open;
4 recover database【实验】
查看当前日志组
select group#,sequence#,status from v$log;
4.1 创建测试表
建表、插入数据、提交
create table test(id number); insert into test values(1); commit;
切日志组
alter system switch logfile; select group#,sequence#,status from v$log;
插入第二行,提交,不切日志组
insert into test values(2); commit;
插入第三行,不提交
insert into test values(3);
4.2模拟介质故障,删除所有.dbf数据文件
shutdown abort
cd /u01/app/oracle/oradata/ORCL/ rm *.dbf ll
4.3 启动database,报错!
startup
select file#,error from v$recover_file;
select status from v$instance;
4.4 restore还原数据文件(转储)
cp /u01/backup/orcl/cold/*.dbf /u01/app/oracle/oradata/ORCL/ ll
4.5 open databasa报错
alter database open;
4.6 比较控制文件和数据文件头的SCN
select file#,checkpoint_change# from v$datafile; select file#,checkpoint_change# from v$datafile_header;
4.7 recover database恢复数据库
recover database;
需要使用归档,指定auto
4.8 再次查看SCN
select file#,checkpoint_change# from v$datafile; select file#,checkpoint_change# from v$datafile_header;
4.9 open打开数据库并使用scott用户检查表中数据
alter database open;
select * from test;
5 recover tablespace
(针对表空间的非关键数据文件损坏,一般是open下进行)
OS:
使用cp还原该表空间XXX下的所有数据文件
SQLPLUS:
①alter tablespace XXX offline;
②recover tablespace XXX;
③alter tablespace xxx online;
6 recover tablespace【实验】
(状态:database open)
针对的是非关键表空间的损坏,基于表空间的完全恢复实际上还是对其下的datafile的恢复
模拟这种情形非常实用,通常是某个非关键表空间下的数据文件受损,但并没有造成Oracle崩溃,我们只需针对个别有问题的tablespace去做单独的在线恢复操作,也就是说恢复时数据库整体是online的,而局部表空是offline的,数据库不需要shutdown
恢复表空间(删除了tablespace下的所有的datafile)
6.1 测试表插入数据
truncate table test; insert into test values(1); commit; insert into test values(2); select * from test;
select * from scott.test;
6.2 模拟表空间损坏
数据库open下,直接删除表空间下的数据文件
select table_name,tablespace_name from user_tables where table_name='TEST';
cd /u01/app/oracle/oradata/ORCL rm users01.dbf
6.3 查证该表空间上的表
清除缓存data buffer
alter system flush buffer_cache;
访问test表,因内存里已清除了buffer块,只好去做物理读,所以报错
select * from test;
6.4 查看scn的情况
select file#,name,checkpoint_change# from v$datafile; select file#,name,checkpoint_change# from v$datafile_header;
6.5 将test表空间置为offline状态
alter tablespace users offline; alter tablespace users offline immediate;
immediate参数使表空间能立即脱机,不对Oracle的任何数据文件做检查
6.6 数据库open下,使用备份还原这个表空间下所有数据文件
cp /u01/backup/orcl/cold/users01.dbf /u01/app/oracle/oradata/ORCL/ ll
6.7 恢复tablespace
recover tablespace users;
select file#,name,checkpoint_change# from v$datafile_header;
6.8 将test表空间置为online状态
整个恢复过程数据库一直是open状态
alter tablespace users online; select file#,name,checkpoint_change# from v$datafile_header; select tablespace_name,status from dba_data_files;
6.9 验证scott表数据
select * from test;
7 recover datafile
(单个或几个数据文件损坏,关键文件在mount状态下进行,非关键文件在open状态下进行)
第一种情形:
OS:
使用cp还原相关的关键数据文件(mount)
SQLPLUS:
①recover datafile 6,8;
②alter database open;
第二种情形:
OS:
使用cp还原相关的非关键数据文件(open)
SQLPLUS:
①alter database datafile 6,8 offline;
②recover datafile 6,8;
③alter database datafile 6,8 online;
8 recover datafile【实验】
(database mount或open状态)
恢复datafile,同范例2不同的是模拟UNDO文件损坏:因UNDO数据文件也是关键文件,所以只能在mount状态下恢复
8.1 模拟环境:插入数据提交,删除数据不提交
truncate table test; insert into test values(10); insert into test values(20); commit; select * from test;
删除test表中数据,不提交。老值在undo里
delete from test;
8.2 shutdown abort关闭数据库,删undotbs.dbf
shutdown abort;
删除undo datafile
cd /u01/app/oracle/oradata/ORCL rm undotbs01.dbf ll
8.3 启动数据库到mount
startup mount; select file#,name,checkpoint_change# from v$datafile; select file#,name,checkpoint_change# from v$datafile_header; select file#,error from v$recover_file;
8.4 转储(还原)UNDO数据文件
cp /u01/backup/orcl/cold/undotbs01.dbf . ll
8.5 恢复undo数据文件
完成介质恢复media recovry
recover datafile 4;
8.6 打开数据库并验证数据(会完成UNDO表空间数据的回滚)
alter database open;
select * from test;