15.4 创建控制文件
控制文件在数据库中的作用前面已经讲过了,但是无论怎么保护都有可能出现控制文件丢失和损坏的问题。本节将学习创建控制文件。
控制文件在创建数据库时就自动创建了,并且在配置文件init.ora中已经记录了文件的路径。前面已经学习过控制文件记录的内容以及控制文件的重要性,控制文件一般情况下是不需要手工创建的。只有在两种情况下才考虑用手工的方式来创建控制文件,一种是当控制文件全部损坏,无法恢复时;一种是需要永久地修改数据库的参数设置时,因为手工创建控制文件会出现一些无法预计的问题,只能说是一种补救办法。
【示例8】手工创建控制文件
手工创建控制文件分为找原有的数据文件和重做日志的路径、关闭数据库、创建新的控制文件、修改init.ora中controlfiles参数、验证控制文件5个步骤。
(1)找原有的数据文件和重做日志的路径
数据文件和重做日志信息可以通过两种途径获取,一种方法是当控制文件没有损坏时,从控制文件中直接获取;一种方法是控制文件损坏了,从数据字典v$datafile中获取数据文件的信息,从数据字典v$logfile中获取日志文件的信息。前面的两种途径都是在数据库能够正常启动时使用的方法,如果数据库不能够正常启动,那么此时就需要根据系统提供的错误信息来查找原因。在创建新的控制文件并且使用它打开数据库之后,Oracle会对数据字典和控制文件的内容进行检查。如果发现数据字典包含了某个数据文件而控制文件中没有列出这个数据文件,Oracle数据库就会报错。数据库管理员就只能凭借这些信息来判断是否缺少必要的数据文件,一步一步查找直到找到真正的数据文件。
本例是在数据库能正常启动的情况下,通过datafile和logfile数据字典分别获得数据文件列表和日志文件列表,结果如图15.13所示。
图 15.13 查询datafile和logfile
(2)关闭数据库
在创建控制文件之前要关闭数据库,最好是正常关闭数据库。采用正常模式关闭,可以减少数据库重新启动过程中可能出现的问题。为保证数据库的安全,在关闭数据库后,应该把数据库的日志文件、数据文件、参数文件等备份到其他磁盘上。关闭数据库使用如下语句:
shutdown immediate;
(3)创建新的控制文件
在创建新的控制文件之前,最好把原来的控制文件备份到其他位置,这样创建的效果比较明显。此外,还要启动一个数据库的实例,这个数据库实例是安装数据库时自带的。启动实例过程如图15.14所示。
图 15.14 启动nomount实例
启动实例后就可以创建控制文件了,在创建控制文件时就需要用到日志文件和数据文件的列表。创建控制文件的语句如下:
create controlfile
reuse database "数据库实例名" noresetlogs//是否重做日志或重命名数据库noarchivelog//归档状态
maxlogfiles//最大日志文件大小
maxlogmembers//日志文件组的成员数
maxinstances//最大实例的个数
maxloghistory//最大历史日志文件个数
logfile//日志文件
group1 '日志文件的路径1' size日志文件的大小,
…
Groupn '日志文件的路径n' size日志文件的大小
datafile//数据文件
'路径1',
…
'路径n'
Character set we8dec
创建控制文件的结果如图15.15所示。
图 15.15 创建控制文件
在创建控制文件时如果不需要重做日志文件和重命名数据库,就使用noresetlogs,否则就使用resetlogs;在创建控制文件时也可以设置归档状态,如果设置为noarchivelog,则指非归档状态,若设置为archivelog,则是归档状态。
(4)修改init.ora中controlfiles参数
使用前面讲过的spfile方法,修改init.ora中的参数controlfiles。
(5)验证控制文件
重启数据库后,查询v$controlfile数据字典,检查控制文件是否全部正确加载。如果数据库启动不了,可以重启数据库服务。本例验证结果如图15.16所示。
图 15.16 验证控制文件
至此,控制文件创建成功。