首先我们应该先了解一下控制文件的重要性 控制文件的概念: 控制文件是一个很小的二进制文件,用于记录数据库的物理结构。一个控制文件只属于一个数据库。创建数据库时,创建控制文件。当数据库的物理结构改变的时候,oracle会更新控制文件。用户不能编辑控
首先我们应该先了解一下控制文件的重要性
控制文件的概念:控制文件是一个很小的二进制文件,用于记录数据库的物理结构。一个控制文件只属于一个数据库。创建数据库时,创建控制文件。当数据库的物理结构改变的时候,oracle会更新控制文件。用户不能编辑控制文件,控制文件的修改由oracle完成。
数据库的启动和正常运行都离不开控制文件。启动数据库时,oracle从初始化参数文件中获得控制文件的名字及位置,打开控制文件,然后从控制文件中读取数据文件和联机日志文件的信息,最后打开数据库。数据库运行时,oracle会修改控制文件,所以,一旦控制文件损坏,数据库将不能正常运行。如果没有数据库的备份和归档日志文件,数据库将无法恢复。因此,我们应该多路镜像控制文件(multiplex control files),并把每个镜像的控制文件分布在不同的物理磁盘。根据经验,控制文件多路镜像以后,几个控制文件同时坏掉的可能性几乎为零。控制文件管理的重心是重在预防,而不是亡羊补牢!
控制文件的内容:
数据库名称(database name)
创建数据库的时间戳
数据文件的名字及位置
联机日志文件的名字及位置
表空间信息
日志历史记录(log history)
归档日志的信息
备份信息
当前的日志序列号(log sequence number)
检查点信息(checkpoint)
控制文件的大小由下面的几个参数决定:
maxlogfiles
maxlogmembers
maxloghistory
maxdatafiles
maxinstances
当增加、重命名、删除一个数据文件或者一个联机日志文件时,oracle服务器进程(server process)会立即更新控制文件以反映数据库结构的这种变化。所以,oracle总是告诫我们,在数据库的结构发生变化后,要备份控制文件。日志写进程lgwr负责把当前日志序列号记录到控制文件中。校验点进程ckpt负责把校验点的信息记录到控制文件中。归档进程负责把归档日志的信息记录到控制文件中。
初始化参数control_files的值记录控制文件的位置。通常,dba应该镜像控制文件,把每个控制文件分布到不同的物理磁盘,发生灾难时,即使其中一个控制文件损坏,数据不会丢失,也不会使整个数据库陷于瘫痪。
我们了解了控制文件的重要性后,如果我们真的将控制文件丢失,我们该如何做呢?
1、 从备份中拷贝控制文件
2、 重建控制文件
一、重建控制文件:
oracle提供如下命令:
alter databasebackup controlfile to trace;
操作步骤如下:
1、 连接数据库并查看版本
[oracle@edbjr2p1~]$ sqlplus / as sysdba
sql*plus:release 10.2.0.1.0 - production on sat mar 15 18:45:48 2014
copyright (c)1982, 2005, oracle. all rights reserved.
connected to:
oracle database10g enterprise edition release 10.2.0.1.0 - production
with thepartitioning, olap and data mining options
sys@prod>selectversion from v$instance;
version
-----------------
10.2.0.1.0
sys@prod>archivelog list
database logmode archive mode
automaticarchival enabled
archivedestination /u01/app/oracle/product/10.2.0/db_1/dbs/arch
oldest onlinelog sequence 2
next logsequence to archive 4
current logsequence 4
sys@prod>
2、得到创建控制文件的语句与操作
sys@prod>alterdatabase backup controlfile to trace;
databasealtered.
3、查看跟踪文件的内容
[oracle@edbjr2p1udump]$ more prod_ora_18466.trc
dump file/u01/app/oracle/admin/prod/udump/prod_ora_17286.trc
oracle database10g enterprise edition release 10.2.0.1.0 - production
with thepartitioning, olap and data mining options
oracle_home =/u01/app/oracle/product/10.2.0/db_1
systemname: linux
node name: edbjr2p1
release: 2.6.18-238.el5
version: #1 smp tue jan 4 15:24:05 est 2011
machine: i686
instance name:prod
redo threadmounted by this instance: 1
oracle processnumber: 26
unix processpid: 17286, image: oracle@edbjr2p1 (tns v1-v3)
*** 2014-03-1520:15:21.711
*** servicename:(sys$users) 2014-03-15 20:15:21.711
*** sessionid:(289.3) 2014-03-15 20:15:21.711
tkcrrsarc:(warn) failed to find arch for message (message:0x1)
tkcrrpa: (warn)failed initial attempt to send arch message (message:0x1)
*** 2014-03-1520:15:34.425
-- the followingare current system-scope redo log archival related
-- parametersand can be included in the database initialization file.
--
--log_archive_dest=''
--log_archive_duplex_dest=''
--
--log_archive_format=%t_%s_%r.dbf
--
--db_unique_name=prod
--
--log_archive_config='send, receive, nodg_config'
--log_archive_max_processes=2
--standby_file_management=manual
-- standby_archive_dest=?/dbs/arch
-- fal_client=''
-- fal_server=''
--
--log_archive_dest_1='location=/u01/app/oracle/product/10.2.0/db_1/dbs/arch'
--log_archive_dest_1='mandatory noreopen nodelay'
--log_archive_dest_1='arch noaffirm expedite noverify sync'
-- log_archive_dest_1='noregisternoalternate nodependency'
--log_archive_dest_1='nomax_failure noquota_size noquota_used nodb_unique_name'
--log_archive_dest_1='valid_for=(primary_role,online_logfiles)'
--log_archive_dest_state_1=enable
--
-- below are twosets of sql statements, each of which creates a new
-- control fileand uses it to open the database. the first set opens
-- the databasewith the noresetlogs option and should be used only if
-- the currentversions of all online logs are available. the second
-- set opens thedatabase with the resetlogs option and should be used
-- if onlinelogs are unavailable.
-- theappropriate set of statements can be copied from the trace into
-- a scriptfile, edited as necessary, and executed when there is a
-- need tore-create the control file.
--
-- set #1. noresetlogs case
--
-- the followingcommands will create a new control file and use it
-- to open thedatabase.
-- data used byrecovery manager will be lost.
-- additionallogs may be required for media recovery of offline
-- use this onlyif the current versions of all online logs are
-- available.
-- aftermounting the created controlfile, the following sql
-- statementwill place the database in the appropriate
-- protectionmode:
-- alter database set standby database tomaximize performance
startup nomount
createcontrolfile reuse database prod noresetlogs archivelog
maxlogfiles 30
maxlogmembers 5
maxdatafiles 100
maxinstances 1
maxloghistory 292
logfile
group 1 (
'/u01/app/oracle/oradata/prod/disk1/redo01.log',
'/u01/app/oracle/oradata/prod/disk2/redo01_b.log'
) size 100m,
group 2 (
'/u01/app/oracle/oradata/prod/disk1/redo02.log',
'/u01/app/oracle/oradata/prod/disk2/redo02_b.log'
) size 100m,
group 3 (
'/u01/app/oracle/oradata/prod/disk1/redo03.log',
'/u01/app/oracle/oradata/prod/disk2/redo03_b.log'
) size 100m,
group 4 (
'/u01/app/oracle/oradata/prod/disk1/redo04_a.log',
'/u01/app/oracle/oradata/prod/disk2/redo04_b.log'
) size100m
-- standbylogfile
datafile
'/u01/app/oracle/oradata/prod/disk1/system01.dbf',
'/u01/app/oracle/oradata/prod/disk1/undotbs01.dbf',
'/u01/app/oracle/oradata/prod/disk1/sysaux01.dbf',
'/u01/app/oracle/oradata/prod/disk1/example_01.dbf',
'/u01/app/oracle/oradata/prod/disk3/users_01.dbf',
'/u01/app/oracle/oradata/prod/disk5/dds_01.dbf'
character setus7ascii
;
-- commands tore-create incarnation table
-- below lognames must be changed to existing filenames on
-- disk. any onelog file from each branch can be used to
-- re-createincarnation records.
-- alterdatabase register logfile'/u01/app/oracle/product/10.2.0/db_1/dbs/arch1_1_842277968.dbf';
-- recovery isrequired if any of the datafiles are restored backups,
-- or if thelast shutdown was not normal or immediate.
recover database
-- all logs needarchiving and a log switch is needed.
alter systemarchive log all;
-- database cannow be opened normally.
alter databaseopen;
-- commands toadd tempfiles to temporary tablespaces.
-- onlinetempfiles have complete space information.
-- othertempfiles may require adjustment.
alter tablespacetemp01 add tempfile '/u01/app/oracle/oradata/prod/disk1/temp01.dbf'
size 20971520 reuse autoextend on next 8192 maxsize 32767m;
alter tablespacetemp1 add tempfile '/u01/app/oracle/oradata/prod/disk1/temp1_01_grp.dbf'
size 20971520 reuse autoextend on next 8192 maxsize 32767m;
alter tablespacetemp2 add tempfile '/u01/app/oracle/oradata/prod/disk1/temp2_01_grp.dbf'
size 20971520 reuse autoextend on next 8192 maxsize 32767m;
-- end oftempfile additions.
--
*** 2014-03-1520:18:32.065
*** 2014-03-1520:18:32.065 60679 kcrr.c
arch: archivaldisabled due to shutdown: 1089
*** 2014-03-1520:18:32.082 60679 kcrr.c
arch: archivaldisabled due to shutdown: 1089
4、编辑这个trace文件,我们就可以获得创建控制文件的脚本.
根据数据库不同状况,你可以选择是使用resetlogs/noresetlogs来重建控制文件
我们获得以下脚本:
[oracle@standby tools]$ cat createctlf.sql
startup nomount
createcontrolfile reuse database prod noresetlogs archivelog
maxlogfiles 30
maxlogmembers 4
maxdatafiles 100
maxinstances 1
maxloghistory 292
logfile
group 1 (
'/u01/app/oracle/oradata/prod/disk1/redo01.log',
'/u01/app/oracle/oradata/prod/disk2/redo01_b.log'
) size 100m,
group 2 (
'/u01/app/oracle/oradata/prod/disk1/redo02.log',
'/u01/app/oracle/oradata/prod/disk2/redo02_b.log'
) size 100m,
group 3 (
'/u01/app/oracle/oradata/prod/disk1/redo03.log',
'/u01/app/oracle/oradata/prod/disk2/redo03_b.log'
) size 100m,
group 4 (
'/u01/app/oracle/oradata/prod/disk1/redo04_a.log',
'/u01/app/oracle/oradata/prod/disk2/redo04_b.log'
) size 100m
-- standbylogfile
datafile
'/u01/app/oracle/oradata/prod/disk1/system01.dbf',
'/u01/app/oracle/oradata/prod/disk1/undotbs01.dbf',
'/u01/app/oracle/oradata/prod/disk1/sysaux01.dbf',
'/u01/app/oracle/oradata/prod/disk1/example_01.dbf',
'/u01/app/oracle/oradata/prod/disk3/users_01.dbf',
'/u01/app/oracle/oradata/prod/disk5/dds_01.dbf'
character set us7ascii;
recoverdatabase;
alter systemarchive log all;
alter databaseopen;
alter tablespacetemp01 add tempfile '/u01/app/oracle/oradata/prod/disk1/temp01.dbf'
size 20971520 reuse autoextend on next 8192 maxsize 32767m;
alter tablespacetemp1 add tempfile '/u01/app/oracle/oradata/prod/disk1/temp1_01_grp.dbf'
size 20971520 reuse autoextend on next 8192 maxsize 32767m;
alter tablespacetemp2 add tempfile '/u01/app/oracle/oradata/prod/disk1/temp2_01_grp.dbf'
size 20971520 reuse autoextend on next 8192 maxsize 32767m;
5、运行此脚本即可重建控制文件:
sys@prod>startupnomount;
oracle instancestarted.
total systemglobal area 419430400 bytes
fixed size 1219784 bytes
variablesize 121635640 bytes
databasebuffers 293601280 bytes
redobuffers 2973696 bytes
sys@prod>createcontrolfile reuse database prod noresetlogs archivelog
maxlogfiles 30
maxlogmembers 4
maxdatafiles 100
maxinstances 1
maxloghistory 292
logfile
group 1 (
'/u01/app/oracle/oradata/prod/disk1/redo01.log',
'/u01/app/oracle/oradata/prod/disk2/redo01_b.log'
) size 100m,
group 2 (
'/u01/app/oracle/oradata/prod/disk1/redo02.log',
'/u01/app/oracle/oradata/prod/disk2/redo02_b.log'
) size 100m,
group 3 (
'/u01/app/oracle/oradata/prod/disk1/redo03.log',
'/u01/app/oracle/oradata/prod/disk2/redo03_b.log'
) size 100m,
group 4 (
'/u01/app/oracle/oradata/prod/disk1/redo04_a.log',
'/u01/app/oracle/oradata/prod/disk2/redo04_b.log'
) size 100m
-- standbylogfile
datafile
'/u01/app/oracle/oradata/prod/disk1/system01.dbf',
'/u01/app/oracle/oradata/prod/disk1/undotbs01.dbf',
'/u01/app/oracle/oradata/prod/disk1/sysaux01.dbf',
'/u01/app/oracle/oradata/prod/disk1/example_01.dbf',
'/u01/app/oracle/oradata/prod/disk3/users_01.dbf',
'/u01/app/oracle/oradata/prod/disk5/dds_01.dbf'
character setus7ascii;
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
control filecreated.
sys@prod>recoverdatabase;
ora-00283:recovery session canceled due to errors
ora-00264: norecovery required
sys@prod>altersystem archive log all;
system altered.
sys@prod>alterdatabase open;
databasealtered.
sys@prod>altertablespace temp01 add tempfile '/u01/app/oracle/oradata/prod/disk1/temp01.dbf'
size 20971520 reuse autoextend on next 8192 maxsize 32767m;
alter tablespacetemp1 add tempfile '/u01/app/oracle/oradata/prod/disk1/temp1_01_grp.dbf'
size 20971520 reuse autoextend on next 8192 maxsize 32767m;
alter tablespacetemp2 add tempfile '/u01/app/oracle/oradata/prod/disk1/temp2_01_grp.dbf'
size 20971520 reuse autoextend on next 8192 maxsize 32767m;
2
tablespacealtered.
sys@prod> 2
tablespacealtered.
sys@prod> 2
tablespacealtered.
sys@prod>
二、备份控制文件
以上给出生成创建控制文件脚本并重建控制文件的方法,但是具体恢复中遇到的问题可能需要具体对待,当得不到trace文件,可根据这个格式,查看数据文件,更改相关内容再重建.这种方法通常是在没有控制文件(二进制文件)备份的情况下所采用的,如果存在备份应该使用备份的控制文件尝试恢复.