zoukankan      html  css  js  c++  java
  • 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;
    2. v$parameter:列出所有参数的位置和状态
      col value for a30
      select name,value from v$parameter where name='control_files';

      3.show parameter control_files:列出控制文件的名字,状态,位置
      show parameter control_files

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

    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.
    1. 一致性关闭数据库
      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
    
    1. 减少控制文件
      实际操作与增加控制文件的类似,如下:
      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里面查找到。

      或者执行以下脚本即可查询跟踪文件的位置
      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;

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

    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
    
    1. 控制文件全部丢失,使用备份控制文件恢复,前提是联机日志完好的情况
      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) 全备数据库

    1. 全部控制文件丢失,重建控制文件来恢复,前提是联机日志完好的情况
      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) 全备数据库

  • 相关阅读:
    使用Jpath 对Json字符串进行解析
    使用PowerDesigner 生成mysql 数据库脚本
    在windows 环境下Kratos 代码示例搭建
    Java jdbc无法连接sql server和sa登录失败的坑
    win10 安装sql server 2008 提示重新启动计算机失败
    RNN计算loss function
    ReLU 函数非线性
    TopK 问题
    mysql初始化问题(版本 8.0.11)
    投资理财的66条军规
  • 原文地址:https://www.cnblogs.com/shaozi/p/7712127.html
Copyright © 2011-2022 走看看