oracle控制文件
控制文件是oracle数据库最重要的物理文件之一。每个oracle 数据库都必须至少有一个控制文件。在启动数据库实例时,oracle会根据初始化参数找到控制文件,并读取控制文件中的内容。然后根据控制文件中的信息(如数据库名称、数据文件和日志文件的名称和位置等)在实例和数据库之间建立起连接。
如果无法找到控制文件或控制文件损坏,则数据库实例将无法启动,并且很难 修复。
select * from v$controlfile;
控制文件是一个二进制文件,它记录了数据库的物理结构,其中主要包括数据库名、数据文件、日志文件的名字和位置。
当oracle实例在正常启动时,系统首先要访问的是初始化参数文件spfile,然后oracle为系统全局区(SGA)分配内存,。这时oralce实例处于安装状态,并且控制文件处于打开状态,接下来oracle会自动读取出控制文件的所有数据文件和日志文件信息,并打开所有数据库中的所有数据文件和所有的日志文件以供用户访问。
oracle提供了备份文件和多路复用的机制。oracle数据库的控制文件是在创建数据库时自动创建的,一般情况下,至少需要一个副本。
1、多路复用控制文件是指在系统不同的位置上同时存放多个控制文件的副本。
在初始化参数control_files中列出了当前数据库的所有控制文件名。oracle将根据control_files参数中的信息同时修改所有的控制文件,但只读取第一个控制文件中的信息。(在整个数据库运行期间,如果任何一个控制文件被损坏,那么实例就不能在继续运行。实现控制文件的多路复用主要包括更改control_files参数和复制控制文件两个步骤,具体流程如下)。
1.1、更改control_files参数。
alter system set control_files='/home/u01/app/oracle/oradata/orcl/control01.ctl', '/home/u01/app/oracle/oradata/orcl/control02.ctl','xx' ,scope=spfile;
在上面的代码中,前2个控制文件是在创建数据时自动创建的,第三个控制文件是用户将要手动添加(用于实现多路复用的功能),并且它们位于不同磁盘,但是目前还没有创建该文件,用户需要关闭数据库,然后通过手动复制来创建它。
1.2、复制控制文件。
2、创建控制文件
在一般情况下,若使用了多路复用控制文件,并将各个控制文件分别存储在不同的磁盘中,则全部控制文件丢失或损坏的可能性非常小。如果所有控制文件全部丢失或损坏,那么唯一的补救方法就是手工创建一个新的控制文件。手工创建控制文件使用create controlfile语句,其语法格式如下所示:
CREATE CONTROLFILE REUSE DATABASE db_name LOGFILE GROUP 1 redofiles_list1 GROUP 2 redofiles_list2 GROUP 3 redofiles_list3 .... DATAFILE datafile1 datafile2 datafile3 ... MAXLOGFILES max_value1 MAXLOGMEMBERS max_value2 MAXINSTANCE max_value3 MAXDATAFILES max_value4 NORESETLOGS |RESETLOGS ARCHIVELOG | NOARCHIVELOG;
根据对上面语法的分析,接下来详细讲解控制文件的创建过程。
2.1查看数据文件和重做日志文件。
在创建新控制文件时,首先需要了解数据库中的数据文件和日志文件。如果数据库中的所有控制文件和日志文件都已经丢失,数据库已经无法打开,因此也就无法通过查询数据字典来获得数据文件和日志文件信息,唯一的办法是查看警告日志文件中的内容。如果数据库可以打开,那么可以通过执行下面的查询语句来生成相关的文件列表。
---查看日志文件 select member from v$logfile; -- 查看数据文件 select name from v$datafile; --查看控制文件 select name from v$controlfile;
2.2关闭数据库
shutdown immediate;
2.3、备份文件
用户需要在操作系统下备份所有的数据文件和重做日志文件,因为在使用CREATE CONTROLFILE语句创建新的控制文件时,如果操作不当可能会损坏数据文件和日志文件,因此,必须先对其进行备份。
2.4、启动数据库实例
启动但不加载数据库,是因为加载数据库时,实例将会打开控制文件,无法达到新创建控制文件的效果,其代码如下:
startup nomount;
2.5、创建新的控制文件
create controlfile reuse database 'orcl' -- database 后面的数据库名要求与spfile文件中的db_name参数值完全相同
logfile
group 1 '/home/u01/app/oracle/oradata/orcl/redo01.log',
group 2 '/home/u01/app/oracle/oradata/orcl/redo02.log',
group 3 '/home/u01/app/oracle/oradata/orcl/redo03.log',
datafile
'/home/u01/app/oracle/oradata/orcl/pdborcl/system01.dbf',
'/home/u01/app/oracle/oradata/orcl/pdborcl/sysaux01.dbf',
'/home/u01/app/oracle/oradata/orcl/pdborcl/undotbs01.dbf',
'/home/u01/app/oracle/oradata/orcl/pdborcl/users01.dbf',
'/u01/app/oracle/oradata/ams.dbf',
'/u01/app/oracle/oradata/uatacctmdb.dbf'
maxlogfiles 50
maxlogmembers 3
maxinstance 6
maxdatafiles 200
noresetlogs
noarchivelog;
2.6、编辑参数
通过编辑spfile文件中的初始化参数control_files,使其指向新建的控制文件,代码及运行结果如下所示:
alter system set control_files='/home/u01/app/oracle/oradata/orcl/control01.ctl','/home/u01/app/oracle/oradata/orcl/control02.ctl' scope=spfile;
--如果在控制文件中修改了数据库的名称,还需要修改db_name参数来指定新的数据库名称。
2.7、打开数据库
如果丢失了某个重做日志文件或数据文件,则需要恢复数据库,否则通过如下方式正常打开数据库即可。
alter database open;
如果在创建控制文件时使用了RESETLOGS语句,则需要以“恢复方式”打开数据库。
alter database open resetlogs;
3、备份和恢复控制文件
为了提高数据库的可靠性,降低由于丢失控制文件而造成灾难性后果的可能性,DBA需要进场对控制文件进行备份。特别是当修改了数据库结构之后,需要立即对控制文件进行备份。
3.1备份控制文件
备份控制文件需要使用到alter database backup controlfile语句。有两种备份方式:一种是备份为二进制文件,另外一种是备份为脚本文件。
a、将数据库的控制文件备份为一个二进制文件。
alter database backup controlfile to '/home/zh/controlfiles/control_file1.bkp';
b、备份为脚本文件。备份为脚本文件实际上就是备份为可读的文本文件。
alter database backup controlfile to trace;
将控制文件以文本形式备份时,所创建的文件也称为跟踪文件,该文件实际上是一个sql脚本,可以利用它来“重新创建”新的控制文件。跟踪文件的存放位置由spfile文件中的user_dump_dest参数来决定。
-- 显示跟踪文件的位置 show parameter user_dump_dest;
3.2、恢复控制文件
当控制文件执行备份后,即使发生了磁盘物理损坏,只需要在初始文件中重新设置control_files参数的值,使它指向备份的控制文件,即可重新启动数据库。
(1)控制文件本身损坏
现在假设参数control_files所指定的某个控制文件被损坏,但该控制文件的目录仍然我可以访问,并且有这个控制文件的一个多路复用文件,那么可以直接将其复制到对应的目录,无需修改初始化参数,其操作步骤如下:
a、关闭数据库
shutdown immediate;
b、复制这个损坏文件对应的一个多路复用文件,覆盖掉原来目录下损坏文件。
c、重新启动数据。startup
(2) 磁盘介质永久性损坏
如果某个磁盘分区发生了物理性的永久损坏,而导致oracle系统不能访问control_files参数指定的某个控制文件,并且这个控制文件有一个多路复用文件的情况下,用户可以修改初始化参数将控制文件指定到新的可访问位置上,其操作步骤如下:
1、关闭数据库实例,将当前控制文件的一个多路复用文件复制到一个新的可用的位置。
2、编辑初始化参数control_files,用新的控制文件的位置替换掉原来损坏的位置,或者说删除原来损坏的位置。
3、重新启动数据库。
4、删除控制文件
如果控制文件的位置不再适合时,可以从数据库中删除控制文件,其操作过程如下。
(1)关闭数据库
(2) 编辑初始化参数control_files,清除掉打算要删除的控制文件名称。
(3) 重新启动数据库。
5、查询控制文件的信息
控制文件是一个二进制文件,其中被分隔为许多成分,分别记录各种类型的信息。每一类信息成为一个记录文档段。
select * from v$controlfile; -- 包含所有控制文件的名称和状态信息 select * from v$controlfile_record_section;-- 包含控制文件中各个记录文档段的信息。 select * from v$parameter -- 包含了系统的所有初始化参数,从中可以查询参数control_files的值 --查看控制文件中记录文档段的类型、文档段中每条记录的大小、记录文档段中最多能够存储的条目数、已经创建的数目等
select type,record_size,records_total,records_used from v$controlfile_record_section;