Oralce数据库控制文件的管理

一、什么是控制文件

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

二、控制文件的内容

从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

对应的翻译大致是:

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

三、查询控制文件的信息

  1. v$controlfile:列出实例的所有控制文件的名字和状态
    select * from v$controlfile;
    1078403-20171022214707927-1097323355.png
  2. v$parameter:列出所有参数的位置和状态
    col value for a30
    select name,value from v$parameter where name='control_files';
    1078403-20171022215212506-486258284.png
    3.show parameter control_files:列出控制文件的名字,状态,位置
    show parameter control_files
    1078403-20171022220157068-89704295.png

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

  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)检查控制文件个数

五、控制文件的备份

  1. 备份为二进制文件
    alter database backup controlfile to '/u02/backup/control.bak';
  2. 备份为跟踪文件
    alter database backup controlfile to trace [as ''],trace后面的是可选项,如果不指定将把跟踪文件的路径保存在user_dump_dest目录下,具体文件名可以在该目录的alert_.log里面查找到。
    1078403-20171022231130927-675938626.png
    或者执行以下脚本即可查询跟踪文件的位置
    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;
    1078403-20171022232708865-978046745.png

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

  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) 全备数据库

转载于:https://www.cnblogs.com/shaozi/p/7712127.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值