手工完全恢复

手工完全恢复

1 基本概念

1.1 完全恢复的步骤

用户管理的数据库完全恢复:

  • 将数据库恢复到最新的SCN
  • 可以一次处理整个数据库,也可以一次处理一个数据文件或表空间
  • 需要当前控制文件
  • 需要有待恢复的所有文件的备份·需要到目前为止的所有归档日志

restore:OS拷贝命令还原所有或部分datafile

recoverSQL*PLUS利用归档日志当前的redo日志做恢复

1.2 完全恢复可以基于三个级别

recover database        所有数据文件损坏,或包括大部分datafile丢失,一般在mount状态完成

recover tablespace     非关键表空间损坏,表空间某些数据文件不能访问,一般在open下完成

recover datafile           单一或少数数据文件损坏,可以在mountopen状态完成

1.3 什么是关键文件

如果关键文件损坏,数据库将不能维持在open状态,或崩溃或死机

关键文件:

  • system file
  • undotbs file
  • control file
  • current log file

1.4 恢复过程可以查看的视图

1v$recover_file       查看需要恢复的datafile

2v$recovery_log     查看recover需要的redo日志

3v$archived_log     查看已经归档的日志

2 适用场景实验

有一套datafile全备使用当前控制文件自上次备份以来的归档日志和当前联机日志是完整

recover恢复要用到redo日志、归档日志,模拟故障实验时不要删除日志

3 recover database

所有或大部分数据文件损坏,mountopen下进行恢复。如果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;

 

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;

 

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;

 

recover datafile【实验】

database mountopen状态)

恢复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;

posted @ 2021-06-27 15:34  chchcharlie、  阅读(115)  评论(0编辑  收藏  举报