1. 环境模拟
1.1 创建测试表空间
create tablespace enmo5 datafile '/oracle/app/oradata/zydb/enmo05.dbf' size 10M;
create tablespace enmo6 datafile '/oracle/app/oradata/zydb/enmo06.dbf' size 10M;
create tablespace enmo7 datafile '/oracle/app/oradata/zydb/enmo07.dbf' size 10M;
create tablespace enmo8 datafile '/oracle/app/oradata/zydb/enmo08.dbf' size 10M;
create tablespace enmo9 datafile '/oracle/app/oradata/zydb/enmo09.dbf' size 10M;
1.2. 创建测试表
create table sys.test tablespace enmo5 as select * from dba_objects;
1.3. 重建控制文件
查看控制文件
alter database backup controlfile to trace as '/oracle/control.trc';
控制文件内容
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ZYDB" RESETLOGS FORCE LOGGING ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/oracle/app/oradata/zydb/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/oracle/app/oradata/zydb/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/oracle/app/oradata/zydb/redo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/oracle/app/oradata/zydb/system01.dbf',
'/oracle/app/oradata/zydb/sysaux01.dbf',
'/oracle/app/oradata/zydb/undotbs01.dbf',
'/oracle/app/oradata/zydb/users01.dbf',
'/oracle/app/oradata/zydb/itpuxdb.dbf',
'/oracle/app/oradata/zydb/enmo05.dbf',
'/oracle/app/oradata/zydb/enmo06.dbf',
'/oracle/app/oradata/zydb/enmo07.dbf',
'/oracle/app/oradata/zydb/enmo08.dbf',
'/oracle/app/oradata/zydb/enmo09.dbf'
CHARACTER SET AL32UTF8
;
shutdown immediate;
STARTUP NOMOUNT
新建控制文件
CREATE CONTROLFILE REUSE DATABASE "ZYDB" RESETLOGS FORCE LOGGING ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/oracle/app/oradata/zydb/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/oracle/app/oradata/zydb/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/oracle/app/oradata/zydb/redo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/oracle/app/oradata/zydb/system01.dbf',
'/oracle/app/oradata/zydb/sysaux01.dbf',
'/oracle/app/oradata/zydb/undotbs01.dbf',
'/oracle/app/oradata/zydb/users01.dbf',
'/oracle/app/oradata/zydb/itpuxdb.dbf'
--'/oracle/app/oradata/zydb/enmo05.dbf',
--'/oracle/app/oradata/zydb/enmo06.dbf',
--'/oracle/app/oradata/zydb/enmo07.dbf',
--'/oracle/app/oradata/zydb/enmo08.dbf',
--'/oracle/app/oradata/zydb/enmo09.dbf'
CHARACTER SET AL32UTF8
;
alter database open resetlogs;
1.4. 发现部分业务有无法访问
SQL> select * from test;
select * from test
*
ERROR at line 1:
ORA-00376: file 6 cannot be read at this time
ORA-01111: name for data file 6 is unknown - rename to correct file
ORA-01110: data file 6:
'/oracle/app/oracle/product/11.2.0/db_1/dbs/MISSING00006'
1.5. 查询数据文件状态
set linesize 300 pagesize 2000
col ERROR for a20
col NAME for a60
set numw 20
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select FILE#,STATUS,TS#,RFILE#,RESETLOGS_CHANGE#,RESETLOGS_TIME,CHECKPOINT_CHANGE#,CHECKPOINT_TIME,CHECKPOINT_COUNT,status,ERROR,RECOVER,FUZZY from v$datafile_header;
2. 恢复过程
2.1 尝试重建控制文件
shutdown immediate;
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ZYDB" RESETLOGS FORCE LOGGING ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/oracle/app/oradata/zydb/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/oracle/app/oradata/zydb/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/oracle/app/oradata/zydb/redo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/oracle/app/oradata/zydb/system01.dbf',
'/oracle/app/oradata/zydb/sysaux01.dbf',
'/oracle/app/oradata/zydb/undotbs01.dbf',
'/oracle/app/oradata/zydb/users01.dbf',
'/oracle/app/oradata/zydb/itpuxdb.dbf',
'/oracle/app/oradata/zydb/enmo05.dbf',
'/oracle/app/oradata/zydb/enmo06.dbf',
'/oracle/app/oradata/zydb/enmo07.dbf',
'/oracle/app/oradata/zydb/enmo08.dbf',
'/oracle/app/oradata/zydb/enmo09.dbf'
CHARACTER SET AL32UTF8
;
CREATE CONTROLFILE REUSE DATABASE "ZYDB" RESETLOGS FORCE LOGGING ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01189: file is from a different RESETLOGS than previous files
ORA-01110: data file 6: '/oracle/app/oradata/zydb/enmo05.dbf'
2.2 数据库恢复
SELECT TS#,FILE#,NAME,STATUS,CHECKPOINT_CHANGE# FROM V$DATAFILE;
alter database rename file '/oracle/app/oracle/product/11.2.0/db_1/dbs/MISSING00006' to '/oracle/app/oradata/zydb/enmo05.dbf';
alter database rename file '/oracle/app/oracle/product/11.2.0/db_1/dbs/MISSING00007' to '/oracle/app/oradata/zydb/enmo06.dbf';
alter database rename file '/oracle/app/oracle/product/11.2.0/db_1/dbs/MISSING00008' to '/oracle/app/oradata/zydb/enmo07.dbf';
alter database rename file '/oracle/app/oracle/product/11.2.0/db_1/dbs/MISSING00009' to '/oracle/app/oradata/zydb/enmo08.dbf';
alter database rename file '/oracle/app/oracle/product/11.2.0/db_1/dbs/MISSING00010' to '/oracle/app/oradata/zydb/enmo09.dbf';
set linesize 300 pagesize 2000
col ERROR for a20
col NAME for a60
set numw 20
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select FILE#,STATUS,TS#,RFILE#,RESETLOGS_CHANGE#,RESETLOGS_TIME,CHECKPOINT_CHANGE#,CHECKPOINT_TIME,CHECKPOINT_COUNT,status,ERROR,RECOVER,FUZZY from v$datafile_header;
SQL> alter database datafile 6,7,8,9,10 online;
ERROR at line 1:
ORA-01190: control file or data file 6 is from before the last RESETLOGS
ORA-01110: data file 6: '/oracle/app/oradata/zydb/enmo05.dbf'
查看当前数据文件的reset scn与reset time的值
select hxfil file_id,
FHRLC RESET_TIME,
fhrlc_i RESET_COUNT,
FHRLS RESET_SCN,
FHPRC LAST_RESET_TIME,
FHPRC_I LAST_RESET_COUNT,
FHPRS LAST_RESET_SCN
from x$kcvfh;
2.3推进SCN值
SQL> shu immediate;
SQL> startup mount;
SQL> select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
2807658
2807658
2807658
2807658
2807658
0
0
0
0
0
10 rows selected.
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [060019598, 0600195C8) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 60019278 00000000
SQL> oradebug poke 0x060019598 8 3807658
BEFORE: [060019598, 0600195A0) = 00000000 00000000
AFTER: [060019598, 0600195A0) = 003A19AA 00000000
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [060019598, 0600195C8) = 003A19AA 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 60019278 00000000
SQL> alter database datafile 6,7,8,9,10 online;
Database altered.
???recover database using backup controlfile;
SQL> select file#,RESETLOGS_CHANGE#,status from v$datafile_header;
FILE# RESETLOGS_CHANGE# STATUS
---------- ----------------- --------------
1 2804201 ONLINE
2 2804201 ONLINE
3 2804201 ONLINE
4 2804201 ONLINE
5 2804201 ONLINE
6 2804201 ONLINE
7 2804201 ONLINE
8 2804201 ONLINE
9 2804201 ONLINE
10 2804201 ONLINE
10 rows selected.
2.4 恢复验证
查看_allow_resetlogs_corruption的值
SELECT ksppinm, ksppstvl, ksppdesc FROM x$ksppi x, x$ksppcv y WHERE x.indx = y.indx AND ksppinm = '_allow_resetlogs_corruption';
修改_allow_resetlogs_corruption的值
alter system set "_allow_resetlogs_corruption"=true scope=spfile;
重启
startup mount;
SQL> show parameter _allow_resetlogs_corruption
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_allow_resetlogs_corruption boolean TRUE
SQL> alter database open resetlogs;
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00600: internal error code, arguments: [2662], [0], [2804210], [0], [2807654], [4194432], [], [], [], [], [], []
Process ID: 89190
Session ID: 387 Serial number: 5
推SCN
SQL> startup mount;
SQL> select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
2804206
2804206
2804206
2804206
2804206
2804206
2804206
2804206
2804206
2804206
10 rows selected.
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [060019598, 0600195C8) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 60019278 00000000
SQL> oradebug poke 0x060019598 8 3804206
BEFORE: [060019598, 0600195A0) = 00000000 00000000
AFTER: [060019598, 0600195A0) = 003A0C2E 00000000
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [060019598, 0600195C8) = 003A0C2E 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 60019278 00000000
SQL>
SQL> alter database open;
Database altered.
SQL> select count(1) from test;
COUNT(1)
----------
71192
解法:
设置隐藏参数 "_allow_resetlogs_corruption" = true , 强制起库;
推进SCN;