1. 问题描述
当数据库异常宕机并且控制文件损坏时,使用备份的控制文件进行恢复数据库会遇到以下错误, ORA-01207: file is more recent than control file,通过分析并恢复该问题总结以下经验, 1) v$log中日志文件信息是从控制文件中获取,所以old controlfile中显示的日志文件scn不准确,造成数据库media recover无法完成。 2) 重建控制文件后,v$database.CHECKPOINT_CHANGE和v$datafile.CHECKPOINT_CHANGE以数据文件头和日志文件中的最大值为准。 3) 日志文件和数据文件未损坏可以进行完全恢复。 4) 日志切换时并不会立即触发完全检查点,当所有日志状态为current/active时,日志切换进程会产生等待, alert日志显示,“Thread 1 cannot allocate new log, sequence 56”,本次切换日志会立即触发高级别全量检查点。
复制
2. 问题模拟
2.1 备份控制文件
SQL> @log <-- before backup the controlfile
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS MEMBER F_SCN N_SCN
---------- ---------- ---------- ---------- ---------- ---------- ---------- -------------------------- -------------------- --------------------
2 1 20 104857600 1 YES INACTIVE /oradata/enmo/redo02a.log 792401 792405
3 1 21 104857600 1 YES INACTIVE /oradata/enmo/redo03a.log 792405 792409
1 1 22 104857600 1 NO CURRENT /oradata/enmo/redo01a.log 792409 281474976710655
SQL>
[oracle@sourcedb enmo]$ pwd
/oradata/enmo
[oracle@sourcedb enmo]$ cp control01.ctl ./bak/
复制
2.2 模拟数据库事务及日志切换
sqlplus / as sysdba
alter system archive log current;
/
/
/
SQL> @log <-- before transaction
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS MEMBER F_SCN N_SCN
---------- ---------- ---------- ---------- ---------- ---------- ---------- -------------------------- -------------------- --------------------
3 1 33 104857600 1 YES INACTIVE /oradata/enmo/redo03a.log 792467 792470
1 1 34 104857600 1 YES INACTIVE /oradata/enmo/redo01a.log 792470 792473
2 1 35 104857600 1 NO CURRENT /oradata/enmo/redo02a.log 792473 281474976710655
SQL>
create table t1 tablespace users as select * from obj$;
alter system switch logfile;
insert into t1 select * from t1;
commit;
select count(1) from t1;
alter system switch logfile;
delete from t1;
commit;
select count(1) from t1;
SQL> @log <-- after transaction
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS MEMBER F_SCN N_SCN
---------- ---------- ---------- ---------- ---------- ---------- ---------- -------------------------- -------------------- --------------------
2 1 35 104857600 1 YES ACTIVE /oradata/enmo/redo02a.log 792473 792548
3 1 36 104857600 1 YES ACTIVE /oradata/enmo/redo03a.log 792548 792555
1 1 37 104857600 1 NO CURRENT /oradata/enmo/redo01a.log 792555 281474976710655
SQL>
复制
2.3 模拟故障
### 异常关闭数据库,请勿在生产库执行
ps -ef|grep smon|grep -v grep|awk '{print $2}'|xargs kill -9
### 恢复old controlfile
[oracle@sourcedb enmo]$ rm -f control01.ctl
[oracle@sourcedb enmo]$ mv ./bak/control01.ctl .
### 启动数据库
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01122: database file 1 failed verification check
ORA-01110: data file 1: '/oradata/enmo/system01.dbf'
ORA-01207: file is more recent than control file - old control file
SQL>
复制
3. 问题恢复
3.1 use old control recove
SQL> @log
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS MEMBER F_SCN N_SCN
---------- ---------- ---------- ---------- ---------- ---------- ---------- ------------------------------------------------------------ -------------------- --------------------
2 1 20 104857600 1 YES INACTIVE /oradata/enmo/redo02a.log 792401 792405
3 1 21 104857600 1 YES INACTIVE /oradata/enmo/redo03a.log 792405 792409
1 1 22 104857600 1 NO CURRENT /oradata/enmo/redo01a.log 792409 281474976710655
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01122: database file 1 failed verification check
ORA-01110: data file 1: '/oradata/enmo/system01.dbf'
ORA-01207: file is more recent than control file - old control file
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 792409 generated at 10/08/2021 20:11:27 needed for thread 1
ORA-00289: suggestion : /arch1/1_22_1085429073.dbf
ORA-00280: change 792409 for thread 1 is in sequence #22
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/oradata/enmo/redo01a.log
ORA-00326: log begins at change 792555, need earlier change 792409
ORA-00334: archived log: '/oradata/enmo/redo01a.log'
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/oradata/enmo/system01.dbf'
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 792409 generated at 10/08/2021 20:11:27 needed for thread 1
ORA-00289: suggestion : /arch1/1_22_1085429073.dbf
ORA-00280: change 792409 for thread 1 is in sequence #22
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/oradata/enmo/redo03a.log
ORA-00326: log begins at change 792548, need earlier change 792409
ORA-00334: archived log: '/oradata/enmo/redo03a.log'
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/oradata/enmo/system01.dbf'
SQL>
复制
3.2 重建控制文件恢复
SQL> alter database backup controlfile to trace as '/home/oracle/ctl.txt';
Database altered.
SQL>
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 2137886720 bytes
Fixed Size 2254952 bytes
Variable Size 285214616 bytes
Database Buffers 1845493760 bytes
Redo Buffers 4923392 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "ENMO" NORESETLOGS ARCHIVELOG
2 MAXLOGFILES 21
3 MAXLOGMEMBERS 5
4 MAXDATAFILES 100
5 MAXINSTANCES 1
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 '/oradata/enmo/redo01a.log' SIZE 100M BLOCKSIZE 512,
9 GROUP 2 '/oradata/enmo/redo02a.log' SIZE 100M BLOCKSIZE 512,
10 GROUP 3 '/oradata/enmo/redo03a.log' SIZE 100M BLOCKSIZE 512
11 -- STANDBY LOGFILE
12 -- GROUP 4 '/oradata/enmo/std01.log' SIZE 50M BLOCKSIZE 512,
13 -- GROUP 5 '/oradata/enmo/std02.log' SIZE 50M BLOCKSIZE 512,
14 -- GROUP 6 '/oradata/enmo/std03.log' SIZE 50M BLOCKSIZE 512,
15 -- GROUP 7 '/oradata/enmo/std04.log' SIZE 50M BLOCKSIZE 512
16 DATAFILE
17 '/oradata/enmo/system01.dbf',
18 '/oradata/enmo/sysaux01.dbf',
19 '/oradata/enmo/undotbs01.dbf',
20 '/oradata/enmo/users01.dbf',
21 '/oradata/enmo/hsql01.dbf',
22 '/oradata/enmo/hsql02.dbf'
23 CHARACTER SET ZHS16GBK
24 ;
Control file created.
SQL>
[oracle@sourcedb orastar_script]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Fri Oct 8 20:51:33 2021
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> @log
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS MEMBER F_SCN N_SCN
---------- ---------- ---------- ---------- ---------- ---------- ---------- ------------------------------------------------------------ -------------------- --------------------
2 1 35 104857600 1 NO INACTIVE /oradata/enmo/redo02a.log 792473 792548
3 1 36 104857600 1 NO INACTIVE /oradata/enmo/redo03a.log 792548 792555
1 1 37 104857600 1 NO CURRENT /oradata/enmo/redo01a.log 792555 281474976710655
SQL> @dbf
Session altered.
CHECKPOINT_CHANGE#
------------------
792555
FILE# NAME CHECKPOINT_CHANGE# CHECKPOINT_TIME LAST_CHANGE# LAST_TIME
---------- ------------------------------------------------------------ ------------------ ------------------- ------------ -------------------
1 /oradata/enmo/system01.dbf 792555
2 /oradata/enmo/sysaux01.dbf 792555
3 /oradata/enmo/undotbs01.dbf 792555
4 /oradata/enmo/users01.dbf 792555
5 /oradata/enmo/hsql01.dbf 792555
6 /oradata/enmo/hsql02.dbf 792555
6 rows selected.
FILE# NAME STATUS TS# RFILE# RESETLOGS_CHANGE# RESETLOGS_TIME CHECKPOINT_CHANGE# CHECKPOINT_TIME CHECKPOINT_COUNT ERROR REC FUZ
---------- ------------------------------------------------------------ ---------- ---------- ---------- ----------------- ------------------- ------------------ ------------------- ---------------- -------------------- --- ---
1 /oradata/enmo/system01.dbf ONLINE 0 1 791853 2021-10-08 20:04:33 792473 2021-10-08 20:12:51 367 YES YES
2 /oradata/enmo/sysaux01.dbf ONLINE 1 2 791853 2021-10-08 20:04:33 792473 2021-10-08 20:12:51 367 YES YES
3 /oradata/enmo/undotbs01.dbf ONLINE 2 3 791853 2021-10-08 20:04:33 792473 2021-10-08 20:12:51 367 YES YES
4 /oradata/enmo/users01.dbf ONLINE 4 4 791853 2021-10-08 20:04:33 792473 2021-10-08 20:12:51 367 YES YES
5 /oradata/enmo/hsql01.dbf ONLINE 5 5 791853 2021-10-08 20:04:33 792473 2021-10-08 20:12:51 139 YES YES
6 /oradata/enmo/hsql02.dbf ONLINE 5 6 791853 2021-10-08 20:04:33 792473 2021-10-08 20:12:51 144 YES YES
6 rows selected.
SQL> recover database;
Media recovery complete.
SQL> alter database open;
Database altered.
SQL>
复制
5. 经验总结
1) v$log中日志文件信息是从控制文件中获取,所以old controlfile中显示的日志文件scn不准确,造成数据库media recover无法完成。 2) 重建控制文件后,v$database.CHECKPOINT_CHANGE和v$datafile.CHECKPOINT_CHANGE以数据文件头和日志文件中的最大值为准。 3) 日志文件和数据文件未损坏可以进行完全恢复。 4) 日志切换时并不会立即触发完全检查点,当所有日志状态为current/active时,日志切换进程会产生等待, alert日志显示,“Thread 1 cannot allocate new log, sequence 56”,本次切换日志会立即触发高级别全量检查点。
复制
最后修改时间:2021-10-15 08:48:25
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
647次阅读
2025-04-18 14:18:38
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
624次阅读
2025-04-15 17:24:06
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
523次阅读
2025-04-20 10:07:02
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
521次阅读
2025-04-08 09:12:48
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
479次阅读
2025-04-22 00:20:37
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
470次阅读
2025-04-17 17:02:24
Oracle 19c RAC更换IP实战,运维必看!
szrsu
455次阅读
2025-04-08 23:57:08
一页概览:Oracle GoldenGate
甲骨文云技术
454次阅读
2025-04-30 12:17:56
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
449次阅读
2025-04-22 00:13:51
火焰图--分析复杂SQL执行计划的利器
听见风的声音
400次阅读
2025-04-17 09:30:30
热门文章
oracle drop table purge无备份bbed恢复
2021-01-25 6757浏览
20230704_一键安装Oracle11g/19C/21C_单机/RAC集群/standalone/PostgreSQL_工具分享_开放源码
2021-11-04 5236浏览
20211119_一键安装Oracle 21C RAC_1731秒完成
2021-11-19 4856浏览
Oracle异常恢复_ORA-01189: file is from a different RESETLOGS than previous files
2021-08-11 4211浏览
从问题出发,解密Oracle rdba结构
2021-07-23 4134浏览
目录