Oracle控制文件解析

宁愿做一朵篱下的野花,不愿做一朵受恩惠的蔷薇。与其逢迎献媚,偷取别人的欢心,毋宁被众人所鄙弃!---------《莎士比亚》

一、oracle控制文件内容

控制文件至少包含以下信息:

数据库名

数据库标识符(DBID)

数据库创建时间戳

数据库字符集

数据文件信息

临时文件信息

在线重做日志信息

近期的归档日志信息

表空间信息

RMAN备份文件信息

检查点信息

损坏的数据块注册表

还原点信息

重设日志SCN

脏数据块的数量

二、转储控制文件内容

控制文件是一个二进制文件,为了查看其内容,我们可以通过oracle命令转储出来进行查看(以下命令来自oracle 11g):

SQL> alter session set events 'immediate trace name controlf level 8';

Session altered.

SQL> select value from v$diag_info where name='Default Trace File';

VALUE

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

/oracle/app/oracle/diag/rdbms/orcl/ORCL/trace/ORCL_ora_8575.trc

打开跟踪日志文件,查看转储内容:

2.1,查看到数据库ID、名称等内容:

*** 2018-01-16 00:06:31.492

V10 STYLE FILE HEADER:

Compatibility Vsn = 186646528=0xb200000

Db ID=1359212177=0x5103ee91, Db Name='ORCL'

Activation ID=0=0x0

File Number=0, Blksiz=16384, File Type=1 CONTROL

2.2,数据库条目的详细信息,其中包括数据库文件及日志文件数量、检查点等信息:

DATABASE ENTRY

***************************************************************************

(size = 316, compat size = 316, section max = 1, section in-use = 1,

last-recid= 0, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 1, numrecs = 1)

05/19/2015 20:09:17

DB Name "ORCL"

Controlfile Creation Timestamp 05/19/2015 20:09:18

Incmplt recovery scn: 0x0000.00000000

Resetlogs scn: 0x0000.00127834 Resetlogs Timestamp 05/21/2015 19:48:06

Prior resetlogs scn: 0x0000.00000001 Prior resetlogs Timestamp 11/14/2013 01:10:41

Redo Version: compatible=0xb200000

#Data files = 7, #Online files = 7

Database checkpoint: Thread=1 scn: 0x0000.001ff6b1

Threads: #Enabled=1, #Open=1, Head=1, Tail=1

。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。

Max log members = 3, Max data members = 1

Arch list: Head=2, Tail=2, Force scn: 0x0000.001f09d2scn: 0x0000.001ff6b0

Controlfile Checkpointed at scn: 0x0000.001ff75e 01/16/2018 00:06:18

thread:0 rba:(0x0.0.0)

2.3,接下来是检查点计数条目:

CHECKPOINT PROGRESS RECORDS

***************************************************************************

(size = 8180, compat size = 8180, section max = 11, section in-use = 0,

last-recid= 0, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 2, numrecs = 11)

THREAD #1 - status:0x2 flags:0x0 dirty:63

low cache rba:(0x35.3.0) on disk rba:(0x35.b2.0)

on disk scn: 0x0000.001ff798 01/16/2018 00:06:29

heartbeat: 965487596 mount id: 1493283675

Flashback log tail log# 1 thread# 1 seq 32 block 102 byte 0

。。。。。。。。。。。。。。。。。。。。。。。。。。

2.4,补充数据库条目

EXTENDED DATABASE ENTRY

***************************************************************************

(size = 900, compat size = 900, section max = 1, section in-use = 1,

last-recid= 0, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 236, numrecs = 1)

Control AutoBackup date(dd/mm/yyyy)=16/11/2016

Next AutoBackup sequence= 1

Database recovery target inc#:2, Last open inc#:2

flg:0x0, flag:0x1

。。。。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。

2.5,重做线程条目

REDO THREAD RECORDS

***************************************************************************

(size = 256, compat size = 256, section max = 8, section in-use = 1,

last-recid= 0, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 9, numrecs = 8)

THREAD #1 - status:0xbf thread links forward:0 back:0

#logs:3 first:1 last:3 current:2 last used seq#:0x35

opened at 01/16/2018 00:06:06 by instance ORCL

Checkpointed at scn: 0x0000.001ff6b1 01/16/2018 00:06:06

。。。。。。。。。。。。。。。。。。。。。。。。。。。

2.6,日志文件条目

LOG FILE RECORDS

***************************************************************************

(size = 72, compat size = 72, section max = 16, section in-use = 16,

last-recid= 3, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 10, numrecs = 16)

LOG FILE #1:

name #1: /oracle/app/data/ORCL/redo01.log

。。。。。。。。。。。。。。。。。。。。。。。。。。。。

2.7,数据文件条目

DATA FILE RECORDS

***************************************************************************

(size = 520, compat size = 520, section max = 300, section in-use = 7,

last-recid= 11, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 11, numrecs = 300)

DATA FILE #1:

name #8: /oracle/app/data/ORCL/system01.dbf

creation size=0 block size=8192 status=0xe head=8 tail=8 dup=1

tablespace 0, index=1 krfil=1 prev_file=0

。。。。。。。。。。。。。。。。。。。。。。。。。。。。

2.8其他

由于内容太多,有兴趣的朋友可以自己转储控制文件进行查看,转储内容后续还有临时文件条目、表空间条目、rman配置条目、闪回日志文件条目、进程实例映射条目等多个记录信息。

三、控制文件操作

3.1,视图信息

有3种途径查看控制文件信息:

SQL> select name from v$controlfile

SQL>show parameter controfiles;

SQL>select name,value from v$parameter where name='control_files';

3.2,控制文件记录内容

SQL>select * from v$controlfile_record_section;

3.3,普通查看控制文件内容

a,通过strings查看

[oracle@oracle11g ~]$ strings /oracle/app/data/ORCL/control01.ctlmore

}{z

QORCL

TAG20150521T193139

x44x

u4ORCL

u4ORCL

ORCL

ORCL

/oracle/app/data/ORCL/redo01.log

/oracle/app/data/ORCL/redo03.log

。。。。。。。。。。。。。。。。。。。。。。

b,备份出来查看

SQL> alter database backup controlfile to trace as '/oracle/app/control180116.ora';

Database altered.

[root@oracle11g ~]# more /oracle/app/control180116.ora

-- The following are current System-scope REDO Log Archival related

-- parameters and can be included in the database initialization file.

--

-- LOG_ARCHIVE_DEST=''

-- LOG_ARCHIVE_DUPLEX_DEST=''

。。。。。。。。。。。。。。。。。。。。

3.4,控制文件个数修改

a,减少控制文件(spfile)

SQL>startup

SQL>alter system set control_files='/opt/oracle/data/orcl/control01.ctl';

SQL>shutdown immediate

SQL>startup

b,增加控制文件个数

SQL>alter system set control_files='/opt/oracle/data/orcl/control01.ctl','/opt/oracle/data/orcl/contorl02.ctl' scope=spfile

如果出现control file版本不一致的情况,那么把版本高的拷贝给版本低的

再执行:

SQL>alter database mount;

SQL>alter database open;

3.5,控制文件备份

alter database backup controlfile to '/opt/oracle/data/orcl/control2013.bak';(归档模式下才有用)

alter databae backup controlfile to trace as '';(任何模式下)

rman备份:

backup current controlfile;

backup database include current controlfile;

四,控制文件问题

4.1,控制文件丢失,尚存在部分控制文件

SQL>show parameter control_files;

根据参数显示的控制文件个数,拷贝尚存在的控制文件到不存在的控制文件

4.2,控制文全部丢失

a,非归档模式下

先全备,然后建立新的控制文件即可

建立控制文件过程:

(1),确认数据文件个数和路径

(2),确认重做日志文件个数和路径

(3),查看alert_sid.log日志信息,查看数据库信息(做过控制文件信息转出)

(4),创建控制文件

SQL>create controlfile reuse database orcl noarchivelog noresetlogs

maxlogfiles 16

maxinstances 8

maxlogmembers 3

maxloghistory 1

datafile

'/u01/oracle/oradata/orcl/example01.dbf',

'/uo1/oracle/oradata/orcl/system01.dbf',

'/u01/oracle/oradata/orcl/sysaux01.dbf',

'u01/oracle/oradata/orcl/undotbs01.dbf'

logfile

group 1 '/u01/oracle/oradata/orcl/redo01.log' size 50M,

group 2 '/u01/oracle/oradata/orcl/redo02.log' size 50M,

group 3 '/u01/oracle/oradata/orcl/redo02.log' size 50M

character set ZHS16GBK

SQL>alter database open;

ERROR at line 1:

ORA-01113:file 1 needs media recovery

ORA-01110:data file 1: 'u01/oracle/oradata/orcl/system01.dbf'

SQL>recover database;

media recovery complete.

SQL>alter database open;

database altered

注意:如果数据库不能打开,只能通过加隐藏参数来进行数据库打开

重做控制文件,redo日志文件必须存在

建立脚本时,需加入noarchivelog,noresetlog

b,归档模式下,控制文件的恢复

SQL>alter database backup controlfile to '/u01/oracle/oradata/ctlbak.ctl';

控制文件丢失

恢复之前,先做一起全备

SQL> ho cp /u01/oracle/oradata/ctlbak.ctl /u01/oracle/oradata/orcl/control01.ctl

SQL> ho cp /u01/oracle/oradata/ctlbak.ctl /u01/oracle/oradata/orcl/control02.ctl

SQL> ho cp /u01/oracle/oradata/ctlbak.ctl /u01/oracle/oradata/orcl/control03.ctl

SQL>alter database mount;

ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

SQL>alter database recover database using backup controlfile;

ORA-00279:change 1071696 generated at 09/10/2009 10:09:55 needed for thread 1

ORA-00289:suggestion: ..............

ORA-00280:change 1071696 for thread 1 is in sequence

SQL>alter database recover database using backup controlfile until change 1071696

ORA-00279:change 1071696 generated at 09/10/2009 10:09:55 needed for thread 1

ORA-00289:suggestion: ..............

ORA-00280:change 1071696 for thread 1 is in sequence

不存在备份,数据库不一致,存在问题

SQL>alter database open resetlogs;

加入隐藏参数进行问题的解决

SQL>alter system set "_allow_resetlogs_corruption"=true scope=spfile;

SQL>startup force

SQL>alter database open resetlogs;

如果存在备份

SQL>alter database open resetlogs;

SQL>recover database;

SQL>recover database using backup controlfile

ORA-00279:change 1092015 generated at 09/10/2009 10:30:34 needed for thread 1

ORA-00289:suggestion:

/u01/oracle/flash_recovery_area/ORCL/archivelog/...........

ORA-00280

Specify log:

/u01/oracle/oradata/orcl/redo01.log

Log applied.

Media recovery complete.

SQL>alter database open resetlogs;

五,概述

oracle控制文件记录了大量的数据库核心信息,是数据库运行不可缺少的一部分。为保障数据的稳定和安全,学习和了解数据库控制文件的作用及核心极有必要,对于上述内容,如若存在错误和问题,还望指正,谢谢!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180116G0LPOJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券