一、Oracle 控制文件
为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份
记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等
在参数文件中描述其位置,个数等等。通常采用分散放开,多路复用的原则。在mount阶段被读取,open阶段一直被使用
维护数据库一致性(数据库启动时会比较控制文件与联机日志文件中的ckpt,即起始scn号,如相等则正常启动,否则需要介质恢复)
一个控制文件只能属于一个数据库
控制文件的任意修改将写入到初始化参数中指定的所有控制文件中,读取时则仅读取第一个控制文件
控制文件只能连接一个数据库,控制文件的大小一般不要超过MB,最多为个,最少一个,互为镜像
控制文件中包含的内容
数据库的名字、ID、创建的时间戳
表空间的名字
联机日志文件、数据文件的位置、个数、名字
联机日志的Sequence号码
检查点的信息
撤销段的开始或结束
归档信息
备份信息
使用strings命令查看 (可以看到其中包含了sid orcl)
C:Usersjiaozi>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:ORACLEPRODUCT10.2.0ORADA
TAORCLCONTROL01.CTL, C:ORAC
LEPRODUCT10.2.0ORADATAORCL
CONTROL02.CTL, C:ORACLEPROD
UCT10.2.0ORADATAORCLCONTRO
L03.CTL
--添加一个控制文件
SQL> alter system set control_files='C:ORACLEPRODUCT10.2.0ORADATAORCLCONTR
OL01.CTL','C:ORACLEPRODUCT10.2.0ORADATAORCLCONTROL02.CTL', 'C:ORACLEPROD
UCT10.2.0ORADATAORCLCONTROL03.CTL','C:ORACLEPRODUCT10.2.0ORADATAORCLCO
NTROL04.CTL' scope=spfile;
系统已更改。
因为每个控制文件内容一样拷贝一个控制文件
C:>copy C:ORACLEPRODUCT10.2.0ORADATAORCLCONTROL01.CTL C:ORACLEPRODUCT1
0.2.0ORADATAORCLCONTROL04.CTL;
已复制 1 个文件。
C:>cd C:ORACLEPRODUCT10.2.0ORADATAORCL
C:oracleproduct10.2.0oradataorcl>dir
驱动器 C 中的卷没有标签。
卷的序列号是 34DF-4186
C:oracleproduct10.2.0oradataorcl 的目录
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:ORACLEPRODUCT10.2.0ORADA
TAORCLCONTROL01.CTL, C:ORAC
LEPRODUCT10.2.0ORADATAORCL
CONTROL02.CTL, C:ORACLEPROD
UCT10.2.0ORADATAORCLCONTRO
L03.CTL, C:ORACLEPRODUCT10.
2.0ORADATAORCLCONTROL04.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:appjiaozidiag
dbmsorcl
orcl race
core_dump_dest string c:appjiaozidiag
dbmsorcl
orclcdump
max_dump_file_size string unlimited
shadow_core_dump string none
user_dump_dest string c:appjiaozidiag
dbmsorcl
orcl race
找到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:appjiaozidiag
dbmsorclorcl raceorcl_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:APPJIAOZIORADATAORCLREDO01.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 2 'C:APPJIAOZIORADATAORCLREDO02.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 3 'C:APPJIAOZIORADATAORCLREDO03.LOG' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'C:APPJIAOZIORADATAORCLSYSTEM01.DBF',
'C:APPJIAOZIORADATAORCLSYSAUX01.DBF',
'C:APPJIAOZIORADATAORCLUNDOTBS01.DBF',
'C:APPJIAOZIORADATAORCLUSERS01.DBF',
'C:APPJIAOZIORADATAORCLEXAMPLE01.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:APPJIAOZIFLASH_RECOVERY_AREAORCLARCHIVELOG2017_03_22O1_MF_1_1_%U_.ARC
ORA-00280: 更改 11702945 (用于线程 1) 在序列 #1 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
C:appjiaozioradataorclREDO01.LOG
已应用的日志。
完成介质恢复。
SQL> ALTER DATABASE OPEN RESETLOGS;
数据库已更改。