Oracle 控制文件呢,是数据库中最小的文件,是一个二进制文件,其中包括了数据库的结构信息,
同时也包括了数据文件和日志文件的一些信息,控制文件虽小,但可以说是 Oracle 中最重要的文件,
只有 Oracle 进程才能够更新控制文件中的内容,
控制文件中呢主要包括数据库名称,位置,联机或者脱机状态,Redo Log File 的位置和名称,
表空间名称, Archive Log File 信息,CheckPoint 信息,Undo 信息,RMAN 信息等等,
从上面对控制文件中包含的内容也可以看出控制文件在整个 Oracle 中的重要性。
控制文件的多路复用技术
何为控制文件的多路复用技术呢?
由于控制文件的重要性,Oracle 呢官方是建议至少应该拥有控制文件的三个以上的副本,
而您可以通过多路复用技术,将控制文件的副本创建到不同的磁盘上,
然后再修改初始化参数文件 init . ora
(现在的 Oracle 版本中的参数基本上都是使用二进制的 spfile,只有个老版本的 Oracle 才使用 init.ora 文件)
中的 control_files 参数,使之包含所有的控制文件,
也就是将其他磁盘上的控制文件也包含到这个 control_files 中,这样的话,
这样呢,有一个好处,
就是你的这个一个磁盘坏了,Oracle 仍然能够快速的恢复,
一个控制文件损坏了,还可以自动使用另一个控制文件,
但是这里要提一点的是,控制文件并不是越多越好的,
因为当 Oracle 更新控制文件时,会将所有的控制文件全部进行更新,自然性能就有一定的影响了,
所以,
控制文件的副本也不是越多越好的!!!
下面呢就介绍一下如何启用多路复用的技术了,
主要是针对于使用 spfile (System Parameter File)实现多路复用控制文件,
(对于 init . ora 实质上也差不多)
1.查看控制文件信息
SQL*Plus: Release 9.2.0.1.0 - Production on 星期六 1月 5 10:12:00 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> conn sys/ as sysdba
请输入口令: *
已连接。
SQL> select name from v$controlfile;
D:\ORACLE\ORADATA\HQH\CONTROL01.CTL
D:\ORACLE\ORADATA\HQH\CONTROL02.CTL
D:\ORACLE\ORADATA\HQH\CONTROL03.CTL
SQL> select value from v$parameter where name=’control_files’;
D:\oracle\oradata\hqh\CONTROL01.CTL, D:\oracle\oradata\hqh\CONTROL02.CTL, D:\ora
cle\oradata\hqh\CONTROL03.CTL
查看控制文件中关于数据文件中的数据记录信息:(注意,DATAFILE一定要大写,否则会提示”未选定行”)
SQL> select type,record_size,records_total,records_used from v$controlfile_record_section
where type=’DATAFILE’;
TYPE RECORD_SIZE RECORDS_TOTAL RECORDS_USED
DATAFILE 180 100 13
2.创建控制文件的副本和备份控制文件
(1).创建控制文件的副本
此例子中,用户将为数据库HQH创建一个新的控制文件副本D:\oracle\backup\hqh\control02.ctl
SQL> alter system set control_files=’D:\oracle\oradata\hqh\control01.ctl’,’D:\oracle\oradata\hqh\control02.ctl’,
‘D:\oracle\backup\hqh\control02.ctl’
scope=spfile
SQL> /
系统已更改
然后用shutdown关闭数据库.因为上述控制文件D:\oracle\backup\hqh\control02.ctl并不存在,所以应该将’D:\oracle\oradata\hqh\control02.ctl’文件复制到D:\oracle\backup\hqh\下.
SQL> shutdown;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭
再用startup启动数据库,数据库正常启动.
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
注意:如果忘了把文件复制到指定位置,启动时将报错.
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
ORA-00205: ?????????????????????
再查看控制文件信息,新增的控制文件已经在使用了.
SQL> select name from v$controlfile;
D:\ORACLE\ORADATA\HQH\CONTROL01.CTL
D:\ORACLE\ORADATA\HQH\CONTROL02.CTL
D:\ORACLE\ORADATA\HQH\CONTROL03.CTL
D:\ORACLE\BACKUP\HQH\CONTROL02.CTL
直此,已经成功创建一个新的控制文件的副本.
(2).备份控制文件
SQL> alter database backup controlfile to ‘D:\oracle\backup\hqh\control.bkp’;
数据库已更改。
就这么简单,备份控制文件成功!打开文件所在目录看看吧.
(3).使用副本恢复控制文件
a.首先使用shutdown关闭实例,在关闭SQL*Plus.
b.打开’D:\oracle\oradata\hqh\control01.ctl’文件,进行随意修改,并保存.
c.启动SQL*Plus,以sysdba连接到数据库hqh.
d.用startup启动数据库实例hqh.系统返回ORA-00205错误.
e.现在使用数据文件副本进行恢复.先shutdown.
f.将文件’D:\oracle\oradata\hqh\control01.ctl’ 删除.将control02.ctl复制一个改名为control01.ctl.
h.再startup即可成功启动.
1.查看当前日志组成员:
SQL> select member from v$logfile;
C:\ORACLE\PRODUCT\10.2.0\ORADATA\FYDB\REDO01.LOG
C:\ORACLE\PRODUCT\10.2.0\ORADATA\FYDB\REDO02.LOG
C:\ORACLE\PRODUCT\10.2.0\ORADATA\FYDB\REDO03.LOG
2.查看当前日志组状态:
SQL> select group#,members,bytes/1024/1024,status from v$log;
GROUP# MEMBERS BYTES/1024/1024 STATUS
1 1 50 INACTIVE
2 1 50 INACTIVE
3 1 50 CURRENT
现有三个日志组,每个组内有一个成员,每个成员的大小为50MB,现在想把此三个日志组的成员大小都改为100MB ,步骤如下:
1、创建2个新的日志组
SQL> alter database add logfile group 4 (‘C:\ORACLE\PRODUCT\10.2.0\ORADATA\FYDB\REDO04.LOG’) size 100M;
SQL> alter database add logfile group 5 (‘C:\ORACLE\PRODUCT\10.2.0\ORADATA\FYDB\REDO05.LOG’) size 100M;
2、切换当前日志到新的日志组
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> select group#,members,bytes/1024/1024,status from v$log;
GROUP# MEMBERS BYTES/1024/1024 STATUS
1 1 50 ACTIVE
2 1 50 ACTIVE
3 1 50 ACTIVE
4 1 100 CURRENT
5 1 100 ACTIVE
3、删除旧的日志组
SQL> alter database drop logfile group 1;
SQL> alter database drop logfile group 2;
SQL> alter database drop logfile group 3;
4、操作系统下删除原日志组1、2、3中的文件REDO01.LOG、REDO02.LOG、REDO03.LOG。
5、重建日志组1、2、3
SQL> alter database add logfile group 1 (‘C:\ORACLE\PRODUCT\10.2.0\ORADATA\FYDB\REDO01.LOG’) size 100M;
SQL> alter database add logfile group 2 (‘C:\ORACLE\PRODUCT\10.2.0\ORADATA\FYDB\REDO02.LOG’) size 100M;
SQL> alter database add logfile group 3 (‘C:\ORACLE\PRODUCT\10.2.0\ORADATA\FYDB\REDO03.LOG’) size 100M;
6、切换日志组
SQL> alter system switch logfile;
SQL> alter system switch logfile;
7、删除中间过渡用的日志组4、5
SQL> alter database drop logfile group 4;
SQL> alter database drop logfile group 5;
SQL> select group#,status from v$log;
GROUP# STATUS
1 UNUSED
2 UNUSED
3 UNUSED
4 INACTIVE
5 CURRENT
8、到操作系统下删除原日志组4、5中的文件
9、备份当前的最新的控制文件
SQL> conn / as sysdba
SQL> alter database backup controlfile to trace resetlogs;