梵小花的自留地

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在学习群里有个同学误删除了控制文件,于是我也把自己数据库的控制文件删除了,看看能不能进行恢复,以下是整个实验的过程~~在做之前,先看看控制文件的备份方式:
1.生成可以重建控制文件的脚本。
2.备份二进制的控制文件。

        我们这次着重来看看第1种方式。
        查看控制文件,发现我自己只有一个控制文件,记得老师说过,有些数据库有好几个控制文件,每个控制文件的内容都是一样的,如果一个丢了或者坏了,从别的控制文件拷贝复制下就ok,结果我只有一个,不能使用这种方式进行恢复了,只能通过重建控制文件的方式来修复。
        如何获得重建控制文件的脚本呢?

SQL> select status from v$instance;

STATUS
------------
OPEN

SQL> alter database backup controlfile to trace;

数据库已更改。

SQL>  select d.value||b.bias||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid|
|'.trc' trace_file_name from ( select p.spid from sys.v$mystat m,sys.v$session s
,sys.v$process p where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr)
p, ( select t.instance from sys.v$thread t,sys.v$parameter v where v.name = 'thr
ead' and (v.value = 0 or t.thread# = to_number(v.value))) i, ( select value from
 sys.v$parameter where name = 'user_dump_dest') d,(select DECODE(count(BANNER),0
,'/','\') bias from v$version where upper(banner) like '%WINDOWS%') b;

TRACE_FILE_NAME
--------------------------------------------------------------------------------

d:\app\fx\diag\rdbms\orcl\orcl\trace\orcl_ora_3800.trc

  

      以上两个语句,就能获得控制文件的生成语句和该语句所在的位置啦~~我们现在过去看看这个创建语句长什么样?在上述路径下,我们顺利找到了该文件,在文件中,我们发现了以下内容,黑色加粗部分就是我们需要的创建控制文件的语句了~
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 'D:\APP\FX\ORADATA\ORCL\REDO01.LOG'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 'D:\APP\FX\ORADATA\ORCL\REDO02.LOG'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 'D:\APP\FX\ORADATA\ORCL\REDO03.LOG'  SIZE 50M BLOCKSIZE 512,
  GROUP 4 'D:\APP\FX\ORADATA\ORCL\REDO04.LOG'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  'D:\APP\FX\ORADATA\ORCL\SYSTEM01.DBF',
  'D:\APP\FX\ORADATA\ORCL\SYSAUX01.DBF',
  'D:\APP\FX\ORADATA\ORCL\UNDOTBS01.DBF',
  'D:\APP\FX\ORADATA\ORCL\USERS01.DBF',
  'D:\APP\FX\ORADATA\ORCL\EXAMPLE01.DBF',
  'D:\APP\FX\ORADATA\ORCL\UNDOTBS02.DBF',
  'D:\APP\FX\ORADATA\ORCL\USERS02.DBF',
  'D:\APP\FX\ORADATA\ORCL\USERS04.DBF',
  'D:\APP\FX\ORADATA\ORCL\USERS06.DBF'
CHARACTER SET ZHS16GBK
;
-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE 'D:\APP\FX\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2014_01_20\O1_MF_1_1_%U_.ARC';
-- ALTER DATABASE REGISTER LOGFILE 'D:\APP\FX\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2014_01_20\O1_MF_1_1_%U_.ARC';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE
-- All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;
-- Database can now be opened normally.
ALTER DATABASE OPEN;


       现在创建语句已经有了,我们就开始试验吧~~
1、我们先关闭数据库,将控制文件删除,分阶段启动数据库,先是到nomount,这个阶段需要参数文件,不需要控制文件,启动应该没问题:

SQL> startup nomount;
ORACLE 例程已经启动。

Total System Global Area  535662592 bytes
Fixed Size                  1375792 bytes
Variable Size             285213136 bytes
Database Buffers          243269632 bytes
Redo Buffers                5804032 bytes
SQL> select status from v$instance;

STATUS
------------------------
STARTED

  


2、接下来,启动到mount状态肯定就不行啦,因为我们已经把控制文件给删除啦~~既然这样,我们就要尝试进行控制文件的重建了~把上文中的创建语句在sys用户下执行一下吧~~

SQL> alter database mount;
alter database mount
*
第 1 行出现错误:
ORA-00205: ?????????, ??????, ???????


SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
  2      MAXLOGFILES 16
  3      MAXLOGMEMBERS 3
  4      MAXDATAFILES 100
  5      MAXINSTANCES 8
  6      MAXLOGHISTORY 292
  7  LOGFILE
  8    GROUP 1 'D:\APP\FX\ORADATA\ORCL\REDO01.LOG'  SIZE 50M BLOCKSIZE 512,
  9    GROUP 2 'D:\APP\FX\ORADATA\ORCL\REDO02.LOG'  SIZE 50M BLOCKSIZE 512,
 10    GROUP 3 'D:\APP\FX\ORADATA\ORCL\REDO03.LOG'  SIZE 50M BLOCKSIZE 512,
 11    GROUP 4 'D:\APP\FX\ORADATA\ORCL\REDO04.LOG'  SIZE 50M BLOCKSIZE 512
 12  DATAFILE
 13    'D:\APP\FX\ORADATA\ORCL\SYSTEM01.DBF',
 14    'D:\APP\FX\ORADATA\ORCL\SYSAUX01.DBF',
 15    'D:\APP\FX\ORADATA\ORCL\UNDOTBS01.DBF',
 16    'D:\APP\FX\ORADATA\ORCL\USERS01.DBF',
 17    'D:\APP\FX\ORADATA\ORCL\EXAMPLE01.DBF',
 18    'D:\APP\FX\ORADATA\ORCL\UNDOTBS02.DBF',
 19    'D:\APP\FX\ORADATA\ORCL\USERS02.DBF',
 20    'D:\APP\FX\ORADATA\ORCL\USERS04.DBF',
 21    'D:\APP\FX\ORADATA\ORCL\USERS06.DBF'
 22  CHARACTER SET ZHS16GBK
 23  ;

控制文件已创建。

SQL>

  

3、噢耶~~控制文件重建好了~~我们打开数据库试试~

SQL> ALTER DATABASE OPEN;

数据库已更改。

  


数据库打开了,我的数据库是归档模式,我重建了控制文件之后,需要再次对数据库进行备份。
如果还没有来得及生成重建控制文件的脚本,控制文件就坏了,那我们可以仿写这个重建语句,把自己数据库的相关信息填进去,一个崭新的重建语句就诞生啦~~~
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG  ----数据库名称
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 'D:\APP\FX\ORADATA\ORCL\REDO01.LOG'  SIZE 50M BLOCKSIZE 512,   -----日志文件组和路径信息
  GROUP 2 'D:\APP\FX\ORADATA\ORCL\REDO02.LOG'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 'D:\APP\FX\ORADATA\ORCL\REDO03.LOG'  SIZE 50M BLOCKSIZE 512,
  GROUP 4 'D:\APP\FX\ORADATA\ORCL\REDO04.LOG'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  'D:\APP\FX\ORADATA\ORCL\SYSTEM01.DBF',          -----数据文件信息
  'D:\APP\FX\ORADATA\ORCL\SYSAUX01.DBF',
  'D:\APP\FX\ORADATA\ORCL\UNDOTBS01.DBF',
  'D:\APP\FX\ORADATA\ORCL\USERS01.DBF',
  'D:\APP\FX\ORADATA\ORCL\EXAMPLE01.DBF',
  'D:\APP\FX\ORADATA\ORCL\UNDOTBS02.DBF',
  'D:\APP\FX\ORADATA\ORCL\USERS02.DBF',
  'D:\APP\FX\ORADATA\ORCL\USERS04.DBF',
  'D:\APP\FX\ORADATA\ORCL\USERS06.DBF'
CHARACTER SET ZHS16GBK
;

posted on 2014-01-20 16:21  梵小花的自留地  阅读(753)  评论(0编辑  收藏  举报