手工不完全恢复

手工不完全恢复

1 基本概念

1.1 不完全恢复的特点

  • 必须停机,在mount下运用重做日志
  • 必须以sysdba身份连接进行不完全恢复
  • 让整个database回到过去某个时间点,不能避免数据丢失

1.2 不完全恢复(Incomplete recover)适用环境

  • 在过去的某个时间点重要的数据被破坏
  • 最小化备份测试
  • 在做完全恢复时,丢失了部分归档日志或当前online redo log(考点)
  • 当误删除了表空间时(使用备份的控制文件)

1.3 不完全恢复的基本类型

  • 基于时间点(until time)                                  使整个数据库恢复到过去的一个时间点前
  • 基于scnuntil change)                                  使整个数据库恢复到过去的某个SCN
  • 基于cancel(until cancel)                               使整个数据库恢复到归档日志或当前日志的断点前(断档恢复)
  • 基于误删除表空间(使用备份的controlfile)    使整个数据库恢复到误删除表空间前

 

2 不完全恢复的步骤

1)利用logminer工具,找出在某个时间点所作的DDL或DML误操作(包括:时间点、scn、sql语句)

2)做当前数据库的最新全备

3)使用还原点前的备份还原数据文件

4)运用日志恢复所有数据文件,前滚至需要的时间点前停止

5)使用resetlogs方式打开数据库

要执行用户管理的不完全恢复,请按以下步骤进行操作:

  1. 关闭数据库
  2. 还原数据文件
  3. 装载数据库
  4. 恢复数据库
  5. 使用RESETLOGS选项打开数据库

 

3 使用当前控制文件做不完全恢复【实验】

3.1 基于时间点的不完全恢复

恢复过去某个时间点误删除的table

3.1.1 环境准备

查看当前日志组

select group#,sequence#,status from v$log;

3.1.2 模拟误删除了test表,drop table purge

drop table test purge;

alter system switch logfile;
/
select group#,sequence#,status from v$log;

col name for a60
select sequence#,name from v$archived_log;

3.1.3 logmnr挖误操作时间(新方法)

通过logmr找出误操作的ddl命令的timestampscn,然后做不完全恢复

3.1.3.1 创建目录存放需要的数据字典信息
mkdir /u01/logmnr
ls -ld /u01/logmnr/

CREATE DIRECTORY "dir" AS '/u01/logmnr';

3.1.3.2 添加database补充日志

如果不添加补充日志,最后查询结果的username字段会显示unknown或者为空值

alter database add supplemental log data;

3.1.3.3 通过logmnr包指定使用的目录
EXECUTE dbms_logmnr_d.build(dictionary_location=>'dir',dictionary_filename=>'dictionary.ora',options => dbms_logmnr_d.store_in_flat_file);

3.1.3.4 向logmnr工具添加分析的日志

第一次添加使用下面命令:

execute dbms_logmnr.add_logfile(logfilename=>'/u01/arch/arch_ORCL_1_16_1069527136.dbf',options=>dbms_logmnr.new)

注意日志文件选择第一次切换日志生成的:/u01/arch/arch_ORCL_1_16_1069527136.dbf

第二次添加使用下面命令(此处只挖掘一个日志,故第二次不再执行,命令如下,修改日志文件名称即可):

exec dbms_logmnr.add_logfile(logfilename=>'/u01/arch/arch_ORCL_1_17_1069527136.dbf',options=>dbms_logmnr.addfile);

注意不仅可以添加归档日志(select name from v$archived_log),也可以添加联机重做日志(online redo logfile,使用命令select member,type from v$logfile;查询)

3.1.3.5 启动logmnr工具分析日志
exec dbms_logmnr.start_logmnr(dictfilename=>'/u01/logmnr/dictionary.ora',options=>dbms_logmnr.ddl_dict_tracking);

3.1.3.6 查看日志挖掘的结果
select username,scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') time,sql_redo from v$logmnr_contents where lower(sql_redo) like 'drop table test%';

挖掘出来删除时候的scn号为2791824,时间为2021-06-07 16:17:42

3.1.3.7 结束日志挖掘
execute dbms_logmnr.end_logmnr;

3.1.4 关闭数据库,准备做不完全恢复

shutdown abort;

3.1.5 还原所有备份的数据文件

cp /u01/backup/orcl/cold/*.dbf /u01/app/oracle/oradata/ORCL
ll /u01/app/oracle/oradata/ORCL

3.1.6 根据log miner提供的信息,做基于时间点(SCN)的不完全恢复

startup
select file#,name,checkpoint_change# from v$datafile;
select file#,name,checkpoint_change# from v$datafile_header;

前面挖掘出来的scn号为2791824时间为2021-06-07 16:17:42

接下来开始恢复

recover database until change 2791824;

3.1.7 resetlogs方式打开数据库

alter database open;
alter database open resetlogs;

3.1.8 验证数据表

select * from test;

3.1.9 resetlogs后日志sequence重置

select group#,sequence#,status from v$log;

alter system switch logfile;
alter system archive log current;
select sequence#,name from v$archived_log;

3.2 基于取消的不完全恢复

当前日志组损坏,造成数据库崩溃

3.2.1 open resetlogs后做一次热备份备用

@/u01/backup/orcl/hot.sql

3.2.2 创建测试表

create table scott.t1(id number);
insert into scott.t1 values(1000);
commit;

alter system archive log current;

insert into scott.t1 values(2000);
commit;
select * from scott.t1;

第一行对应日志已经归档,第二行对应日志在当前日志中,没有归档

3.2.3 删除当前日志组,shutdown abort关库

select group#,sequence#,status from v$log;

rm /u01/app/oracle/oradata/ORCL/redo02.log

shutdown abort;

3.2.4 转储所有数据文件

cd /u01/app/oracle/oradata/ORCL
cp /u01/backup/orcl/cold/*.dbf .
ll

startup

3.2.5 recover database【报错】

redo丢失,报错无法恢复

recover database

3.2.6 recover database until cancel

recover database until cancel;

3.2.7 open resetlogs开库

alter database open resetlogs;

3.2.8 验证表数据

select * from scott.t1;

注意虽然第二次插入数据(ID=2000)也进行了commit,但是未切换日志,而且正好redo02日志文件丢失,数据也丢失,只能恢复到这个阶段(不完全恢复

 

4 使用备份的控制文件做不完全恢复【实验】

4.1 当前控制文件丢失、使用冷备恢复

4.1.1 环境准备:冷备数据库

清理表空间,手工做冷备

select name from v$datafile;
select name from v$tempfile;
select name from v$controlfile;
select member from v$logfile;

正常关库

shutdown immediate

备份数据文件、控制文件

cd /u01/app/oracle/oradata/ORCL/
cp *.dbf /u01/backup/orcl/cold
cp *.ctl /u01/backup/orcl/cold

备份参数文件、密码文件

cd $ORACLE_HOME/dbs
cp orapworcl /u01/backup/orcl/cold
cp spfileorcl.ora /u01/backup/orcl/cold

查看备份文件

ls -lht /u01/backup/orcl/cold

4.1.2 开库,模拟备份后续事务操作

开库、创建表、第一次插入数据、提交、切日志组

startup
drop table scott.test purge;
create table scott.test as select * from scott.emp;
insert into scott.test select * from scott.emp;
commit;
select count(*) from scott.test;
alter system switch logfile;

第二次插入数据,提交,不切日志组

insert into scott.test select * from scott.emp;
commit;
select count(*) from scott.test;

第三次插入数据,不提交,模拟实例崩溃

insert into scott.test select * from scott.emp;
select count(*) from scott.test;
shutdown abort;

4.1.3 mv日志文件备用(模拟日志文件丢失。为了后面模拟归档文件、日志组文件未损坏时进行完全恢复)

cd /u01/app/oracle/oradata/ORCL/
mv redo01.log redo01.log.bak
mv redo02.log redo02.log.bak
mv redo03.log redo03.log.bak

4.1.4 模拟介质故障,删除所有数据文件、控制文件,日志文件已丢失

cd /u01/app/oracle/oradata/ORCL/
rm -rf *.dbf;rm -rf *.ctl
ll

如果参数文件、密码文件损坏,可以利用备份恢复,若备份中没有,可以重建密码文件、参数文件

启动数据库实例报错

startup

4.1.5 转储(还原)控制文件、数据文件

cd /u01/backup/orcl/cold
cp *.ctl /u01/app/oracle/oradata/ORCL/
cp *.dbf /u01/app/oracle/oradata/ORCL/

alter database mount;
select file#,checkpoint_change#,last_change# from v$datafile;
select file#,checkpoint_change# from v$datafile_header;

由于还原使用的是冷备(一致性备份)的数据文件和控制文件,这种状态下是可以open开库的,但开库只能回到备份时的状态,缺少了recover利用日志进行恢复的步骤

4.1.6 read only开库查看

alter database open read only;
select count(*) from scott.test;

缺少利用日志recover恢复的过程,备份之前有2行数据,但是备份之后的事务数据丢失

关库,重新启动到mount状态

shutdown immediate;
startup mount;

4.1.7 使用旧的控制文件进行恢复

recover database using backup controlfile;

recover database using backup controlfile until cancel;
alter database open resetlogs;

由于当前日志文件损坏,使用旧的控制文件做基于取消的不完全恢复

select count(*) from scott.test;

第二次、第三次插入操作已经提交,但对应日志在当前日志组中的数据丢失

4.1.8 模拟归档日志文件、redo日志文件均未损坏

shutdown abort;

cd /u01/app/oracle/oradata/ORCL/
rm *.ctl;rm *.dbf;rm *.log

mv redo01.log.bak redo01.log
mv redo02.log.bak redo02.log
mv redo03.log.bak redo03.log

这些是shutdown abort时的日志组文件,包含了插入并提交数据后42行状态的当前日志组

4.1.9 转储数据文件、控制文件

cd /u01/backup/orcl/cold
cp -p *.ctl /u01/app/oracle/oradata/ORCL/
cp -p *.dbf /u01/app/oracle/oradata/ORCL/
ls -lht /u01/app/oracle/oradata/ORCL/

数据文件和控制文件是备份时的,redo日志文件是实例崩溃时的

4.1.10 利用旧的控制文件进行恢复

startup mount;
select file#,checkpoint_change#,last_change# from v$datafile;
select file#,checkpoint_change# from v$datafile_header;

recover database using backup controlfile;

利用归档日志进行了recover

继续追加redo日志组文件

select member from v$logfile;

recover database using backup controlfile;
recover database using backup controlfile;
recover database using backup controlfile;

select file#,checkpoint_change#,last_change# from v$datafile;
select file#,checkpoint_change# from v$datafile_header;

由于归档日志连续,redo日志文件正常,从备份到实例崩溃之前所有日志均存在最终利用旧的控制文件(备份中的)进行了完全恢复

alter database open resetlogs;
select count(*) from scott.test;

第二次插入数据操作提交,数据为42行,第三次插入数据操作未提交,故操作已回滚

归档日志连续、当前日志组文件正常,最终实现完全恢复,保证commit的数据没有丢失

4.2 利用旧控制文件和备份恢复新建的表空间

4.2.1 环境准备,利用tar命令打包冷备数据库

shutdown immediate;

cd /u01/app/oracle/oradata/ORCL/
cp *.dbf /u01/backup/orcl/cold
cp *.ctl /u01/backup/orcl/cold
cd $ORACLE_HOME/dbs
cp orapworcl /u01/backup/orcl/cold
cp spfileorcl.ora /u01/backup/orcl/cold
ll /u01/backup/orcl/cold

使用tar命令打包备份数据文件、控制文件、参数文件、密码文件

 tar -zcvf /u01/backup/orcl/cold/ORCLbackup.tar.gz *

4.2.2 模拟备份后新建表空间、事务操作

起库

第一次:建表,切日志组

startup
create table scott.t2 as select * from scott.emp;
select group#,status from v$log;
alter system switch logfile;

第二次:创建表空间,创建表,切日志组

create tablespace t1_tbs datafile '/u01/app/oracle/oradata/ORCL/t1_tbs.dbf' size 50m;
create table scott.t3 tablespace t1_tbs as select * from scott.dept;
alter system switch logfile;

第三次:建表,切日志组,插入数据,提交,不切日志组

create table scott.t4 as select * from scott.dept;
alter system switch logfile;
insert into scott.t4 select * from scott.dept;
commit;

select count(*) from scott.t2;
select count(*) from scott.t3;
select count(*) from scott.t4;

4.2.3 模拟实例崩溃,删除所有数据文件、控制文件、日志文件

关库、删除文件

shutdown immediate

cd /u01/app/oracle/oradata/ORCL/
rm -rf *
ll

4.2.4 tar解包转储数据文件、控制文件

cd /u01/backup/orcl/cold
tar -zxvf ORCLbackup.tar.gz -C /u01/app/oracle/oradata/ORCL/
ll /u01/app/oracle/oradata/ORCL/

4.2.5 mount状态查看

startup mount;
select file#,name,checkpoint_change#,last_change# from v$datafile;
select file#,name,checkpoint_change# from v$datafile_header;

4.2.6 使用旧的控制文件做基于取消的不完全恢复

recover database using backup controlfile until cancel;

提示找不到数据文件t1_tbs.dbf

col name for a60
select file#,checkpoint_change#,last_change#,name from v$datafile;
select file#,checkpoint_change#,name from v$datafile_header;

4.2.7 创建空数据文件

alter database create datafile '/u01/app/oracle/product/19.3.0/dbhome_1/dbs/UNNAMED00005' as '/u01/app/oracle/oradata/ORCL/t1_tbs.dbf';

ll /u01/app/oracle/oradata/ORCL/

select file#,checkpoint_change#,last_change#,name from v$datafile;
select file#,checkpoint_change#,name from v$datafile_header;

4.2.8 recover database

recover database using backup controlfile until cancel;
recover database using backup controlfile until cancel;

alter database open resetlogs;

4.2.9 验证表数据

select count(*) from scott.t2;
select count(*) from scott.t3;
select count(*) from scott.t4;

不完全恢复智能回复到切换日志之前

posted @ 2021-06-27 19:03  chchcharlie、  阅读(138)  评论(0编辑  收藏  举报