一、什么是控制文件
控制文件是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
对应的翻译大致是:
- 数据库的名字
- 数据文件和重做日志文件的名字和位置
- 数据库创建的时间戳
- 当前日志的序列号
- 检查点信息
三、查询控制文件的信息
- v$controlfile:列出实例的所有控制文件的名字和状态
select * from v$controlfile;
- 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)修改参数文件
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.
- 一致性关闭数据库
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)修改参数文件
2)一致性关闭数据库
3)启动数据库
4)检查控制文件个数
五、控制文件的备份
- 备份为二进制文件
alter database backup controlfile to '/u02/backup/control.bak'; - 备份为跟踪文件
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) 查看控制文件的信息
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) 查看控制文件和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: {
/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) 查看控制文件和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) 全备数据库