好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Oracle重建控制文件的实例教程

前言

控制文件(control file)是一个相当小的文件(最多能增长到64M左右),其中包含Oracle需要的其他文件的一个目录。参数文件告知实例控制文件的位置,控制文件则告知示例数据库和在线重做日志文件的位置。控制文件还告知了Oracle其他一些事情,如已发生检查点的有关信息、数据库名(必须和db_name参数匹配)、创建数据库的时间戳、归档重做日志的历史(有时这会让控制文件变大)、RMAN信息等。

环境:OEL 5.7 + Oracle 10.2.0.5

背景:在Oracle的运维过程中,时常会遇到一些场景是需要重建控制文件才可以解决的。本文的场景可以通过复制控制文件到新路径,运行一段时间后,再用老的控制文件启动数据库重现。

1.当前故障现象

在使用旧的控制文件启动数据库时,报错ORA-01122、ORA-01110、ORA-01207:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

SQL> shutdown abort

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

 

Total System Global Area 599785472 bytes

Fixed Size    2098112 bytes

Variable Size   218106944 bytes

Database Buffers  373293056 bytes

Redo Buffers  6287360 bytes

Database mounted.

ORA-01122: database file 1 failed verification check

ORA-01110: data file 1: '/oradata/cxywdb/system01.dbf'

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

2.分析故障原因

根据报错信息查找MOS文档:

ORA-1122, ORA-1110, ORA-1207 while open the database after crash (文档 ID 283927.1)

延伸思考一下,为什么会这样?

主要错误是ORA-01207,利用oerr工具看到Oralce对这个错误的详细描述是:

01207, 00000, "file is more recent than control file - old control file"
// *Cause:  The control file change sequence number in the data file is
//         greater than the number in the control file. This implies that
//         the wrong control file is being used. Note that repeatedly causing
//         this error can make it stop happening without correcting the real
//         problem. Every attempt to open the database will advance the
//         control file change sequence number until it is great enough.
// *Action: Use the current control file or do backup control file recovery to
//         make the control file current. Be sure to follow all restrictions
//         on doing a backup control file recovery.

一般遇到这种情况,当前的控制文件肯定是找不到了。那么就得考虑重建控制文件来解决,MOS给出的建议也是重建控制文件。

3.重建控制文件

重建控制文件的核心步骤:

3.1 备份控制文件到trace

?

1

2

3

4

startup mount

alter database backup controlfile to trace;

oradebug setmypid

oradebug tracefile_name

3.2 启动数据库到nomount状态

?

1

2

shutdown abort

startup nomount;

3.3 确认重建控制文件的语句

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

vi control.sql

CREATE CONTROLFILE REUSE DATABASE "CXYWDB" NORESETLOGS FORCE LOGGING ARCHIVELOG

  MAXLOGFILES 16

  MAXLOGMEMBERS 3

  MAXDATAFILES 100

  MAXINSTANCES 8

  MAXLOGHISTORY 292

LOGFILE

  GROUP 5 '/oradata2/cxywdb/redo11.log' SIZE 50M,

  GROUP 6 '/oradata2/cxywdb/redo12.log' SIZE 50M,

  GROUP 7 '/oradata2/cxywdb/redo13.log' SIZE 50M

-- STANDBY LOGFILE

DATAFILE

  '/oradata/cxywdb/system01.dbf' ,

  '/oradata/cxywdb/undotbs01.dbf' ,

  '/oradata/cxywdb/sysaux01.dbf' ,

  '/oradata/cxywdb/users01.dbf' ,

  '/oradata/cxywdb/alfred01.dbf' ,

  '/oradata/cxywdb/alfred02.dbf' ,

  '/oradata/cxywdb/alfred03.dbf' ,

  '/oradata/cxywdb/alfred04.dbf' ,

  '/oradata/cxywdb/alfred05.dbf' ,

  '/oradata/cxywdb/dbs_i_alfred01.dbf'

CHARACTER SET ZHS16GBK

;

3.4 恢复并打开数据库

?

1

2

3

4

SQL> recover database ;

Media recovery complete.

SQL> alter database open ;

Database altered.

附:实际解决过程如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

SQL> shutdown abort 

ORACLE instance shut down.

SQL> startup mount

 

ORACLE instance started.

 

Total System Global Area 599785472 bytes

Fixed Size      2098112 bytes

Variable Size     218106944 bytes

Database Buffers   373293056 bytes

Redo Buffers    6287360 bytes

Database mounted.

SQL> alter database backup controlfile to trace;

 

Database altered.

 

SQL> oradebug setmypid

Statement processed.

SQL> oradebug tracefile_name

/s01/oracle/admin/cxywdb/udump/cxywdb_ora_3983.trc

SQL> shutdown abort

ORACLE instance shut down.

SQL> startup nomount;

ORACLE instance started.

 

Total System Global Area 599785472 bytes

Fixed Size      2098112 bytes

Variable Size     218106944 bytes

Database Buffers   373293056 bytes

Redo Buffers    6287360 bytes

SQL> @control

 

Control file created.

SQL> select status from v$instance;

 

STATUS

------------

MOUNTED

 

SQL> recover database ;

Media recovery complete.

SQL> alter database open ;

 

Database altered.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:https://www.cnblogs.com/jyzhao/p/9075427.html

查看更多关于Oracle重建控制文件的实例教程的详细内容...

  阅读:32次