15->控制文件的概念和操作

一、Oracle 控制文件

        为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份

        记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等

        在参数文件中描述其位置,个数等等。通常采用分散放开,多路复用的原则。在mount阶段被读取,open阶段一直被使用

        维护数据库一致性(数据库启动时会比较控制文件与联机日志文件中的ckpt,即起始scn号,如相等则正常启动,否则需要介质恢复)

        一个控制文件只能属于一个数据库

        控制文件的任意修改将写入到初始化参数中指定的所有控制文件中,读取时则仅读取第一个控制文件

        控制文件只能连接一个数据库,控制文件的大小一般不要超过MB,最多为个,最少一个,互为镜像

               

        控制文件中包含的内容

            数据库的名字、ID、创建的时间戳

            表空间的名字

            联机日志文件、数据文件的位置、个数、名字

            联机日志的Sequence号码

            检查点的信息

            撤销段的开始或结束

            归档信息

            备份信息

    使用strings命令查看 (可以看到其中包含了sid  orcl)

    C:\Users\jiaozi>strings c:/a.ctl
       }|{z
       KVORCL
      7ORCL
      JFrW
      7ORCL
     JFrW
     orcl
     orcl

二、查看控制文件的相关信息

    1.使用相关视图来查看

        V$CONTROLFILE                   --列出实例中所有控制文件的名字及状态信息

        V$PARAMETER                     --列出所有参数的位置及状态信息

        V$CONTROLFILE_RECORD_SECTION    --列出控制文件中记录的部分信息

        SHOW PARAMETER CONTROL_FILES    --列出控制文件的名字、状态、位置等

三 如果添加控制文件

-----查询控制文件

SQL> show parameter control
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time        integer     7
control_files                        string      C:\ORACLE\PRODUCT\10.2.0\ORADA
                                                 TA\ORCL\CONTROL01.CTL, C:\ORAC
                                                 LE\PRODUCT\10.2.0\ORADATA\ORCL
                                                 \CONTROL02.CTL, C:\ORACLE\PROD
                                                 UCT\10.2.0\ORADATA\ORCL\CONTRO
                                                 L03.CTL

--添加一个控制文件

SQL> alter system set control_files='C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTR
OL01.CTL','C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL02.CTL', 'C:\ORACLE\PROD
UCT\10.2.0\ORADATA\ORCL\CONTROL03.CTL','C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CO
NTROL04.CTL' scope=spfile;


系统已更改。


因为每个控制文件内容一样拷贝一个控制文件

C:\>copy C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL C:\ORACLE\PRODUCT\1
0.2.0\ORADATA\ORCL\CONTROL04.CTL;
已复制         1 个文件。


C:\>cd C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL


C:\oracle\product\10.2.0\oradata\orcl>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 34DF-4186


 C:\oracle\product\10.2.0\oradata\orcl 的目录


2015-08-29  22:31    <DIR>          .
2015-08-29  22:31    <DIR>          ..
2015-09-06  14:14       503,324,672 SYSTEM01.DBF
2015-09-06  15:14       262,152,192 SYSAUX01.DBF
2015-09-06  14:14        36,708,352 UNDOTBS01.DBF
2015-09-06  14:14         5,251,072 USERS01.DBF
2015-09-06  14:14         7,061,504 CONTROL01.CTL
2015-09-06  14:14         7,061,504 CONTROL02.CTL
2015-09-06  14:14         7,061,504 CONTROL03.CTL
2015-09-03  23:31        52,429,312 REDO01.LOG
2015-09-03  23:31        52,429,312 REDO02.LOG
2015-09-06  14:14        52,429,312 REDO03.LOG
2015-09-06  14:16        20,979,712 TEMP01.DBF
2015-09-06  14:14       104,865,792 EXAMPLE01.DBF
2015-09-06  14:14         7,061,504 CONTROL04.CTL
              13 个文件  1,118,815,744 字节
               2 个目录 20,143,964,160 可用字节

重启数据库

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup;
ORACLE 例程已经启动。


Total System Global Area  285212672 bytes
Fixed Size                  1248552 bytes
Variable Size              83886808 bytes
Database Buffers          192937984 bytes
Redo Buffers                7139328 bytes
数据库装载完毕。
数据库已经打开。
SQL> show parameter control_files;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      C:\ORACLE\PRODUCT\10.2.0\ORADA
                                                 TA\ORCL\CONTROL01.CTL, C:\ORAC
                                                 LE\PRODUCT\10.2.0\ORADATA\ORCL
                                                 \CONTROL02.CTL, C:\ORACLE\PROD
                                                 UCT\10.2.0\ORADATA\ORCL\CONTRO
                                                 L03.CTL, C:\ORACLE\PRODUCT\10.
                                                 2.0\ORADATA\ORCL\CONTROL04.CTL


四 如何备份还原控制文件

SQL> alter database backup controlfile to 'c:/a.bak';


数据库已更改。

当然我们也可以直接control_files的文件拷贝 

还原就是讲文件拷贝到数据目录 并且

alter system set control_files='你的位置' 就是还原


五控制文件损坏的修复

当控制文件损坏时 可以通过命令重建控制文件(这里我们可以自己模拟 将ctl文件删除 一般启动报错 ORA-00205: ?????????, ??????, ???????) 
如果当数据库已经无法启动的情况下  可以找到某台计算机能正常运行oracle的数据库上 执行备份控制文件的sql到日志中 


alter database backup controlfile to trace  该语句只能在mount和open下运行


通过命令找到日志中重建控制文件的命令 
   show parameter dump
可以查到
   SQL> show parameter dump


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
background_core_dump                 string      partial
background_dump_dest                 string      c:\app\jiaozi\diag\rdbms\orcl\
                                                 orcl\trace
core_dump_dest                       string      c:\app\jiaozi\diag\rdbms\orcl\
                                                 orcl\cdump
max_dump_file_size                   string      unlimited
shadow_core_dump                     string      none
user_dump_dest                       string      c:\app\jiaozi\diag\rdbms\orcl\
                                                 orcl\trace
找到alert_orcl.log 打开该文件可以看到最后一行 打出如下日志
OER 7451 in Load Indicator : Error Code = OSD-04500: 指定了非法选项
O/S-Error: (OS 1) 函数不正确。 !
Wed Mar 22 10:35:51 2017
alter database backup controlfile to trace
【Backup controlfile written to trace file c:\app\jiaozi\diag\rdbms\orcl\orcl\trace\orcl_ora_38324.trc】
Completed: alter database backup controlfile to trace
Wed Mar 22 10:35:53 2017


找到  orcl_ora_38324.trc 文件可以看到完整的创建控制文件的步骤sql
我的如下:
#nmount模式启动
STARTUP NOMOUNT
#创建控制文件 如果其他人的数据库和你的数据库的日志文件和dbf文件不在同一个目录 可以修改为你对应的目录即可
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 'C:\APP\JIAOZI\ORADATA\ORCL\REDO01.LOG'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 'C:\APP\JIAOZI\ORADATA\ORCL\REDO02.LOG'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 'C:\APP\JIAOZI\ORADATA\ORCL\REDO03.LOG'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  'C:\APP\JIAOZI\ORADATA\ORCL\SYSTEM01.DBF',
  'C:\APP\JIAOZI\ORADATA\ORCL\SYSAUX01.DBF',
  'C:\APP\JIAOZI\ORADATA\ORCL\UNDOTBS01.DBF',
  'C:\APP\JIAOZI\ORADATA\ORCL\USERS01.DBF',
  'C:\APP\JIAOZI\ORADATA\ORCL\EXAMPLE01.DBF'
CHARACTER SET ZHS16GBK
;
#恢复数据库使用控制文件
RECOVER DATABASE USING BACKUP CONTROLFILE
#将数据库打开
ALTER DATABASE OPEN RESETLOGS;

依次执行上面步骤中的命令即可完成修复

注意:
  RECOVER DATABASE USING BACKUP CONTROLFILE会要求你输入一个选项
         指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
  需要你指定重做日志的位置 可以输入重做日志的位置 一般重做日志和控制文件都在同一目录
  比如我的操作是:
   SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;
            ORA-00279: 更改 11702945 (在 03/22/2017 11:03:50 生成) 对于线程 1 是必需的
            ORA-00289: 建议:
            C:\APP\JIAOZI\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2017_03_22\O1_MF_1_1_%U_.ARC
            ORA-00280: 更改 11702945 (用于线程 1) 在序列 #1 中




            指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
             C:\app\jiaozi\oradata\orcl\REDO01.LOG
            已应用的日志。
            完成介质恢复。
  SQL> ALTER DATABASE OPEN RESETLOGS;


  数据库已更改。
 









posted @ 2015-09-06 16:48  饺子吃遍天  阅读(191)  评论(0编辑  收藏  举报