一.配置控制文件多路复用
1.查询Oracle的控制文件所在位置
SQL> select name from v$controlfile;NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/control01.ctl
/u01/app/oracle/fast_recovery_area/orcl/control02.ctl
spfile多路复用控制文件
2.修改control_files参数:
SQL> alter system set
control_files='/u01/app/oracle/oradata/orcl/control02.ctl',
'/u01/app/oracle/oradata/orcl/control03.ctl',
'/u01/app/oracle/oradata/orcl/control05.ctl'
scope=spfile;
3.关闭数据库
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down
4. 进行文件拷贝(必须在数据库关闭下复制文件)
[oracle@cz ~]$ cp /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/oradata/orcl/control02.ctl
[oracle@cz ~]$ cp /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/oradata/orcl/control03.ctl
[oracle@cz ~]$ cp /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/oradata/orcl/control05.ctl
5. 连接数据库
[oracle@cz ~]$ sqlplus / as sysdba
6. 启动数据库
SQL> startup;
ORACLE instance started.Total System Global Area 1169149952 bytes
Fixed Size 2252624 bytes
Variable Size 738197680 bytes
Database Buffers 419430400 bytes
Redo Buffers 9269248 bytes
Database mounted.
Database opened.
7.查询控制文件信息
SQL> select name from v$controlfile;NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/control02.ctl
/u01/app/oracle/oradata/orcl/control03.ctl
/u01/app/oracle/oradata/orcl/control05.ctl
二.控制文件的损坏模拟与重建
1.关闭数据库,并模拟损坏
关闭数据库
SQL> shutdown immediate;
模拟单个控制文件损坏
SQL> !rm -rf /u01/app/oracle/oradata/orcl/control05.ctl
2.尝试启动数据库,显然报错
SQL> startup;
ORACLE instance started.Total System Global Area 1169149952 bytes
Fixed Size 2252624 bytes
Variable Size 738197680 bytes
Database Buffers 419430400 bytes
Redo Buffers 9269248 bytes
ORA-00205: error in identifying control file, check alert log for more info
3.拷贝其他路径在的控制文件给损坏的那个路径的控制文件
SQL> !cp /u01/app/oracle/oradata/orcl/control02.ctl /u01/app/oracle/oradata/orcl/control05.ctl
4.尝试启动数据库,显然成功了
SQL> startup
ORACLE instance started.Total System Global Area 1169149952 bytes
Fixed Size 2252624 bytes
Variable Size 738197680 bytes
Database Buffers 419430400 bytes
Redo Buffers 9269248 bytes
Database mounted.
Database opened.
5. 查看控制文件和实例状态
SQL> select name from v$controlfile;NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/control02.ctl
/u01/app/oracle/oradata/orcl/control03.ctl
/u01/app/oracle/oradata/orcl/control05.ctl
实例状态
SQL> select status from v$instance;STATUS
------------
OPEN
三.通过 TRACE 备份
严格意义上来说,不是针对控制文件的备份,而是根据现在系统情况生成了一份 trace
文件,这个 trace 文件中记录了创建控制文件的基本信息。
SQL> alter database backup controlfile to trace as '/u01/app/oracle/oradata/orcl/controfiles.bak';Database altered.
四.所有控制文件损坏、丢失
1.TRACE 备份 的优势与缺点
这种情况可以利用前面生成的 trace 文件进行手工重建。但是要注意,手工重建新
的,导致原来存在的一些备份资料库元数据丢失,如果采用 RMAN 则不会。
Trace 文件是我们事先导出的,如果在发生故障之前从来没有生成过该如何处理?需
要从其他好的机器上 trace 一份模板,然后按照模板把该库对应的所有数据文件、日志文
件等信息找出来,然后对应到模板上进行重建。
trace 文件中有两段代码:第一段 sql 是在所有 online redolog 没有丢失,以
noresetlogs 选项打开数据库的情况下使用的。第二段则是在丢失了 online redolog 需要
resetlogs 的情况下使用。
2.模拟所有控制文件丢失,手工重建。
SQL> !rm -rf /u01/app/oracle/oradata/orcl/control02.ctlSQL> !rm -rf /u01/app/oracle/oradata/orcl/control03.ctlSQL> !rm -rf /u01/app/oracle/oradata/orcl/control05.ctlSQL> startup
ORACLE instance started.Total System Global Area 1169149952 bytes
Fixed Size 2252624 bytes
Variable Size 738197680 bytes
Database Buffers 419430400 bytes
Redo Buffers 9269248 bytes
ORA-00205: error in identifying control file, check alert log for more info
启动报错
QL> startup
ORACLE instance started.Total System Global Area 1169149952 bytes
Fixed Size 2252624 bytes
Variable Size 738197680 bytes
Database Buffers 419430400 bytes
Redo Buffers 9269248 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
3.将 trace 文件第一段 sql 编辑成文件并执行。
把下面方框中的sql编辑成脚本并执行
创建脚本文件
[oracle@cz orcl]$ vim control.sql
把上面的sql粘贴进去作为脚本
执行脚本
SQL> @control.sql
SP2-0734: unknown command beginning "TARTUP NOM..." - rest of line ignored.Control file created.
查看实例状态数据库恢复正常
SQL> select status from v$instance;STATUS
------------
OPEN
这时,控制文件里面的 SCN 号就追平了数据文件头部的 SCN 号了。
SQL> select file#,checkpoint_change# from v$datafile;
SQL> select file#,checkpoint_change# from v$datafile_header;
数据库正常打开,注意:这时候还有一个临时表空间不要忘了重新创建,实际临时表
空间文件并没有删除,但是由于删除了控制文件,数据字典中无法查到临时表空间文件。
所以临时表空间也需要重新建立。
4.临时表空间是空值
SQL> select * from v$tempfile;no rows selected
数据字典查询是空值,但是 OS 系统层面依然存在 temp01.dbf 。所以需要重新建立。
5.重新建立临时表空间
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf' SIZE 30408704 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;Tablespace altered.
6.再次查询$v$tempfile;
SQL> select name from v$tempfile;NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/temp01.dbf
总结:这个重建控制文件的过程主要有两大部分内容:
第一部分是脚本中的可见信息:定义了几个参数的最大值,在线日志的物理信息,数
据文件的物理信息,使用的字符集。
第二部分是隐含的不可见信息,比如 SCN 信息,重建最关键的是将当前所有数据文
件头部的最新 SCN 信息复制到了控制文件中,以便接下来打开数据库。