Oralce数据库控制文件的管理

前言

[TOC]

控制文件是一个相当小的文件,其中包含Oracle需要的其他文件的一个目录。参数文件告知实例控制文件的位置,控制文件则告知示例数据库和在线重做日志文件的位置。控制文件还告知了Oracle其他一些事情,如已发生检查点的有关信息、数据库名、创建数据库的时间戳、归档重做日志的历史、RMAN信息等。

一、什么是控制文件

控制文件是Oracle数据库中极其重要的文件,该文件是一个二进制文件,记载了数据库的当前状态。每一个控制文件只属于一个数据库,但为了防止控制文件的丢失,一个数据库一般不止一个控制文件。在数据库装载或打开前,Oracle服务器必须能够访问控制文件,如果访问不了,数据库就无法正常工作。因此要采取多路复用的方法,数据库至少需要两个控制文件,为防止磁盘的故障,这些控制文件最好放在不同的物理磁盘上。

环境:OEL 5.7 + Oracle 10.2.0.5

二、控制文件的内容

从Oracle的官方文档可以知道控制主要存放以下这些信息:

  • The database name
  • Names and locations of associated data files and redo log files
  • The timestamp of the database creation
  • The current log sequence number
  • Checkpoint information

对应的翻译大致是:

  • 数据库的名字
  • 数据文件和重做日志文件的名字和位置
  • 数据库创建的时间戳
  • 当前日志的序列号
  • 检查点信息

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

三、查询控制文件的信息

  1. v$controlfile:列出实例的所有控制文件的名字和状态
    select * from v$controlfile;
    永利网址 1
  2. v$parameter:列出所有参数的位置和状态
    col value for a30
    select name,value from v$parameter where name=’control_files’;
    永利网址 2
    3.show parameter control_files:列出控制文件的名字,状态,位置
    show parameter control_files
    永利网址 3

1.当前故障现象

四、如何增加或减少控制文件

  1. 增加控制文件
    大致步骤如下:
    1)修改参数文件
    2)一致性关闭数据库
    3)复制控制文件到指定位置
    4)启动数据库
    5)检查控制文件个数
    实际操作:
    1)修改参数文件
    SQL> alter system set
    control_files=’/u01/app/oracle/oradata/orcl/control01.ctl’,
    2 ‘/u01/app/oracle/oradata/orcl/control02.ctl’,
    3 ‘/u01/app/oracle/oradata/orcl/control03.ctl’
    4 scope=spfile;
    System altered.
    2) 一致性关闭数据库
    SQL> shutdown immediate
    3)复制控制文件到指定位置
    host cp /u01/app/oracle/oradata/orcl/control01.ctl
    /u01/app/oracle/oradata/orcl/control03.ctl
    4)启动数据库
    SQL> startup
    5)检查控制文件个数
    select status,name from v$controlfile;
    STATUS NAME


    /u01/app/oracle/oradata/orcl/control01.ctl
    /u01/app/oracle/oradata/orcl/control02.ctl
    /u01/app/oracle/oradata/orcl/control03.ctl
  2. 减少控制文件
    实际操作与增加控制文件的类似,如下:
    1)修改参数文件
    2)一致性关闭数据库
    3)启动数据库
    4)检查控制文件个数

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

五、控制文件的备份

  1. 备份为二进制文件
    alter database backup controlfile to ‘/u02/backup/control.bak’;
  2. 备份为跟踪文件
    alter database backup controlfile to trace [as
    ”],trace后面的是可选项,如果不指定将把跟踪文件的路径保存在user_dump_dest目录下,具体文件名可以在该目录的alert_.log里面查找到。
    永利网址 4
    或者执行以下脚本即可查询跟踪文件的位置
    select d.value
    || ‘/’
    || lower(rtrim(i.instance,chr(0)))
    || ‘ora
    || p.spid
    || ‘.trc’ trace_file_name
    from (select p.spid
    from v$mystat m,v$session s,v$process p
    where m.statistic#=1 and s.sid=m.sid and p.addr=s.paddr) p,
    (select t.instance from v$thread t,v$parameter v
    where v.name=’thread’
    and (v.value=0 or t.thread#=to_number(v.value))) i,
    (select value from v$parameter where name=’user_dump_dest’) d;
    永利网址 5
SQL shutdown abortORACLE instance shut down.SQL startupORACLE instance started.Total System Global Area 599785472 bytesFixed Size 2098112 bytesVariable Size 218106944 bytesDatabase Buffers 373293056 bytesRedo Buffers 6287360 bytesDatabase mounted.ORA-01122: database file 1 failed verification checkORA-01110: data file 1: '/oradata/cxywdb/system01.dbf'ORA-01207: file is more recent than control file - old control file

六、归档模式下控制文件的恢复

  1. 多个控制文件,一个损坏或丢失的情况
    解决办法:用其他控制文件去替换丢失的控制文件
    模拟故障:
    1) 查看控制文件的信息
    SQL> select status,name from v$controlfile;
    STATUS NAME


    /u01/app/oracle/oradata/orcl/control01.ctl
    /u01/app/oracle/oradata/orcl/control02.ctl
    /u01/app/oracle/oradata/orcl/control03.ctl
    2)删除第一个控制文件
    [oracle ~]$ rm -f /u01/app/oracle/oradata/orcl/control01.ctl
    3)重启数据库,会提示报错,无法定位到控制文件
    SQL> startup force
    ORACLE instance started.
    Total System Global Area 521936896 bytes
    Fixed Size 2214936 bytes
    Variable Size 461374440 bytes
    Database Buffers 50331648 bytes
    Redo Buffers 8015872 bytes
    ORA-00205: error in identifying control file, check alert log for
    more info

    4)把数据库启动到nomount阶段,并用其他控制文件替换丢失的控制文件
    SQL> shutdown
    ORA-01507: database not mounted
    ORACLE instance shut down.
    SQL> startup nomount
    ORACLE instance started.
    Total System Global Area 521936896 bytes
    Fixed Size 2214936 bytes
    Variable Size 461374440 bytes
    Database Buffers 50331648 bytes
    Redo Buffers 8015872 bytes
    SQL> host cp /u01/app/oracle/oradata/orcl/control02.ctl
    /u01/app/oracle/oradata/orcl/control01.ctl

    5)将数据库启动到mount阶段,然后open数据库
    SQL> alter database mount ;
    Database altered.
    SQL> alter database open;
    Database altered.
    SQL> select status,name from v$controlfile;
    STATUS NAME


    /u01/app/oracle/oradata/orcl/control01.ctl
    /u01/app/oracle/oradata/orcl/control02.ctl
    /u01/app/oracle/oradata/orcl/control03.ctl
  2. 控制文件全部丢失,使用备份控制文件恢复,前提是联机日志完好的情况
    1) 查看控制文件和redo日志的信息
    SQL> select status,name from v$controlfile;
    STATUS NAME


    /u01/app/oracle/oradata/orcl/control01.ctl
    /u01/app/oracle/oradata/orcl/control02.ctl
    /u01/app/oracle/oradata/orcl/control03.ctl
    SQL> select member from v$logfile;

    MEMBER

    /u01/app/oracle/oradata/orcl/redo01.log
    /u01/app/oracle/oradata/orcl/redo03a.log
    /u01/app/oracle/oradata/orcl/redo02.log
    /u01/app/oracle/oradata/orcl/redo02a.log
    2) 模拟删除全部控制文件
    [oracle backup]$ rm -f
    /u01/app/oracle/oradata/orcl/control*.ctl
    3) 重启数据库报错
    SQL> startup
    ORACLE instance started.
    Total System Global Area 521936896 bytes
    Fixed Size 2214936 bytes
    Variable Size 461374440 bytes
    Database Buffers 50331648 bytes
    Redo Buffers 8015872 bytes
    ORA-00205: error in identifying control file, check alert log for
    more info

    4) 复制备份的控制文件
    SQL> host cp /u02/backup/control01.ctl
    /u01/app/oracle/oradata/orcl/control01.ctl
    SQL> host cp /u02/backup/control01.ctl
    /u01/app/oracle/oradata/orcl/control02.ctl
    SQL> host cp /u02/backup/control01.ctl
    /u01/app/oracle/oradata/orcl/control03.ctl
    5) 重新启动数据库,会提示备份的控制文件中数据文件不一致的错误
    SQL> shutdown
    ORA-01109: database not open
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup
    ORACLE instance started.
    Total System Global Area 521936896 bytes
    Fixed Size 2214936 bytes
    Variable Size 461374440 bytes
    Database Buffers 50331648 bytes
    Redo Buffers 8015872 bytes
    Database mounted.
    ORA-01122: database file 1 failed verification check
    ORA-01110: data file 1:
    ‘/u01/app/oracle/oradata/orcl/system01.dbf’
    ORA-01207: file is more recent than control file – old control
    file

    6) 逐个用redo日志去恢复数据库,直到提示介质恢复成功为止
    SQL> recover database using backup controlfile
    —执行该命令,使用备份控制文件去恢复数据库
    ORA-00279: change 3258533 generated at 10/23/2017 23:30:51 needed
    for thread 1
    ORA-00289: suggestion :
    /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2017_10_23/o1_mf_1_83_%u_.arc
    ORA-00280: change 3258533 for thread 1 is in sequence #83
    Specify log: {=suggested | filename | AUTO | CANCEL}
    /u01/app/oracle/oradata/orcl/redo03a.log —逐个输入redo日志的路径
    Log applied.
    Media recovery complete. —直到出现提示介质恢复成功
    7) open数据库
    SQL> alter database open resetlogs;
    —使用resetlogs打开数据库,重置redo日志,使其与控制文件保持一致性
    Database altered.
    8) 全备数据库

  3. 全部控制文件丢失,重建控制文件来恢复,前提是联机日志完好的情况
    1) 查看控制文件和redo日志的信息
    SQL> select status,name from v$controlfile;
    STATUS NAME


    /u01/app/oracle/oradata/orcl/control01.ctl
    /u01/app/oracle/oradata/orcl/control02.ctl
    /u01/app/oracle/oradata/orcl/control03.ctl
    SQL> select member from v$logfile;

    MEMBER

    /u01/app/oracle/oradata/orcl/redo01.log
    /u01/app/oracle/oradata/orcl/redo03a.log
    /u01/app/oracle/oradata/orcl/redo02.log
    /u01/app/oracle/oradata/orcl/redo02a.log
    2) 模拟删除全部控制文件
    [oracle backup]$ rm -f
    /u01/app/oracle/oradata/orcl/control*.ctl
    3)重启数据库,会提示报错,无法定位到控制文件
    SQL> startup force
    ORACLE instance started.
    Total System Global Area 521936896 bytes
    Fixed Size 2214936 bytes
    Variable Size 461374440 bytes
    Database Buffers 50331648 bytes
    Redo Buffers 8015872 bytes
    ORA-00205: error in identifying control file, check alert log for
    more info

    4) 启动到nomount阶段,重建控制文件
    SQL> startup nomount
    ORACLE instance started.
    Total System Global Area 521936896 bytes
    Fixed Size 2214936 bytes
    Variable Size 461374440 bytes
    Database Buffers 50331648 bytes
    Redo Buffers 8015872 bytes
    SQL> @/home/scripts/create_controlfile.sql
    —-执行创建控制文件的脚本
    Control file created. —创建完成
    脚本可以从之前备份的跟踪文件里面获取,内容如下:
    CREATE CONTROLFILE REUSE DATABASE “ORCL” NORESETLOGS ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
    LOGFILE
    GROUP 1 ‘/u01/app/oracle/oradata/orcl/redo01.log’ SIZE 50M BLOCKSIZE
    512,
    GROUP 2 (
    ‘/u01/app/oracle/oradata/orcl/redo02.log’,
    ‘/u01/app/oracle/oradata/orcl/redo02a.log’
    ) SIZE 50M BLOCKSIZE 512,
    GROUP 3 ‘/u01/app/oracle/oradata/orcl/redo03a.log’ SIZE 50M
    BLOCKSIZE 512
    — STANDBY LOGFILE
    DATAFILE
    ‘/u01/app/oracle/oradata/orcl/system01.dbf’,
    ‘/u01/app/oracle/oradata/orcl/sysaux01.dbf’,
    ‘/u01/app/oracle/oradata/orcl/undotbs01.dbf’,
    永利网址,’/u01/app/oracle/oradata/orcl/users01.dbf’,
    ‘/home/disk1/jinlian01.dbf’,
    ‘/home/disk2/jinlian02.dbf’,
    ‘/home/disk1/pioneer_data.dbf’,
    ‘/home/ts_example/ts_example.dbf’,
    ‘/home/disk2/pioneer_index.dbf’
    CHARACTER SET ZHS16GBK
    ;
    5) open数据库,并进行介质恢复
    SQL> alter database open;
    alter database open

  • ERROR at line 1:
    ORA-01113: file 1 needs media recovery —-提示需要介质恢复
    ORA-01110: data file 1:
    ‘/u01/app/oracle/oradata/orcl/system01.dbf’
    SQL>
    SQL> recover database —-恢复数据库
    Media recovery complete.
    SQL> alter database open; —-成功open数据库
    Database altered.
    6) 全备数据库

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给出的建议也是重建控制文件。