Oracle丢失控制文件后重建

简介

控制文件记录了当前数据库的结构信息,如数据文件,日志文件的信息和相关的状态等。它是一个二进制文件。在参数文件中描述控制文件的位置和数量,在数据库实例启动到mount状态时读取控制文件的信息,在open状态中一直被使用,以维护数据库的一致性。

控制文件位置

SHOW PARAMETER CONTROL_FILES

set lines 168 pages 99
col name for a60
select * from v$controlfile;

Oracle-重建控制文件的方式_日志文件

控制文件的内容

数据字典中查看

col type for a32
select * from V$CONTROLFILE_RECORD_SECTION;

Oracle-重建控制文件的方式_hive_02

strings 查看控制文件内容

Oracle-重建控制文件的方式_控制文件_03

  • 数据库的名字,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)

Oracle-重建控制文件的方式_数据库_04

重建控制文件脚本
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));