ORA-01207: file is more recent than control file - old control file

晚上朋友电话说Oracle数据库突然因存储故障crash,启库时报错ORA-01122 ORA-01110 ORA-01207
报错信息如下:
SQL> startup;
ORACLE instance started.
Total System Global Area 1509949440 bytes
Fixed Size                  2084208 bytes
Variable Size             419431056 bytes
Database Buffers         1073741824 bytes
Redo Buffers               14692352 bytes
Database mounted.
ORA-01122: database file 15 failed verification check
ORA-01110: data file 15: '/oradata/db11g/ix_test1o2.dbf'
ORA-01207: file is more recent than control file - old control file
也就是说:控制文件中记录的db信息太老,导致数据库在启动检测时出现不一致。(数据库服务器突然掉电也出现这种问题)

操作系统:AIX 5.3
数据库:10.2.0.4

原理分析
根据oracle db运行原理,数据库在运行期间,由于检查点发生等原因会不断的更新控制文件,同时数据库在关闭和重启过程中都会更新控制文件的内容,
但是数据库服务器突然的掉电,会导致当前的db信息无法适时更新到控制文件中,再次启动数据库后,当oracle检测控制文件和其它文件信息是否一致时,
就出现了这个错误。


参照mos文档:
ORA-1122, ORA-1110, ORA-1207 while open the database after crash (文档 ID 283927.1)
How to Recreate a Controlfile (文档 ID 735106.1)


处理步骤:
1.数据库启动到mount状态
SQL> Startup mount
2.将控制文件信息备份到trace文件,并找到相应的trc
SQL> Alter database backup controlfile to trace;
SQL> oradebug setmypid;
SQL> oradebug tracefile_name;
3.使用trace文件信息,生成用于重建控制文件的sql脚本。
vi create.sql
将trace文件中的从CREATE CONTROLFILE REUSE DATABASE 到 CHARACTER SET ZHS16GBK; 字符集之间的内容编辑到create.sql中。
4.将数据库关闭并启动到nomount状态
SQL> shutdown abort
SQL> startup nomount
5.使用create.sql创建新的控制文件
SQL>@create.sql
6.恢复数据库
SQL> recover database;
7.打开数据库
SQL> Alter database open;

步骤实例:
SQL> startup;
ORACLE instance started.

Total System Global Area 1509949440 bytes
Fixed Size                  2084208 bytes
Variable Size             419431056 bytes
Database Buffers         1073741824 bytes
Redo Buffers               14692352 bytes
Database mounted.
ORA-01122: database file 15 failed verification check
ORA-01110: data file 15: '/oradata/db11g/ix_test1o2.dbf'
ORA-01207: file is more recent than control file - old control file
--启动报错

SQL> shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.

1.数据库启动到mount状态
SQL> Startup mount
ORACLE instance started.

Total System Global Area 1509949440 bytes
Fixed Size                  2084208 bytes
Variable Size             419431056 bytes
Database Buffers         1073741824 bytes
Redo Buffers               14692352 bytes
Database mounted.

2.将控制文件信息备份到trace文件,并找到相应的trc
SQL> Alter database backup controlfile to trace;
Database altered.
SQL> oradebug setmypid;
Statement processed.
SQL> SQL> oradebug tracefile_name;
/u01/app/oracle/diag/rdbms/db11g/db11g/trace/db11g_ora_1231.trc

3.使用trace文件信息,生成用于重建控制文件的sql脚本。
将trace文件中的从CREATE CONTROLFILE REUSE DATABASE 到 CHARACTER SET ZHS16GBK; 字符集之间的内容编辑到create.sql中。
vi create.sql 并写入trace文件中如下内容并保存(注意:这里只是个实例,实际内容是生成的trace文件内容
CREATE CONTROLFILE REUSE DATABASE "DB11G" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 192
    MAXLOGMEMBERS 3
    MAXDATAFILES 30720
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/oradata/db11g/redo01.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 '/oradata/db11g/redo02.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 '/oradata/db11g/redo03.log'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/oradata/db11g/system01.dbf',
  '/oradata/db11g/sysaux01.dbf',
  '/oradata/db11g/test1o7.dbf',
  '/oradata/db11g/users01.dbf',
  '/oradata/db11g/example01.dbf',
  '/oradata/db11g/test1o1.dbf',
  '/oradata/db11g/ix_test1o1.dbf',
  '/oradata/db11g/test1o2.dbf',
  '/oradata/db11g/test1o3.dbf',
  '/oradata/db11g/ogg01.dbf',
  '/oradata/db11g/test1o4.dbf',
  '/oradata/db11g/test1o5.dbf',
  '/oradata/db11g/test1o6.dbf',
  '/oradata/db11g/undotbs2.dbf',
  '/oradata/db11g/ix_test1o2.dbf'
CHARACTER SET ZHS16GBK
;

4.将数据库关闭并启动到nomount状态
SQL> shutdown abort
ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.

Total System Global Area 1509949440 bytes
Fixed Size                  2084208 bytes
Variable Size             419431056 bytes
Database Buffers         1073741824 bytes
Redo Buffers               14692352 bytes

5.使用create.sql创建新的控制文件
SQL> @createc.sql
Control file created.

6.恢复数据库(可能会需要一点时间)
SQL> recover database;
Media recovery complete.
7.打开数据库
SQL> Alter database open;
Database altered.
--至此数据库成功OPEN。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31043804/viewspace-2140237/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31043804/viewspace-2140237/

ORA-01665 错误表示当前的控制文件不是备用控制文件,无法用于备用库的恢复。要解决这个问题,您可以按照以下步骤操作: 1. 首先,确认当前的控制文件是否确实是备用控制文件。可以使用以下 SQL 语句查询: ``` SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME = 'control_files'; ``` 如果查询结果中只包含备用控制文件的路径,则说明当前的控制文件是备用控制文件。如果查询结果中包含多个控制文件路径,您需要确认其中哪一个是备用控制文件。 2. 如果确认当前的控制文件不是备用控制文件,则需要将其替换为备用控制文件。可以按照以下步骤进行操作: - 连接到主数据库,并使用以下命令生成备用控制文件的副本: ``` ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/path/to/standby/controlfile'; ``` - 将备用控制文件的副本传输到备用数据库,并将其命名为“control01.ctl”。 - 在备用数据库上,停止实例并将控制文件更名为“control02.ctl”。 - 将备用控制文件的副本复制到“control02.ctl”的位置。 - 启动实例并尝试启动备用数据库。 3. 如果确认当前的控制文件是备用控制文件,但仍然出现ORA-01665错误,则可能是由于备用控制文件的元数据与主数据库的控制文件不匹配导致的。您可以按照以下步骤解决此问题: - 在备用数据库上,停止实例并备份当前的控制文件。 - 使用以下命令删除当前的控制文件: ``` ALTER DATABASE RENAME FILE '/path/to/controlfile' TO '/path/to/controlfile.bak'; ``` - 将备用控制文件的副本复制到主数据库的控制文件所在的位置。 - 启动实例并尝试启动备用数据库。 通过以上操作,您应该能够解决ORA-01665错误并成功启动备用数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值