一、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; 数据库已更改。