oracle数据库恢复系列之控制文件恢复

1、不一样场景控制文件损坏时的恢复方法linux

场景sql

恢复方法数据库

恢复条件session

其中一个控制文件损坏oracle

1.1 拷贝冗余的控制文件app

1、具备多路冗余控制文件镜像
 二、其它冗余控制文件没有损坏
ide

1.2 修改control_files参数去除损坏文件this

同上、但不推荐该方法进行恢复spa

全部的控制文件损坏rest

有备份

2.1 经过rman备份控制文件进行彻底恢复

1、经过rman备份了控制文件
 二、备份了控制文件以后有连续的归档和redo文件

2.2 经过rman备份控制文件进行不彻底恢复

1、经过rman备份了控制文件
 二、备份了控制文件以后归档或redo文件丢失

2.3 经过trace备份控制文件进行彻底恢复

1、经过trace备份了控制文件
 二、备份了控制文件以后有连续的归档和redo文件

2.4 经过trace备份控制文件进行不彻底恢复

1、经过trace备份了控制文件
 二、备份了控制文件以后归档或redo文件丢失

无备份

2.5 经过手工重建控制文件进行恢复(noresetlogs)

1、无有效的备份控制文件
 二、redo文件无丢失和无损坏

2.6 经过手工重建控制文件进行恢复(resetlogs)

1、无有效的备份控制文件
 二、redo文件丢失或损坏

2.7 经过SNAPSHOT CONTROLFILE文件进行恢复

此处为记录一个恢复控制文件的方法(不常使用)

2、不一样场景控制文件损坏的恢复思路及演示

2.1 其中一个控制文件损坏恢复思路

A. shutdown abort 关闭数据库(控制文件损坏后不能正常关闭数据库,只能使用abort强制关闭)

B. 拷贝其中一个无缺的控制文件(推荐)或者修改control_files参数去除损坏文件(不推荐)

C. startup启动数据库

 

2.2 其中一个控制文件损坏恢复演示

SQL> show parameter control_files
 
NAME                                        TYPE                    VALUE
---------------------------------------------------------- ------------------------------
control_files                           string                   /u/app/oracle/oradata/racdg/control01.ctl,/u/app/oracle/ora
                                                                             data/racdg/control02.ctl
SQL> !mv/u/app/oracle/oradata/racdg/control02.ctl /u/app/oracle/oradata/racdg/control02.ctl.bak
 
SQL> shutdown immediate;  --无正常关闭数据库,须要abort强制关闭
ORA-00210: cannot open the specifiedcontrol file
ORA-00202: control file:'/u/app/oracle/oradata/racdg/control02.ctl'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file ordirectory
Additional information: 3
SQL> shutdown abort;  --只能shutdown abort强制关闭
ORACLE instance shut down.
SQL> startup;  --启动数据库
ORACLE instance started.
ORA-00205: error in identifying controlfile, check alert log for more info  --启动报错,找不到指定的控制文件,在告警日志文件alert_sid.log中能够看到以下报错:
ORA-00210: cannot open the specifiedcontrol file
ORA-00202: control file:'/u/app/oracle/oradata/racdg/control02.ctl'
 
SQL> !pwd 
/u/app/oracle/oradata/racdg
 
SQL> !cp control01.ctl control02.ctl  
 
--或者:
SQL>alter system set control_files=’ /u/app/oracle/oradata/racdg/control01.ctl’scope=both; --不建议,由于这样一来就只剩一份控制文件了,起不到冗余做用,再这次发生丢失,恢复就变得麻烦了。
 
SQL> alter database mount;
 
Database altered.


使用ASM存放控制文件,其中一个控制文件损坏恢复演示

SQL> show parameter control_files;
NAME                                        TYPE       VALUE
----------------------------------------------- ------------------------------
control_files                           string     +DATA/racdb/controlfile/current.256.935676497, +DATA/racdb/c
                                                                 ontrolfile/current.478.957977179
 
SQL> shutdown abort;  --这里我是为了演示才直接关闭数据的,由于在线状况下asm的文件是不能删除的
ORACLE instance shut down.
 
SQL> !su - grid -c "asmcmd -p rm +DATA/racdb/controlfile/current.478.957977179"
Password: 
 
SQL> startup nomount;  --将数据库启动到nomount状态
ORACLE instance started.
 
SQL> !rman target /  --这里使用rman来恢复,固然使用以前的两种方法拷贝和去除也是能够的
 
Recovery Manager: Release 11.2.0.4.0 -Production on Sat Oct 21 16:53:15 2017
 
Copyright (c) 1982, 2011, Oracle and/or itsaffiliates.  All rights reserved.
 
connected to target database: RACDB (notmounted)
 
RMAN> restore controlfile from'+DATA/racdb/controlfile/current.256.935676497';  --其实这里就是拷贝的方式
 
Starting restore at 2017/10/21 16:54:18
using target database control file insteadof recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=143 instance=racdb1device type=DISK
 
channel ORA_DISK_1: copied control filecopy
output filename=+DATA/racdb/controlfile/current.256.935676497
output filename=+DATA/racdb/controlfile/current.478.957977659
Finished restore at 2017/10/21 16:54:22
 
RMAN> sql 'alter database mount';
 
sql statement: alter database mount
released channel: ORA_DISK_1

说明一下,这里我分了文件系统和ASM存储存放控制文件的状况,其恢复原理都是同样的,不管是在线或者关闭数据库后损坏了其中部分控制文件,恢复方法都是同样的。

 

2.3全部的控制文件损坏,有备份场景

2.3.1经过rman备份控制文件进行彻底恢复思路

A. 若在线损坏,shutdown abort关闭数据库;若关闭数据库后损坏,到第二步

B. startup nomount启动数据库到nomount状态。

C. 使用rman从备份中恢复控制文件:restorecontrolfile from '/path';

D. alter database mount;启动数据库到mount状态

E. recover database using backupcontrolfile until cancel; 应用归档文件

F. 再执行recover databaseusing backup controlfile; 应用未归档的redo文件

G. alter database open resetlogs; resetlogs的方式打开数据库

 

2.3.2经过rman备份控制文件进行彻底恢复演示

SQL> show parameter control_files;
NAME                                        TYPE                    VALUE
---------------------------------------------------------- ------------------------------
control_files                           string                   /u/app/oracle/oradata/racdg/control01.ctl,/u/app/oracle/ora
data/racdg/control02.ctl, /u/app/oracle/oradata/racdg/control03
.ctl
SQL> !rm control01.ctl control02.ctlcontrol03.ctl  --删除全部的控制文件,模拟控制文件丢失
 
SQL> shutdown abort; --强制关闭数据库
ORACLE instance shut down.
SQL> startup;      --启动数据到nomount状态
ORACLE instance started.
 
ORA-00205: error in identifying controlfile, check alert log for more info  --报错,同时查看告警日志,会发现全部控制文件都已经丢失。
 
SQL> !rman target /   --此前有作过RMAN控制文件备份,使用rman进行恢复
 
Recovery Manager: Release 11.2.0.4.0 -Production on Sat Oct 21 17:24:11 2017
 
Copyright (c) 1982, 2011, Oracle and/or itsaffiliates.  All rights reserved.
 
connected to target database: RACDG (notmounted)
 
RMAN> restore controlfile from'/u/app/oracle/zwdir/RACDG_20171021_0fshj32i_1_1.ctl'; --恢复控制文件
 
Starting restore at 2017/10/21 17:24:57
using target database control file insteadof recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=135 devicetype=DISK
 
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete,elapsed time: 00:00:03
output filename=/u/app/oracle/oradata/racdg/control01.ctl
output filename=/u/app/oracle/oradata/racdg/control02.ctl
output filename=/u/app/oracle/oradata/racdg/control03.ctl
Finished restore at 2017/10/21 17:25:01
 
RMAN> sql 'alter database mount';  --将数据库启动到mount状态
 
sql statement: alter database mount
released channel: ORA_DISK_1
 
RMAN> exit
 
Recovery Manager complete.
 
SQL> recover database using backupcontrolfile until cancel; 
ORA-00279: change 1041001 generated at10/21/2017 16:04:25 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_6_957480185.dbf
ORA-00280: change 1041001 for thread 1 isin sequence #6
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
auto
ORA-00279: change 1041011 generated at10/21/2017 16:20:36 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_7_957480185.dbf
ORA-00280: change 1041011 for thread 1 isin sequence #7
ORA-00278: log file'/u/app/oracle/oradata/arch/1_6_957480185.dbf' no longer needed for thisrecovery
 
ORA-00279: change 1041019 generated at10/21/2017 16:20:36 needed for thread 1
ORA-00289: suggestion : /u/app/oracle/oradata/arch/1_8_957480185.dbf
ORA-00280: change 1041019 for thread 1 isin sequence #8
ORA-00278: log file'/u/app/oracle/oradata/arch/1_7_957480185.dbf' no longer needed for thisrecovery
 
ORA-00308: cannot open archived log'/u/app/oracle/oradata/arch/1_8_957480185.dbf'
ORA-27037: unable to obtain file status  --缺乏序号为8的归档,这是由于redo还存在归档未切换
Linux-x86_64 Error: 2: No such file ordirectory
Additional information: 3
 
ORA-01547: warning: RECOVER succeeded butOPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to beconsistent
ORA-01110: data file 1:'/u/app/oracle/oradata/racdg/system01.dbf'
 
SQL> selecta.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile bwhere a.group#=b.group#;
 
GROUP# SEQUENCE# ARCHIV STATUS                     MEMBER
---------- ---------- ------------------------------------------------------------------------------------------------
          1         4 YES   INACTIVE     /u/app/oracle/oradata/racdg/redo01.log
          3         6NO     CURRENT      /u/app/oracle/oradata/racdg/redo03.log  --当前未归档的redo文件
          2         5 YES   INACTIVE     /u/app/oracle/oradata/racdg/redo02.log
 
SQL> recover database using backupcontrolfile;  --再次执行,应用未归档的redo文件
ORA-00279: change 1041019 generated at10/21/2017 16:20:36 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_8_957480185.dbf
ORA-00280: change 1041019 for thread 1 isin sequence #8  --这里看到未归档的redo文件,归档序号为6,而这里须要恢复序列为8的归档,因此应该是应用/u/app/oracle/oradata/racdg/redo02.log这个redo文件。
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
/u/app/oracle/oradata/racdg/redo02.log
Log applied.
Media recovery complete.
 
SQL> alter database open resetlogs;   --以resetlogs的方式打开数据库
 
Database altered.

resetlogsnoresetlogs的区别说明:

norestlogs控制文件的scn是来自当前日志的highscn,而resetlogs控制文件的scn是来自数据文件。

noresetlogs会继续使用已经存在,且有效的logfiles,而resetlogs会初始化logs,重置log sequence号,建立一个新的incarnation

 

2.3.3经过rman备份控制文件进行不彻底恢复思路

A. 若在线损坏,shutdown abort关闭数据库;若关闭数据库后损坏,到第二步

B. startup nomount启动数据库到nomount状态。

C. 使用rman从备份中恢复控制文件:restorecontrolfile from '/path';

D. alter database mount;启动数据库到mount状态

E. recover database using backupcontrolfile until cancel; 应用尽量多的归档文件

 

G. 若丢失redo文件:

shutdown immediate并启动到startupnomount状态

alter database backup controlfile to traceas ‘/u/app/oracle/zwdir/controlfile.sql’; 生成建立控制文件的脚本

使用resetlogs方式建立控制文件

若未归档的redo文件可用:直接recover database,选用未归档的redo应用,alter database open resetlogs方式打开数据库

若未归档的redo文件不可用:设置隐含参数_allow_resetlogs_corruption=true跳过一致性检查,alterdatabase open resetlogs方式打开数据库

 

F. 若丢失归档文件:

shutdown immediate并启动到startupnomount状态

alter database backup controlfile to traceas ‘/u/app/oracle/zwdir/controlfile.sql’; 生成建立控制文件的脚本

使用noresetlogs方式建立控制文件

recover database using backup controlfileuntil cancel; 应用redo文件

alter database open resetlogs; resetlogs的方式打开数据库

若备份控制文件以后,数据库结构发生了变化,如新增了表空间或数据文件,须要进行不彻底恢复

 

2.3.4经过rman备份控制文件进行不彻底恢复演示

这里模拟演示模拟备份控制文件以后,新增表空间,归档文件所有丢失的不彻底恢复的状况,丢失redo的状况,请看下一节“oracle数据库恢复系列之redo文件恢复”

 [oracle@iscsi-asmzwdir]$ rman target /
 
RMAN> backup current controlfile format'/u/app/oracle/zwdir/use_this_%U.ctl' tag='ctl';  --备份当前的控制文件
 
Starting backup at 2017/10/29 17:03:31
using target database control file insteadof recovery catalog
piecehandle=/u/app/oracle/zwdir/use_this_08si88j3_1_1.ctl tag=CTL comment=NONE
channel ORA_DISK_1: backup set complete,elapsed time: 00:00:01
Finished backup at 2017/10/29 17:03:33
 
[oracle@iscsi-asm racdg]$ sqlplus / assysdba
 
SQL> create tablespace t_del_archdatafile '/u/app/oracle/oradata/racdg/t_del_arch01.dbf' size 20m; --新增表空间
 
Tablespace created.
 
SQL> create user t_arch identified bypassword default tablespace t_del_arch; --新建用户
 
User created.
 
SQL> grant resource,connect to t_arch;  --受权
 
Grant succeeded.
 
SQL> alter system switch logfile; --切换归档日志
 
System altered.
 
SQL> create table t_arch.t1 as select *from dba_objects where rownum<1000; --新建表,并插入数据
 
Table created.
 
SQL> alter system switch logfile; --切换归档日志
 
System altered.
 
SQL> select count(*) from t_arch.t1;
 
 COUNT(*)
----------
      999
 
SQL> insert into t_arch.t1 select * fromt_arch.t1; --新增数据
 
999 rows created.
 
SQL> commit;
 
Commit complete.
 
SQL> alter system switch logfile; --切换日志
 
System altered.
 
SQL> select count(*) from t_arch.t1; --记录当前的数据,用做恢复的数据对比
 
 COUNT(*)
----------
     1998
 
SQL> archive log list;   --当前归档的序号
Database log mode       Archive Mode
Automatic archival         Enabled
Archive destination      /u/app/oracle/oradata/arch
Oldest online log sequence     5
Next log sequence to archive   7
Current log sequence             7
 
SQL> shutdown abort;  --关闭数据库
ORACLE instance shut down.
SQL> !rm control01.ctl control02.ctl  --模拟控制文件丢失
 
SQL> !mv/u/app/oracle/oradata/arch/*.dbf /u/app/oracle/oradata/arch/tmp  --模拟归档文件所有丢失
 
SQL> startup nomount;
ORACLE instance started.
 
SQL> !rman target /
 
Recovery Manager: Release 11.2.0.4.0 -Production on Sun Oct 29 17:19:33 2017
 
Copyright (c) 1982, 2011, Oracle and/or itsaffiliates.  All rights reserved.
 
connected to target database: RACDG (notmounted)
 
RMAN> restore controlfile from'/u/app/oracle/zwdir/use_this_08si88j3_1_1.ctl'; --经过旧备份控制文件进行恢复
 
Starting restore at 2017/10/29 17:19:44
using target database control file insteadof recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=10 device type=DISK
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete,elapsed time: 00:00:01
output filename=/u/app/oracle/oradata/racdg/control01.ctl
output filename=/u/app/oracle/oradata/racdg/control02.ctl
Finished restore at 2017/10/29 17:19:46
 
RMAN> exit
 
Recovery Manager complete.
 
SQL> alter database mount;
 
Database altered.
 
SQL> alter database backup controlfileto trace as '/u/app/oracle/zwdir/controlfile.sql';
 
Database altered. --此时归档文件已经丢失了,没法经过应用归档文件进行恢复,因此经过trc新建控制文件的方式进行恢复。
 
SQL> shutdown abort; --关闭数据库
ORACLE instance shut down.
SQL> STARTUP NOMOUNT --启动到nomount状态
ORACLE instance started.
 
SQL> CREATE CONTROLFILE REUSE DATABASE"RACDG" NORESETLOGS  ARCHIVELOG
   MAXLOGFILES 16
   MAXLOGMEMBERS 3
   MAXDATAFILES 100
   MAXINSTANCES 8
   MAXLOGHISTORY 292
LOGFILE
 GROUP 1 '/u/app/oracle/oradata/racdg/redo01.log'  SIZE 50M BLOCKSIZE 512,
 GROUP 2 '/u/app/oracle/oradata/racdg/redo02.log'  SIZE 50M BLOCKSIZE 512,
 GROUP 3 '/u/app/oracle/oradata/racdg/redo03.log'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
 '/u/app/oracle/oradata/racdg/system01.dbf',
 '/u/app/oracle/oradata/racdg/sysaux01.dbf',
 '/u/app/oracle/oradata/racdg/undotbs01.dbf',
 '/u/app/oracle/oradata/racdg/users01.dbf'
CHARACTER SET WE8MSWIN1252
;
 
--以上新建控制文件的内容就是经过/u/app/oracle/zwdir/controlfile.sql里面的记录来进行新建的,里面共有两种方式,一种是noresetlogs,另外一种是resetlogs的方式。这里由于redo文件是没有丢失的,因此使用nosesetlogs的方式。
 
Control file created.
 
SQL> selectb.sequence#,a.member,b.status from v$logfile a, v$log b wherea.group#=b.group#; --查询redo信息
 
 SEQUENCE# MEMBER                                         STATUS
------------------------------------------------------- --------------------------------
          7 /u/app/oracle/oradata/racdg/redo01.log CURRENT
          5 /u/app/oracle/oradata/racdg/redo02.log INACTIVE
          6 /u/app/oracle/oradata/racdg/redo03.log INACTIVE
 
SQL> select file#,name,status fromv$datafile;  --查询数据文件信息,此时数据文件都是须要恢复
 
    FILE# NAME                                                 STATUS
------------------------------------------------------- --------------
          1 /u/app/oracle/oradata/racdg/system01.dbf      SYSTEM
          2 /u/app/oracle/oradata/racdg/sysaux01.dbf       RECOVER
          3 /u/app/oracle/oradata/racdg/undotbs01.dbf     RECOVER
          4 /u/app/oracle/oradata/racdg/users01.dbf          RECOVER
 
SQL> recover database using backupcontrolfile until cancel; --恢复数据库,应用redo日志
ORA-00279: change 932267 generated at10/29/2017 17:07:56 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_6_958668721.dbf
ORA-00280: change 932267 for thread 1 is insequence #6 
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
/u/app/oracle/oradata/racdg/redo03.log
ORA-00279: change 932300 generated at10/29/2017 17:09:10 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_7_958668721.dbf
ORA-00280: change 932300 for thread 1 is insequence #7
ORA-00278: log file'/u/app/oracle/oradata/racdg/redo03.log' no longer needed for this recovery
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
/u/app/oracle/oradata/racdg/redo01.log
Log applied.
Media recovery complete.
 
SQL> alter database open resetlogs; --以resetlogs的方式打开数据库
 
Database altered.
 
SQL> select file#,name,status fromv$datafile;  --查看数据文件的状态,备份控制文件以后的表空间对应的数据文件须要进一步恢复。
    FILE# NAME                                                         STATUS
-------------------------------------------------------------- --------------
          1 /u/app/oracle/oradata/racdg/system01.dbf               SYSTEM
          2 /u/app/oracle/oradata/racdg/sysaux01.dbf                ONLINE
          3 /u/app/oracle/oradata/racdg/undotbs01.dbf             ONLINE
          4 /u/app/oracle/oradata/racdg/users01.dbf                  ONLINE
          5/u/app/oracle/product/11.2.0/db_1/dbs/MISSING00005RECOVER
 
SQL> alter database datafile 5 offline;  --先将数据文件offline
 
Database altered.
 
SQL>alter database rename file'/u/app/oracle/product/11.2.0/db_1/dbs/MISSING00005' to'/u/app/oracle/oradata/racdg/t_del_arch01.dbf'; --重命名数据文件
 
Database altered.
 
SQL> alter tablespace t_del_arch online;  ---尝试将表空间online,报错
alter tablespace t_del_arch online
*
ERROR at line 1:
ORA-01190: control file or data file 5 isfrom before the last RESETLOGS
ORA-01110: data file 5: '/u/app/oracle/oradata/racdg/t_del_arch01.dbf'
 
SQL> alter system set"_allow_resetlogs_corruption"=true scope=spfile; --修改参数,忽略SCN一致性校验
 
System altered.
 
SQL> startup force;  --再将数据库从新启动
ORACLE instance started.
 
Total System Global Area  830930944 bytes
Fixed Size              2257800 bytes
Variable Size                536874104 bytes
Database Buffers      285212672 bytes
Redo Buffers                 6586368 bytes
Database mounted.
Database opened.
 
SQL> selectts#,file#,name,status,checkpoint_change# from v$datafile;  --查询数据文件的状况
 
      TS#     FILE# NAME                                              STATUS        CHECKPOINT_CHANGE#
---------- ---------- ----------------------------------------------------------- ------------------
          0         1 /u/app/oracle/oradata/racdg/system01.dbf           SYSTEM                    953040
          1         2 /u/app/oracle/oradata/racdg/sysaux01.dbf            ONLINE                    953040
          2         3 /u/app/oracle/oradata/racdg/undotbs01.dbf     ONLINE                        953040
          4         4 /u/app/oracle/oradata/racdg/users01.dbf     ONLINE                    953040
          6         5/u/app/oracle/oradata/racdg/t_del_arch01.dbf RECOVER                             0
 
SQL> alter session set events 'immediatetrace name adjust_scn level 1'; --经过设置adjust_scn使数据文件的CHECKPOINT_CHANGE#一致
 
Session altered.
 
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount; --启动到mount状态
ORACLE instance started.
 
Total System Global Area  830930944 bytes
Fixed Size              2257800 bytes
Variable Size                536874104 bytes
Database Buffers      285212672 bytes
Redo Buffers                 6586368 bytes
Database mounted.
SQL> recover until cancel; --恢复数据库,注意这里不是usingcontrolfile的方式
Media recovery complete.
 
SQL> alter database datafile 2,3,4,5online;  ---将全部的数据文件online,记得千万不用漏了
 
Database altered.
 
SQL> alter database open resetlogs; --以resetlogs的方式打开数据库
 
Database altered.
 
SQL> selectts#,file#,name,status,checkpoint_change# from v$datafile;   --查询数据文件的状况
 
       TS#     FILE#NAME                                              STATUS        CHECKPOINT_CHANGE#
---------- ------------------------------------------------------- -------------- ------------------
          0         1 /u/app/oracle/oradata/racdg/system01.dbf           SYSTEM                    953040
          1         2 /u/app/oracle/oradata/racdg/sysaux01.dbf            ONLINE                    953040
          2         3/u/app/oracle/oradata/racdg/undotbs01.dbf    ONLINE                        953040
          4         4 /u/app/oracle/oradata/racdg/users01.dbf     ONLINE                    953040
          6         5 /u/app/oracle/oradata/racdg/t_del_arch01.dbf  ONLINE                               953040
 
SQL> select count(*) from t_arch.t1;  --对比数据,发现存在数据丢失,出现这种状况,只能把损失降到最小
 
 COUNT(*)
----------
      999
 
SQL> alter tablespace temp add tempfile'/u/app/oracle/oradata/racdg/temp01.dbf' reuse; --重建temp表空间
 
Database altered.


2.3.4经过trace备份控制文件进行彻底恢复思路

A.备份控制文件到tracealterdatabase backup controlfile to trace as '/path/controlfile.sql';

B.若在线损坏,直接alterdatabase backup controlfile to 'file';以后重启数据库

C.若关闭数据库后损坏,shutdownabort关闭数据库后,startup nomount启动数据库到nomount状态

D.使用备份到trace里建立控制文件的语句,以noresetlogs方式建立控制文件

E.recover database恢复数据库,恢复完后经过alterdatabase open打开数据库

F.重建temp表空间:altertablespace temp add tempfile '/path/temp01.dbf' reuse;

 

2.3.5经过trace备份控制文件进行彻底恢复演示

oracle数据库提供了多种对控制文件的备份方式:rmanalterdatabase backup controlfile to tracealter databasebackup controlfile to filename 这里只演示在线损坏时经过alter database backup controlfile to filename 的恢复,由于经过trace备份的恢复演示在“2.3.4经过rman备份控制文件进行不彻底恢复演示”章节已经写了。

SQL> select open_mode from v$database;
 
OPEN_MODE
----------------------------------------
READ WRITE
 
SQL> !rm control01.ctl control02.ctl  --这种状况主要是数据库还在运行状态,手贱误删的恢复
 
SQL> alter database backup controlfileto '/u/app/oracle/oradata/racdg/control01.ctl.bak'; --备份成二进制文件
 
Database altered.
 
SQL> shutdown abort;
ORACLE instance shut down.
 
SQL> !cp control01.ctl.bak control01.ctl–直接拷贝使用
 
SQL> !cp control01.ctl.bak control02.ctl
 
SQL> startup mount;  --启动到mount状态
ORACLE instance started.
 
Total System Global Area  830930944 bytes
Fixed Size              2257800 bytes
Variable Size                536874104 bytes
Database Buffers      285212672 bytes
Redo Buffers                 6586368 bytes
Database mounted.
 
SQL> selecta.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile bwhere a.group#=b.group#;
 
   GROUP#  SEQUENCE# ARCHIV STATUS             MEMBER
---------- ---------- --------------------- ----------------------------------------
          1         1 NO    CURRENT            /u/app/oracle/oradata/racdg/redo01.log
          3         0 YES   UNUSED       /u/app/oracle/oradata/racdg/redo03.log
          2         0 YES   UNUSED       /u/app/oracle/oradata/racdg/redo02.log
 
SQL> recover database using backupcontrolfile until cancel;
ORA-00279: change 932699 generated at10/31/2017 19:25:50 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_1_958850748.dbf
ORA-00280: change 932699 for thread 1 is insequence #1
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
/u/app/oracle/oradata/racdg/redo01.log  –应用redo文件
Log applied.
Media recovery complete.
 
SQL> alter database open resetlogs;  --以resetlogs的方式开启数据库
 
Database altered.


2.3.6经过trace备份控制文件进行不彻底恢复思路

A.备份控制文件到tracealterdatabase backup controlfile to trace as '/path/controlfile.sql';

B.shutdown abort关闭数据库后,startupnomount启动数据库到nomount状态

C. 若丢失redo文件,归档未丢失:

使用备份到trace里建立控制文件的语句,以resetlogs方式建立控制文件

alter database mount;启动数据库mount状态

若未归档的redo文件可用:直接recover database,选用未归档的redo应用,alter database open resetlogs方式打开数据库

若未归档的redo文件不可用:设置隐含参数_allow_resetlogs_corruption=true跳过一致性检查,alterdatabase open resetlogs方式打开数据库

D. 若丢失归档文件,redo未丢失:

使用备份到trace里建立控制文件的语句,以resetlogs方式建立控制文件

alter database mount;启动数据库mount状态

recover database using backup controlfileuntil cancel; 应用redo文件

alter database open resetlogs; resetlogs的方式打开数据库

若备份控制文件以后,数据库结构发生了变化,如新增了表空间或数据文件,须要进行不彻底恢复

E. 若归档文件和redo文件都丢失:

步骤与若丢失归档文件,redo未丢失的恢复步骤同样,主要是以resetlogs方式建立控制文件

F.重建temp表空间:altertablespace temp add tempfile '/path/temp01.dbf' reuse;

 

2.3.7经过trace备份控制文件进行不彻底恢复演示

请参照“2.3.4经过rman备份控制文件进行不彻底恢复演示”,主要注意如下几点:

A.trace备份的控制文件并非实时的备份,可能不是最新的,备份以后数据库结构可能发生了变化

B.对于此类恢复必定须要谨慎,恢复完以后立刻作个全备,尽可能将数据丢失下降到最小。

 

2.4全部的控制文件损坏,无备份场景

2.4.1经过手工重建控制文件进行恢复(noresetlogs)思路

A.shutdown abort关闭数据库后,startupnomount启动数据库到nomount状态

B.手工构造控制文件,以noresetlogs方式

C. alter database mount;启动数据库到mount状态

D. recover database using backupcontrolfile until cancel; 应用归档文件

E. 再执行recover databaseusing backup controlfile; 应用未归档的redo文件

F. alter database open resetlogs; resetlogs的方式打开数据库

 

2.4.2经过手工重建控制文件进行恢复(resetlogs)思路

A.shutdown abort关闭数据库后,startupnomount启动数据库到nomount状态

B.手工构造控制文件,以resetlogs方式

C. alter database mount;启动数据库到mount状态

D. recover database using backupcontrolfile until cancel; 应用归档文件(不考虑归档文件丢失)

E. 再执行recover databaseusing backup controlfile; 应用未归档的redo文件(不考虑redo文件丢失)

F. alter database open resetlogs; resetlogs的方式打开数据库

 

2.4.3经过手工重建控制文件进行恢复(resetlogs)演示

这里不做很是具体的演示了,前面的章节已经演示过了,就说明一下须要注意的几点:

  1. 由于是手动构建,因此在构建的过程当中必定要仔细检查数据库清除数据库有多少文件,构建脚本以下:

CREATE CONTROLFILE REUSE DATABASE"RACDG" RESETLOGS  ARCHIVELOG
   MAXLOGFILES 16
   MAXLOGMEMBERS 3
   MAXDATAFILES 100
   MAXINSTANCES 8
   MAXLOGHISTORY 292
LOGFILE
 GROUP 1 '/u/app/oracle/oradata/racdg/redo01.log'  SIZE 50M BLOCKSIZE 512,
 GROUP 2 '/u/app/oracle/oradata/racdg/redo02.log'  SIZE 50M BLOCKSIZE 512,
 GROUP 3 '/u/app/oracle/oradata/racdg/redo03.log'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
 '/u/app/oracle/oradata/racdg/system01.dbf',
 '/u/app/oracle/oradata/racdg/sysaux01.dbf',
 '/u/app/oracle/oradata/racdg/undotbs01.dbf',
 '/u/app/oracle/oradata/racdg/users01.dbf',
 '/u/app/oracle/oradata/racdg/t_del_arch01.dbf'
CHARACTER SET WE8MSWIN1252;

必定要都存放文件的路径下去ls –ltr列一下有哪些文件,千万不要把某个文件漏了。

B. 手动构建控制文件是存在必定的数据丢失风险的,必定得细心,细心,再细心。

 

2.4.4经过SNAPSHOTCONTROLFILE文件进行恢复思路

A.shutdown abort关闭数据库后,startupnomount启动数据库到nomount状态

B.直接拷贝snapshot controlfilecontrol file或经过rman恢复:restore controlfile from '$ORACLE_HOME/dbs/snapcf_@.f';

C. alter database mount;启动数据库到mount状态

D. recover database using backupcontrolfile until cancel; 应用归档文件(不考虑归档文件丢失)

E. 再执行recover databaseusing backup controlfile; 应用未归档的redo文件(不考虑redo文件丢失)

F. alter database open resetlogs; resetlogs的方式打开数据库

 

2.4.5经过SNAPSHOTCONTROLFILE文件进行恢复演示

 
RMAN> show snapshot controlfile name;  --查看快照控制文件配置
 
using target database control file insteadof recovery catalog
RMAN configuration parameters for databasewith db_unique_name RACDG are:
CONFIGURE SNAPSHOT CONTROLFILE NAME TO'/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.f'; # default
--若是是RAC,通常建议将该配置文件配置在ASM或ACFS等共享存储上。
 
SQL> !rm control01.ctl control02.ctl  --模拟控制文件丢失
 
SQL> shutdown abort;  --强制关闭数据库
ORACLE instance shut down.
 
SQL> startup nomount; --启动数据库到mount状态
ORACLE instance started.
 
SQL> !cp/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.f control01.ctl --直接拷贝快照控制文件
 
SQL> !cp/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.f control02.ctl
 
SQL> !ls -ltr control*.ctl
-rw-r----- 1 oracle oinstall 9748480Nov  1 18:48 control01.ctl
-rw-r----- 1 oracle oinstall 9748480Nov  1 18:48 control02.ctl
 
--或者使用RMAN进行恢复:restorecontrolfile from ‘/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.f’;
 
SQL> alter database mount;  --启动数据库到mount状态
 
Database altered.
 
SQL> recover database using backupcontrolfile until cancel;  --应该归档文件
ORA-00279: change 948557 generated at10/31/2017 22:00:44 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_2_958851405.dbf
ORA-00280: change 948557 for thread 1 is insequence #2
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
auto
ORA-00308: cannot open archived log'/u/app/oracle/oradata/arch/1_4_958851405.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
 
ORA-00308: cannot open archived log'/u/app/oracle/oradata/arch/1_4_958851405.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file ordirectory
Additional information: 3
 
ORA-01547: warning: RECOVER succeeded butOPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to beconsistent
ORA-01110: data file 1:'/u/app/oracle/oradata/racdg/system01.dbf'
 
SQL> selecta.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile bwhere a.group#=b.group#;
 
   GROUP#  SEQUENCE# ARCHIV STATUS                     MEMBER
---------- ---------- -------------------------- ------------------------------------------------
          1         1 YES   INACTIVE                    /u/app/oracle/oradata/racdg/redo01.log
          3         0 YES   UNUSED             /u/app/oracle/oradata/racdg/redo03.log
          2         2 NO    CURRENT                  /u/app/oracle/oradata/racdg/redo02.log
 
SQL> recover database using backupcontrolfile until cancel;  --应用redo文件
ORA-00279: change 948625 generated at11/01/2017 18:41:13 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_4_958851405.dbf
ORA-00280: change 948625 for thread 1 is insequence #4
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
/u/app/oracle/oradata/racdg/redo01.log
Log applied.
Media recovery complete.
SQL> alter database open resetlogs; --以resetlogs的方式开启数据库
 
Database altered.


 

总结:

1、从上能够说是涉及到各个场景控制文件的损坏恢复,相对是比较全面的,但生产环境下的恢复状况要比咱们预想的复杂的多,应根据各类状况,尽可能将损失下降到最小。

2、还有个在linux环境未关库状况下,形成控制文件误删,可经过/proc进程号恢复,这边就不作介绍了。

3、最后得强调一下,有效的备份重于一切,对生产环境存敬畏之心,千万不要存侥幸心理,墨菲定律就在咱们身边。

相关文章
相关标签/搜索