您的位置:首页 > 数据库 > Oracle

oracle常规恢复实例

2016-11-23 15:25 357 查看

----完全恢复案例

1. 数据库关闭时的恢复(冷备)

SQL> shutdown immediate
SQL> select file#,name from v$dbfile;
[oracle@centos6 cold]$ cp -rf /u01/app/oracle/oradata/orcl/* /home/oracle/backup/cold #冷备整个数据文件 r表示递归复制 f表示强制执行

SQL> conn test/oracle;
SQL> create table t(id int,name varchar2(30));
SQL> insert into t values(1,'TEST');  #创建测试数据
SQL> commit;

SQL> alter system switch logfile; #切换日志

[oracle@centos6 orcl]$ rm system01.dbf #删除数据文件
SQL> shutdown abort #异常关机
SQL> startup #打开数据库 ORA-01157 ORA-01110
RACLE instance started.
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/u01/app/oracle/oradata/orcl/system01.dbf'

[oracle@centos6 orcl]$ cp /home/oracle/backup/cold/system01.dbf /u01/app/oracle/oradata/orcl/system01.dbf #还原 拷贝冷备文件到数据库目录
SQL> recover datafile 1; #恢复
SQL> alter database open; #打开数据库

2. 数据库打开时的恢复,以用户数据的表空间为例

SQL> create tablespace tbs1 datafile '/u01/app/oracle/oradata/orcl/tbs01.dbf' size 10m;
SQL> conn test/oracle
SQL> create table test(id int,name varchar2(30));
SQL> insert into test values(1,'AAAAA'); #创建测试数据
SQL> commit;  

SQL> alter tablespace tbs1 begin backup; #热备
SQL> ! cp /u01/app/oracle/oradata/orcl/tbs_02.dbf /home/oracle/backup/hot/tbs_02.dbf
SQL> alter tablespace tbs1 end backup; 

SQL> insert into test values(2,'BBBBB'); #插入一条数据
SQL> commit;

[oracle@centos6 orcl]$ rm /u01/app/oracle/oradata/orcl/tbs01.dbf

SQL> alter database datafile 5 offline; #使数据文件脱机
SQL> ! cp /home/oracle/backup/hot/tbs01.dbf /u01/app/oracle/oradata/orcl/tbs01.dbf #还原
SQL> recover datafile 5; #恢复
Media recovery complete.
SQL> alter database datafile 5 online;
SQL> alter database open;

3. 控制文件的恢复

a. 控制文件没有全坏,有一个是好的

SQL> ! rm /u01/app/oracle/oradata/orcl/control02.ctl
SQL> ! rm /u01/app/oracle/oradata/orcl/control03.ctl

SQL> shutdown abort;
SQL> startup
ORA-00205: error in identifying control file, check alert log for more info

SQL> ! cp /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/oradata/orcl/control02.ctl
SQL> ! cp /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/oradata/orcl/control03.ctl

SQL> alter database mount;
SQL> alter database open;

b. 控制文件全部损坏,但损坏前有备份(二进制)

SQL> alter database backup controlfile to '/home/oracle/backup/controlfile/control.bin'; #备份控制文件

SQL> alter system checkpoint; #检查点操作

SQL> shutdown abort;
SQL> startup
ORA-00205: error in identifying control file, check alert log for more info

SQL> ! cp /home/oracle/backup/controlfile/control.bin /u01/app/oracle/oradata/orcl/control01.ctl #还原控制文件
SQL> ! cp /home/oracle/backup/controlfile/control.bin /u01/app/oracle/oradata/orcl/control02.ctl
SQL> ! cp /home/oracle/backup/controlfile/control.bin /u01/app/oracle/oradata/orcl/control03.ctl

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

SQL> select checkpoint_change# from v$database; #查看控制文件和数据文件头部的检查点信息
SQL> select checkpoint_change# from v$datafile;
SQL> select checkpoint_change# from v$datafile_header;

SQL> recover database using backup controlfile
ORA-00279: change 1216447 generated at 11/08/2016 11:01:14 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2016_11_08/o1_mf_1_54_%u_.ar
c
ORA-00280: change 1216447 for thread 1 is in sequence #54

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/oradata/orcl/redo03a.log   #一个一个试
Log applied.
Media recovery complete.

SQL> select checkpoint_change# from v$datafile; #验证两者检查点信息
SQL> select checkpoint_change# from v$datafile_header;
SQL> alter database open resetlogs;

c. 所有控制文件损坏,但损坏前有备份(文本)

SQL> alter database backup controlfile to trace as '/home/oracle/backup/controlfile/control.txt'; #文本形式备份控制文件

[oracle@centos6 orcl]$ rm control*
SQL> shutdown abort;

[oracle@centos6 controlfile]$ cp control.txt control.sql
[oracle@centos6 controlfile]$ vim control.sql #重构控制文件
[oracle@centos6 controlfile]$ cat control.sql
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 5
    MAXLOGMEMBERS 5
    MAXDATAFILES 100
    MAXINSTANCES 1
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/u01/app/oracle/oradata/orcl/redo01a.log',
    '/u01/app/oracle/oradata/orcl/redo01b.log'
  ) SIZE 100M BLOCKSIZE 512,
  GROUP 2 (
    '/u01/app/oracle/oradata/orcl/redo02a.log',
    '/u01/app/oracle/oradata/orcl/redo02b.log'
  ) SIZE 100M BLOCKSIZE 512,
  GROUP 3 (
    '/u01/app/oracle/oradata/orcl/redo03a.log',
    '/u01/app/oracle/oradata/orcl/redo03b.log'
  ) SIZE 100M BLOCKSIZE 512
-- S
1011b
TANDBY LOGFILE
DATAFILE
  '/u01/app/oracle/oradata/orcl/system01.dbf',
  '/u01/app/oracle/oradata/orcl/sysaux01.dbf',
  '/u01/app/oracle/oradata/orcl/undotbs01.dbf',
  '/u01/app/oracle/oradata/orcl/users01.dbf',
  '/u01/app/oracle/oradata/orcl/tbs01.dbf',
  '/u01/app/oracle/oradata/orcl/undo01.dbf'
CHARACTER SET ZHS16GBK
;

RECOVER DATABASE

ALTER SYSTEM ARCHIVE LOG ALL;

ALTER DATABASE OPEN;

SQL> @/home/oracle/backup/controlfile/control.sql #创建控制文件
ORACLE instance started.

Total System Global Area  751595520 bytes
Fixed Size                  2257032 bytes
Variable Size             490737528 bytes
Database Buffers          255852544 bytes
Redo Buffers                2748416 bytes

Control file created.

Media recovery complete.
ALTER SYSTEM ARCHIVE LOG ALL
*
ERROR at line 1:
ORA-00271: there are no logs that need archiving

Database altered.

d. 所有控制文件损坏,有备份,但控制文件中不包含数据文件(新建表空间),联机日志中有

SQL> alter database backup controlfile to '/home/oracle/backup/controlfile/control.bin'; #备份控制文件

SQL> create tablespace tbs2 datafile '/u01/app/oracle/oradata/orcl/tbs02.dbf' size 10m; #新建表空间
SQL> create table tbs2(id int,name varchar2(30));
SQL> insert into tbs2 values(1,'AAAAA'); #测试数据
SQL> commit;

[oracle@centos6 orcl]$ rm *.ctl #删除所有的控制文件
SQL> shutdown abort;

[oracle@centos6 orcl]$ cp /home/oracle/backup/controlfile/control.bin /u01/app/oracle/oradata/orcl/control01.ctl #利用备份还原控制文件
[oracle@centos6 orcl]$ cp /home/oracle/backup/controlfile/control.bin /u01/app/oracle/oradata/orcl/control02.ctl
[oracle@centos6 orcl]$ cp /home/oracle/backup/controlfile/control.bin /u01/app/oracle/oradata/orcl/control03.ctl

SQL> recover database using backup controlfile;
ORA-00279: change 1236788 generated at 11/08/2016 11:34:03 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2016_11_08/o1_mf_1_2_%u_.arc
ORA-00280: change 1236788 for thread 1 is in sequence #2

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/oradata/orcl/redo02a.log #使用curent的联机日志
ORA-00283: recovery session canceled due to errors
ORA-01244: unnamed datafile(s) added to control file by media recovery  #提示有一个文件不识别
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs02.dbf'
ORA-01112: media recovery not started

SQL> select file#,name from v$datafile;
             FILE#                 NAME
---------- ------------------------------------------------------------
         1 /u01/app/oracle/oradata/orcl/system01.dbf
         2 /u01/app/oracle/oradata/orcl/sysaux01.dbf
         3 /u01/app/oracle/oradata/orcl/undotbs01.dbf
         4 /u01/app/oracle/oradata/orcl/users01.dbf
         5 /u01/app/oracle/oradata/orcl/tbs01.dbf
         6 /u01/app/oracle/product/11.2.0/db_1/dbs/UNNAMED00006
         7 /u01/app/oracle/oradata/orcl/undo01.dbf
SQL> alter database rename file '/u01/app/oracle/product/11.2.0/db_1/dbs/UNNAMED00006' to '/u01/app/oracle/oradata/orcl/tbs02.dbf'; #重命名操作

SQL> recover database using backup controlfile; #更名后再次进行恢复
ORA-00279: change 1238052 generated at 11/08/2016 12:08:01 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2016_11_08/o1_mf_1_2_%u_.arc
ORA-00280: change 1238052 for thread 1 is in sequence #2

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/oradata/orcl/redo02a.log
Log applied.
Media recovery complete.

SQL> alter database open resetlogs; #以resetlogs模式打开数据库

----不完全恢复

1. 基于时间的不完全恢复

a. 误操作删除表,控制文件没有损坏

SQL> shutdown immediate #关闭数据库
[oracle@centos6 cold]$ cp /u01/app/oracle/oradata/orcl/* /home/oracle/backup/cold #冷备数据库

SQL> startup
SQL> create table t(id int,name varchar2(30));
SQL> insert into t values(1,'AAAAA'); #测试数据
SQL> commit;

SQL> select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') from dual; #记录此时时间点
TO_CHAR(SYSDATE,'YY
-------------------
2016-11-09:05:16:20

SQL> insert into t values(2,'BBBBB'); #插入另一条数据
SQL> commit;.

SQL> drop table t; # 删除表,模拟误操作

SQL> shutdown immediate #关闭数据库
[oracle@centos6 ~]$ cd /u01/app/oracle/oradata/orcl
[oracle@centos6 orcl]$ rm *.dbf #删除所有数据文件(保留控制文件和联机日志)
[oracle@centos6 orcl]$ cp -rf /home/oracle/backup/cold/*.dbf /u01/app/oracle/oradata/orcl/ #从备份还原所有数据
SQL> startup mount; #启动到mount状态
SQL> recover database until time '2016-11-09:05:16:20'; #基于时间的不完全恢复
SQL> alter database open resetlogs;

b. 误操作删除表,控制文件也损坏了

SQL> shutdown immediate
[oracle@centos6 cold]$ cp /u01/app/oracle/oradata/orcl/* /home/oracle/backup/cold #冷备数据库

SQL> startup
SQL> conn test/oracle
SQL> create table t(id int,name varchar2(30));
SQL> insert into t values(1,'AAAAA');
SQL> commit; #测试数据

SQL> select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') from dual; #查看时间点

TO_CHAR(SYSDATE,'YY
-------------------
2016-11-09:09:43:06

SQL> insert into t values(2,'BBBBB'); #再插入一条数据
SQL> commit;

SQL> drop table t; #模拟误操作

SQL> shutdown immediate
[oracle@centos6 cold]$ cd /u01/app/oracle/oradata/orcl
[oracle@centos6 orcl]$ rm *.dbf #删除数据文件
[oracle@centos6 orcl]$ rm *.ctl #删除控制文件

[oracle@centos6 orcl]$ cp /home/oracle/backup/cold/*.dbf /u01/app/oracle/oradata/orcl #还原数据文件
[oracle@centos6 orcl]$ cp /home/oracle/backup/cold/*.ctl /u01/app/oracle/oradata/orcl #还原控制文件
SQL> startup mount;
SQL> recover darabase until time '2016-11-09:09:43:06' using backup controlfile; #使用控制文件进行基于时间点的不完全恢复
SQL> alter database open resetlogs;

2. 基于cancel的不完全恢复

SQL> shutdown immediate
[oracle@centos6 cold]$ cp /u01/app/oracle/oradata/orcl/* /home/oracle/backup/cold #重新备份数据库

SQL> startup
SQL> insert into t values(1,'AAAAA');
SQL> commit;
SQL> alter system switch logfile;
SQL> insert into t values(2,'BBBBB');
SQL> commit;
SQL> select group#,status from v$log;
SQL> alter system checkpoint;

[oracle@centos6 ~]$ cd /u01/app/oracle/oradata/orcl
[oracle@centos6 orcl]$ rm * #删除所有数据文件,控制文件和日志文件

SQL> shutdown abort;
[oracle@centos6 orcl]$ cp /home/oracle/backup/cold/*.dbf /u01/app/oracle/oradata/orcl #还原数据文件和控制文件
[oracle@centos6 orcl]$ cp /home/oracle/backup/cold/*.ctl /u01/app/oracle/oradata/orcl

SQL> startup mount;
SQL> recover database until cancel using backup controlfile; #因为日志文件丢失,直接选择cancel
SQL> alter database open resetlogs;
SQL> select * from t;

----rman恢复

1. 参数文件损坏

[oracle@centos6 ~]$ rman target /
RMAN> configure controlfile autobackup on; #开启控制文件自动备份,否则spfile无法从自动备份中获取
RMAN> backup spfile;
QL> create pfile='/home/oracle/backup/spfile/pfile.ora' from spfile; #用于数据库启动到nomount状态

SQL> shutdown immediate
[oracle@centos6 dbs]$ rm spfileORCL.ora #删除spfile
[oracle@centos6 dbs]$ rm initORCL.ora   #删除pfile

SQL> startup pfile='/home/oracle/backup/spfile/pfile.ora' nomount;
RMAN> set dbid 1449842719;
RMAN> restore spfile from autobackup; #从自动备份中还原spfile
RMAN> restore spfile to '/home/oracle/backup/spfile/spfile.ora' from autobackup;

2. 控制文件损坏

RMAN> backup current controlfile; #备份控制文件

[oracle@centos6 orcl]$ rm *.ctl  #删除所有控制文件
SQL> startup nomount;

RMAN> set dbid 1449842719
RMAN> restore controlfile from autobackup; #还原控制文件
SQL> alter database mount;
SQL> recover database using backup controlfile;
SQL> alter database open resetlogs;

3. system表空间损坏

RMAN> backup database;

[oracle@centos6 orcl]$ rm system01.dbf
SQL> shutdown abort

SQL> startup mount;
RMAN> restore datafile 1;
RMAN> recover datafile 1;
RMAN> alter database open;

4. Undo表空间损坏

[oracle@centos6 orcl]$ rm undo01.dbf
SQL> shutdown abort

SQL> startup mount;

RMAN> restore tablespace undo1;
RMAN> recover database;

5. 磁盘损坏

[oracle@centos6 orcl]$ rm users01.dbf

RMAN> run {shutdown abort;
2> startup mount;
3> set newname for datafile 4 to '/u01/app/oracle/oradata/test/users01.dbf';
4> restore datafile 4;
5> switch datafile 4;
6> recover database;
7> alter database open;
8> }

6. 普通数据文件损坏

[oracle@centos6 orcl]$ rm tbs01.dbf
方法1:
RMAN> run {shutdown abort;
2> startup mount;
3> restore datafile 5;
4> recover datafile 5;
5> alter database open;
6> }
方法2:
RMAN> run{
2> sql 'alter database datafile 5 offline';
3> restore datafile 5;
4> recover datafile 5;
5> sql 'alter database datafile 5 online';
6> }
方法3:
RMAN> run{shutdown abort;
2> startup mount;
3> sql 'alter database datafile 5 offline ';
4> alter database open;
5> restore datafile 5;
6> recover datafile 5;
7> sql 'alter database datafile 5 online';
8> }

7. 控制文件无损的情况下,只读文件损坏

a. 只读数据文件丢失

RMAN> run{shutdown abort;
2> startup mount;
3> restore datafile 5;
4> alter database open;
5> }

b. 只读文件在实例运行时丢失

RMAN> run{sql 'alter database datafile 5 offline';
2> restore datafile 5;
3> sql 'alter database datafile 5 online';}

c. 只读数据文件内部数据块损坏

RMAN> run{sql 'alter database datafile 5 offline';
2> restore datafile 5 force; # 如果不加上force,会因为5号文件已经存在而跳过restore
3> sql 'alter database datafile 5 online';
4>

d.. 数据文件备份时为只读状态,后来改为读写状态,但没有备份

RMAN> run{sql 'alter database datafile 5 offline';
2> restore datafile 5;
3> recover datafile 5;
4> sql 'alter database datafile 5 online';
5> }

8. 控制文件损坏的情况下,只读文件损坏

a. 只读数据文件连同控制文件一同丢失

[oracle@centos6 orcl]$ rm *.ctl
[oracle@centos6 orcl]$ rm tbs01.dbf

RMAN> run{startup nomount;
2> restore controlfile from autobackup; #开启控制文件自动备份
3> alter database mount;
4> restore datafile 5;
5> recover database;
6> alter database open resetlogs;}

b. 在数据文件为只读状态时,对该文件和控制文件进行了备份,随即该表空间改为读写状态,但该文件和控制文件没有再备份,此时该数据文件联通控制文件一并损坏或丢失

SQL> create table t(id int) tablespace tbs1;
SQL> insert into t values(1); #创建测试数据
SQL> commit;
SQL> alter tablespace tbs1 read only; #表空间tbs1改为只读
RMAN> backup database; #备份数据文件和控制文件,注意将控制文件配置改为自动备份
[oracle@centos6 orcl]$ rm tbs01.dbf
[oracle@centos6 orcl]$ rm control* #删除
SQL> shutdown abort
SQL> startup nomount;
RMAN> run{restore controlfile from autobackup;
2> mount database;
3> restore datafile '/u01/app/oracle/oradata/orcl/tbs01.dbf';
4> recover database;
5> recover database; #recover database执行两次
6> alter database open resetlogs;
7> }

9. 表空间被drop的恢复

过程:全备--》建立表空间--》再次表空间上进行业务--》此表空间被drop--》恢复此表空间

RMAN> backup database; #全备

Starting Control File and SPFILE Autobackup at 2016-11-27 00:51:05
piece handle=/u01/app/oracle/fast_recovery_area/ORCL/autobackup/2016_11_27/o1_mf_s_928975865_d3mhcsr0_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2016-11-27 00:51:06 #控制文件备份集

SQL> create tablespace tbs datafile '/u01/app/oracle/oradata/orcl/tbs.dbf' size  10m; #创建表空间
SQL> create table t(id int) tablespace tbs;
SQL> insert into t values(1); #创建测试数据
SQL> commit;
SQL> select file_name from dba_data_files;
SQL> select current_scn from v$database; #记录此时的scn
CURRENT_SCN
-----------
989839

SQL> alter system archive log current; #切换日志
SQL> alter system archive log current;
SQL> alter system archive log current;

SQL> drop tablespace tbs including contents and datafiles; #drop tbs表空间
SQL> select file_name from dba_data_files; #此时数据文件已经没了

SQL> shutdown abort;
SQL> startup nomount;
RMAN> restore controlfile from '/u01/app/oracle/fast_recovery_area/ORCL/autobackup/2016_11_27/o1_mf_s_928975865_d3mhcsr0_.bkp'; #从全备的控制文件中恢复

RMAN> shutdown abort;
RMAN> startup mount; #使用全备中的控制文件打开数据库
RMAN> restore database; #还原数据库
RMAN> run{
2> set until scn 989839; #恢复
3> recover database;
4> }

RMAN> sql 'alter database open resetlogs';
SQL> select * from t;

ID
----------
1
总结:表空间在没有备份的情况下被drop,此时若想恢复被drop的表空间,必须使用drop之前的备份和控制文件,然后利用归档日志将数据恢复到drop之前的点。表空间会被归档日志重新创建。

----rman不完全恢复

1. 基于时间的不完全恢复

SQL> select * from t;

ID
----------
1

SQL> insert into t values(2);
SQL> commit;
SQL> select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2016-11-27:01:23:21

SQL> insert into t values(3);
SQL> commit;
SQL> drop table t; #误操作

[oracle@centos6_dg ~]$ rman target /
RMAN> run{
2> shutdown abort;
3> startup mount;
4> set until time "to_date('2016-11-27:01:23:21','yyyy-mm-dd:hh24:mi:ss')"; #恢复到时间点
5> restore database;
6> recover database;
7> alter database open resetlogs
8> }

2. 基于sequence的不完全恢复

SQL> select group#,sequence#,archived,status from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1          1 NO  CURRENT
2          0 YES UNUSED
3          0 YES UNUSED

SQL> insert into t values(1);
SQL> commit;
SQL> alter system switch logfile;
SQL> /
SQL> /
SQL> select group#,sequence#,archived,status from v$log; #当前日志为4号日志

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1          4 NO  CURRENT
2          2 YES INACTIVE
3          3 YES INACTIVE

SQL> insert into t values(2);
SQL> commit;
SQL> alter system switch logfile;
SQL> /
SQL> insert into t values(3);
SQL> commit;
SQL> /

RMAN> run{
2> shutdown abort;
3> startup mount;
4> set until sequence 4 thread 1;
5> restore database;
6> recover database;
7> alter database open resetlogs;
8> }



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: