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

posted @ 2017-10-22 21:53  元朗蛋卷  阅读(432)  评论(0编辑  收藏  举报