Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1892803
  • 博文数量: 606
  • 博客积分: 9991
  • 博客等级: 中将
  • 技术积分: 5725
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 19:07
文章分类

全部博文(606)

文章存档

2011年(10)

2010年(67)

2009年(155)

2008年(386)

分类:

2008-10-30 13:05:48

什么是控制文件?

控制文件是用于描述物理数据库当前状态的二进制文件。
丢失控制文件则数据库无法使用,必须加以修复。
数据库加载阶段需要根据控制文件中的信息判断数据库的状态。
控制文件很重要,所以应该设置多份拷贝(通常为3份)。
控制文件的内容:


1,数据库名字和标识符
2,数据库创建时间戳
3,表空间名字 (添加或删除表空间时记录)
4,数据文件和redo日志文件的名字和位置
5,当前redo日志文件序列号 (做log switch时记录)
6,检查点信息 (做checkpoint时记录)
7,undo段的起始点和结束点
8,redo日志归档信息 (日志归档时记录)
9,备份信息 (由RMAN负责维护)

其中,数据库名称,标识和创建时间在数据库创建时写入;数据文件和重做日志名称和位置在增加,重命名或者删除的时候更新;表空间信息在增加或者删除表空间的时候进行更新。

在初始化参数文件中control_files参数主要来描述控制文件的文件名跟物理路径,如下所示:
control_files=("d:oracleoradataoradbcontrol01.ctl")
该参数只设置一个,也可以设置多个,如下所示:
control_files=("d:oracleoradataoradbcontrol01.ctl"
"e:oracleoradataoradbcontrol02.ctl",
"f:oracleoradataoradbcontrol03.ctl")
这个方法叫做多路控制文件,oracle可以利用这个方法恢复被破坏的控制文件,oracle最多允许设置8个多路控制文件。
必须所有的多路控制文件都完整正确数据库才能正常启动,只要丢失一个或者一个内容不正确数据库就不能顺利启动。

对控制文件的管理原则:
1.明确控制文件的名称很存储路径
参数设置错误将无法打开数据库,数据库打开以后,实例将同时写入所有的控制文件但是只会读取第一个控制文件的内容。
2.为数据库创建多路控制文件
a.多路控制文件内容必须完全一样,oracle实例同时将内容写入到control_files变量所设置的控制文件中。
b.初始化参数control_files中列出的第一个文件是数据库运行期间唯一可读取的控制文件。
c.创建,恢复和备份控制文件必须在数据库关闭的状态下运行,这样才能保证操作过程中控制文件不被修改。
d.数据库运行期间如果一个控制文件变为不可用,那么实例将不再运行,应该终止这个实例,并对破坏的控制文件进行修复。
3.将多路控制文件放在不同的硬盘上
4.采用操作系统镜像方式备份控制文件
5.手工方式备份控制文件
应该及时备份特别是发生了如下的操作的时候:
添加删除重命名数据文件
添加删除表空间,改变表空间读写状态
添加删除重做日志文件
如果手工备份不及时的话,就会产生备份的控制文件与正在使用的控制文件不一致,那么利用备份的控制文件启动数据库时会破坏数据库的一致性完整性,甚至不能启动数据库,因此手工备份控制文件要注意及时备份。

创建多路控制文件

利用spfile文件创建多路控制文件
1.利用SYS帐号登陆SQL*PLUS,查询一下控制文件信息视图
SQL>select name from v$controlfile;
结果显示为:
NAME
----------------------------------
d:oracleoradataoradb01control01.ctl
e:oracleoradataoradb01control02.ctl
f:oracleoradataoradb01control03.ctl
这里列出了控制文件的名称以及位置

2.更改spfile中控制文件的信息,增加一个新的控制文件
SQL>alter system set control_files=
'd:oracleoradataoradb01control01.ctl',
'e:oracleoradataoradb01control02.ctl',
'f:oracleoradataoradb01control03.ctl',
'g:oracleoradataoradb01control04.ctl'
scope=spfile
结果显示为:
系统已经更改。

3.关闭数据库

4.在操作系统中将已有的控制文件复制,修改名称保存到刚才增加控制文件的指定位置。(这步必须做的,否则数据库无法启动)

5.重新启动控制文件,使控制文件改变生效。


利用pfile创建多路控制文件
1.利用SYS用户登陆SQL*PLUS,关闭数据库

2.在操作系统中将原有的控制文件复制一份保存到不同的位置上去,比如说将原有的'd:oracleoradataoradb01control01.ctl'控制文件复制一份保存到G盘的oracleoradata目录下去。

3.用文本编辑器打开pfile进行编辑,一般是在ORACLE_BASEadminpfile里面,把新添加的控制文件信息添加进去。

4.重新启动数据库,使控制文件生效。
注意在9i中,默认的控制文件是spfile,所以修改了pfile以后启动要:
SQL>startup pfile=ORACLE_BASEadminpfileinit.ora

管理控制文件

备份控制文件
1.命令:alter database backup controlfile to '........bkp';
命令给出的路径一定要实现就建好,否则系统会报错。控制文件丢失或者出错的时候就可以在初始化参数文件中把control_files参数指向备份后的路径,或者是把备份后的控制文件复制到原来的控制文件的位置覆盖掉。
2.使用命令:alter database backup controlfile to trace;
在ORACLE_BASEadminudump里面生成跟踪文件(使用show parameter user_dump语句可以可以获取跟踪文件存放目录),其中就有创建文件的SQL脚本,可以利用脚本来重建新的控制文件。

问题:1.把备份的文件放到原有的控制文件的位置还是不能用。
2.要怎样利用脚本重建新的控制文件?

删除控制文件(删除某一路的控制文件)

spfile文件
1.利用SYS帐号登陆SQL*PLUS,查询一下控制文件信息视图
SQL>select name from v$controlfile;
结果显示为:
NAME
----------------------------------
d:oracleoradataoradb01control01.ctl
e:oracleoradataoradb01control02.ctl
f:oracleoradataoradb01control03.ctl
g:oracleoradataoradb01control04.ctl
这里列出了控制文件的名称以及位置

2.更改spfile中控制文件的信息,删除一个新的控制文件
SQL>alter system set control_files=
'd:oracleoradataoradb01control01.ctl',
'e:oracleoradataoradb01control02.ctl',
'f:oracleoradataoradb01control03.ctl',
scope=spfile
结果显示为:
系统已经更改。

3.关闭数据库

4.在操作系统中删除控制文件

5.重新启动数据库,使控制文件生效

pfile文件

1.利用SYS用户登陆SQL*PLUS,关闭数据库

2.用文本编辑器打开pfile进行编辑,一般是在ORACLE_BASEadminpfile里面,找到control_files参数把不需要的控制文件删除。

3.在操作系统中删除该控制文件。

4.重新启动数据库,使控制文件生效。

通过spfile复制控制文件:

首先,要知道你要改那个文件啊,是加控制文件,还是减少控制文件

其次,修改pfile文件,如果加控制文件,就在controlfile里加一条你新控制文件的路径,删除就直接del。

接着,启动数据库用新的pfile。

之后,创建spfile。

最后重新启动数据库,ok,搞定!


SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 12 月 01 09:45:26 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.

SQL> conn as sysdba

SQL> show parameter control_files;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      F:\ORACLE\PRODUCT\10.2.0\ORADA
                                                 TA\XIAOXIAN\CONTROL01.CTL, F:\OR
                                                 ACLE\PRODUCT\10.2.0\ORADATA\XIAOXIAN\CONTROL02.CTL,             

                                                  F:\ORACLE\PRODUCT\10.2.0\ORADATA\XIAOXIAN\CONTROL03.CTL
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup pfile='F:\oracle\product\10.2.0\admin\xiaoxian\pfile\init.ora';
ORACLE 例程已经启动。

Total System Global Area 612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             167775108 bytes
Database Buffers          436207616 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
数据库已经打开。
SQL> create spfile from pfile='F:\oracle\product\10.2.0\admin\xiaoxian\pfile\init.ora';

文件已创建。

SQL> show parameter control_files;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      F:\ORACLE\PRODUCT\10.2.0\ORADA
                                                 TA\DATIAN\CONTROL01.CTL, F:\OR
                                                 ACLE\PRODUCT\10.2.0\ORADATA\DA
                                                 TIAN\CONTROL02.CTL
SQL>

附:oracle入门小知识

一个表空间只能属于一个数据库  
每个数据库最少有一个控制文件(建议3个,分别放在不同的磁盘上)  
每个数据库最少有一个表空间(SYSTEM表空间)  
建立SYSTEM表空间的目的是尽量将目的相同的表存放在一起,以提高使用效率,只应存放数据字典  
每个数据库最少有两个联机日志组,每组最少一个联机日志文件  
一个数据文件只能属于一个表空间  
一个数据文件一旦被加入到一个表空间中,就不能再从这个表空间中移走,也不能再加入到其他表空间中  
建立新的表空间需要建立新的数据文件  
COMMIT后,数据不一定立即写盘(数据文件)  
一个事务即使不被提交,也会被写入到重做日志中。  
oracle server可以同时启动多个数据库  
一套操作系统上可以安装多个版本的ORACLE数据库系统(UNIX可以,NT不可以??)
一套ORACLE数据库系统中可以有多个ORACLE数据库及其相对应的实例

阅读(1587) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~