简介
控制文件记录了当前数据库的结构信息,如数据文件,日志文件的信息和相关的状态等。它是一个二进制文件。在参数文件中描述控制文件的位置和数量,在数据库实例启动到mount状态时读取控制文件的信息,在open状态中一直被使用,以维护数据库的一致性。
控制文件位置
SHOW PARAMETER CONTROL_FILES
set lines 168 pages 99
col name for a60
select * from v$controlfile;
控制文件的内容
数据字典中查看
col type for a32
select * from V$CONTROLFILE_RECORD_SECTION;
strings 查看控制文件内容
- 数据库的名字,ID、创建的时间戳
- 表空间的名字
- 联机日志文件、数据文件的位置、个数、名字
- 联机日志的Sequence号码
- 检查点的信息
- 撤销段的开始或结束
- 归档信息
- 备份信息
重建控制文件注意事项
重建控制文件时,需要相应的redo logfile和数据文件已存在。
set和reuse database
- set database: 将数据文件头的db_name改成脚本中指定的名称
- reuse database: 读取数据文件头中的db_name并校验脚本中指定的名称是否一致
resetlogs和noresetlogs
-
noresetlogs: 从current的redo logfile中得到系统scn号,数据文件scn号
-
resetlogs: 将redo logfile内容清空,sequence#从1开始
tempfile
控制文件不包含tempfile,可以在open数据库后再创建。
问题
描述
当无备份控制文件的情况下,如何重建
处理方案
获取控制文件的方式
trace文件(需要在mount或open状态)
生成trace文件
alter database backup controlfile to trace as '/tmp/control_rebuild.trc';
生成的trace文件包含了resetlogs和noresetlogs 两个部分。若只需某一部分内容,可执行
alter database backup controlfile to trace as '/tmp/ctl_no.sql' noresetlogs;
alter database backup controlfile to trace as '/tmp/ctl_rel.sql' resetlogs;
查看文件(/tmp/control_rebuild.trc)
重建控制文件脚本
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "O11G" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/ups/data/oradata/o11g/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/ups/data/oradata/o11g/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/ups/data/oradata/o11g/redo03.log' SIZE 50M BLOCKSIZE 512
DATAFILE
'/ups/data/oradata/o11g/system01.dbf',
'/ups/data/oradata/o11g/sysaux01.dbf',
'/ups/data/oradata/o11g/undotbs01.dbf',
'/ups/data/oradata/o11g/users01.dbf',
'/ups/data/oradata/o11g/awrdata01.dbf',
'/ups/data/oradata/o11g/awridx01.dbf',
'/ups/data/oradata/o11g/vpx01.dbf'
CHARACTER SET ZHS16GBK
;
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('ENCRYPTION FOR DATABASE','ON');
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE '/ups/data/oradata/o11g/temp01.dbf'
SIZE 309329920 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
事件转储
这种方式不直观友好
alter session set events 'immediate trace name CONTROLF level 12';
或
oradebug setmypid
oradebug tracefile_name
oradebug dump controlf 12
获取trc文件路径
-- 获取trc文件
select pr.value || '/' || i.instance_name || '_ora_' || to_char(ps.spid)
|| '.trc' "trace file name" from v$session s, v$process ps, v$parameter pr, v$instance i
where s.paddr = ps.addr and s.sid = userenv('sid') and pr.name = 'user_dump_dest';
-- 获得当前的spid
select spid from v$process where addr =
(select paddr from v$session where sid =
(select sid from v$mystat where rownum = 1));