ITPub博客

首页 > 数据库 > Oracle > 控制文件恢复测试

控制文件恢复测试

Oracle 作者:studywell 时间:2016-04-08 16:01:34 0 删除 编辑

控制文件恢复测试
 
 参考:
 http://blog.chinaunix.net/uid-17143914-id-2824664.html
 http://blog.itpub.net/30162081/viewspace-1678479/
 
测试环境:
SQL> conn / as sysdba
SQL> show parameter control

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time         integer     7
control_files                 string     /oracle/app/oracle/oradata/orcl/control01.ctl, /oracle/app/oracle/fast_recovery_area/orcl/control02.ctl
control_management_pack_access         string     DIAGNOSTIC+TUNING
SQL> show parameter pfile;

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
spfile                     string     /oracle/app/oracle/product/11.2.0/dbs/spfileorcl.ora

 
 
 控制文件损坏:

控制文件(control file)是一个相当小的文件(最多能增长到64M左右),其中包含Oracle需要的其他文件的一个目录。参数文件告知实例控制文件的位置,控制文件则告知示例数据库和在线重做日志文件的位置。控制文件还告知了Oracle其他一些事情,如已发生检查点的有关信息、数据库名(必须和db_name参数匹配)、创建数据库的时间戳、归档重做日志的历史(有时这会让控制文件变大)、RMAN信息等。
控制文件应该通过硬件(RAID)多路保存,如果不支持镜像,则要通过Oracle多路保存。应该有不止一个副本,而且它们应该保存在不同的磁盘上,以防止万一出现磁盘故障而丢失控制文件。丢失控制文件并不是致命的,但是会使恢复变得困难很多。
可以通过查询数据库的日志文件来定位损坏了的控制文件。

本文如下3部分;
一、损坏单个控制文件:
二、损坏所有的控制文件:
三、控制文件完全丢失,重新创建;

一、损坏单个控制文件:
1. 确保数据库已经关闭:shutdown immediate;   或shutdown abort
2. 查看初始化文件$ORACLE_BASE/admin/pfile/initORCL.ora,或查看alert日志确定所有控制文件的路径。
3. 用操作系统命令将其它正确的控制文件覆盖错误的控制文件。
4. 重新启动数据库:startup;
5. 检查日志有无报错,数据库操作有无异常;


二、损坏所有的控制文件:
1. 确保数据库已经关闭,
2. 从相应的备份结果集中恢复最近的控制文件;
 restore controlfile from '/backup/c-1368494897-20160407-00';

3. 用下面的命令来创建产生数据库控制文件的脚本:
startup mount;
alter database backup controlfile to trace;
具体trace文件目录可见alert日志;
也可通过语句查找:
 select tracefile from v$process where addr in (select paddr from v$session where sid in (select sid from v$mystat));


4. 修改第三步产生的trace文件,将其中关于创建控制文件的一部分语句拷贝出来并做些修改,使得它能够体现最新的数据库结构。将产生的sql文件名字为createcontrol.sql.

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/oracle/app/oracle/oradata/orcl/redo01.log',
    '/oracle/app/oracle/oradata/orcl/redo11.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 2 (
    '/oracle/app/oracle/oradata/orcl/redo21.log',
    '/oracle/app/oracle/oradata/orcl/redo02.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 3 (
    '/oracle/app/oracle/oradata/orcl/redo03.log',
    '/oracle/app/oracle/oradata/orcl/redo31.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 4 (
    '/oracle/app/oracle/oradata/orcl/redo4_1.log',
    '/oracle/app/oracle/oradata/orcl/redo4_2.log'
  ) SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/oracle/app/oracle/oradata/orcl/system01.dbf',
  '/oracle/app/oracle/oradata/orcl/sysaux01.dbf',
  '/oracle/app/oracle/oradata/orcl/undotbs01.dbf',
  '/oracle/app/oracle/oradata/orcl/users01.dbf',
  '/oracle/app/oracle/oradata/orcl/tb01.dbf',
  '/oracle/app/oracle/oradata/orcl/tbsalert01.dbf',
  '/oracle/app/oracle/oradata/orcl/streams01.dbf'
CHARACTER SET ZHS16GBK
;
-- Configure RMAN configuration record 1
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON');
-- Configure RMAN configuration record 2
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE','DISK TO ''/backup/%F''');
-- Configure RMAN configuration record 3
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('RETENTION POLICY','TO REDUNDANCY 2');
-- Configure RMAN configuration record 4
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CHANNEL','DEVICE TYPE DISK FORMAT   ''/backup/%U''');


5. 用下面命令重新创建控制文件:
shutdown abort;
startup nomount;
@createcontrol.sql;

根据实际情况将归档日志注册到数据库上;
-- ALTER DATABASE REGISTER LOGFILE '/oracle/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/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;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/app/oracle/oradata/orcl/temp01.dbf' REUSE;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/app/oracle/oradata/orcl/temp02.dbf' REUSE;

如不添加临时空间文件,则在dba_temp_files看不到该临时文件;


NORESETLOGS VS RESETLOGS
从trace文件可以看出,提供了两个创建控制文件的脚本,分别针对两种不同的应用场景:NORESETLOGS适用于当前redo log可用,而RESETLOGS适用于当前redo log不可用。

NORESETLOGS重建步骤
1.执行脚本,重建控制文件(CREATE CONTROLFILE REUSE DATABASE "HOEGH" NORESETLOGS NOARCHIVELOG......)
2.执行介质恢复RECOVER DATABASE
3.打开数据库ALTER DATABASE OPEN;
4.添加临时表空间

RESETLOGS重建步骤
1.执行脚本,重建控制文件(CREATE CONTROLFILE REUSE DATABASE "HOEGH" RESETLOGS NOARCHIVELOG......)
2.执行介质恢复RECOVER DATABASE USING BACKUP CONTROLFILE
3.打开数据库ALTER DATABASE OPEN RESETLOGS;
4.添加临时表空间

6. 用适当的方法进行数据库全备份。


三、控制文件完全丢失,重新创建;
如果丢失了所有的控制文件并且没有任何的备份,我们可以通过重建控制文件来打开数据库。其中,重建控制文件至少需要以下信息:
1.数据库名
2.字符集
3.数据文件名称
4.初始化参数,包括MAXLOGFILES、MAXLOGMEMBERS、MAXDATAFILES、MAXINSTANCES、MAXLOGHISTORY等;


1、启动数据库,根据参数文件找到控制文件,rm删除掉;
rm /oracle/app/oracle/oradata/orcl/control01.ctl
rm /oracle/app/oracle/fast_recovery_area/orcl/control02.ctl

2、强制关闭数据库,然后重启数据库,报ORA-00205错误。需要注意的是,此时执行shutdown immediate命令,数据库无法正常关闭,只能关闭到mounted状态;需要使用shutdown abort命令强制关闭数据库。

3、获取数据库名
数据库启动报错,但可查看参数;
idle> show parameter db_name

NAME                     TYPE            VALUE
------------------------------------ ---------------------- ------------------------------
db_name                  string            orcl
idle>

4、启动到nomount状态,获取字符集

idle> select userenv('language') from dual;

USERENV('LANGUAGE')
--------------------------------------------------------------------------------------------------------
AMERICAN_AMERICA.US7ASCII


5、获取数据文件名称
通过ls命令获取数据文件列表。
查找各redo文件列表



6、生成创建控制文件脚本
这样,创建控制文件所需的基本信息都已经有了,我们来生成创建控制文件脚本。
 

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/oracle/app/oracle/oradata/orcl/redo01.log',
    '/oracle/app/oracle/oradata/orcl/redo11.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 2 (
    '/oracle/app/oracle/oradata/orcl/redo21.log',
    '/oracle/app/oracle/oradata/orcl/redo02.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 3 (
    '/oracle/app/oracle/oradata/orcl/redo03.log',
    '/oracle/app/oracle/oradata/orcl/redo31.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 4 (
    '/oracle/app/oracle/oradata/orcl/redo4_1.log',
    '/oracle/app/oracle/oradata/orcl/redo4_2.log'
  ) SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/oracle/app/oracle/oradata/orcl/system01.dbf',
  '/oracle/app/oracle/oradata/orcl/sysaux01.dbf',
  '/oracle/app/oracle/oradata/orcl/undotbs01.dbf',
  '/oracle/app/oracle/oradata/orcl/users01.dbf',
  '/oracle/app/oracle/oradata/orcl/tb01.dbf',
  '/oracle/app/oracle/oradata/orcl/tbsalert01.dbf',
  '/oracle/app/oracle/oradata/orcl/streams01.dbf'
CHARACTER SET US7ASCII
;

7、重建控制文件
将数据库启动到nomount状态下;

执行上述创建控制文件脚本后,数据库状态为mount状态;


根据实际情况将归档日志注册到数据库上;
-- ALTER DATABASE REGISTER LOGFILE '/oracle/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/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;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/app/oracle/oradata/orcl/temp01.dbf' REUSE;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/app/oracle/oradata/orcl/temp02.dbf' REUSE;

如不添加临时空间文件,则在dba_temp_files看不到该临时文件;

8、总结
下面总结一下重建控制文件的步骤:
1.获取数据库名;
2.获取字符集名;
3.获取数据文件名和redo文件名,temp文件名;
4.重建控制文件;
5.执行介质恢复;
6.打开数据库,添加临时文件。

附录:
当前数据库字符集为ZHS16GBK,但在删除控制文件后,查询字符集却为US7ASCII,该字符集为ZHS16GBK子集;
idle> select userenv('language') from dual;

USERENV('LANGUAGE')
--------------------------------------------------------------------------------------------------------
AMERICAN_AMERICA.US7ASCII

控制文件创建后,将数据库open,在alert日志中会提示数据库字符集自动转换。如下:
*********************************************************************
Updating character set in controlfile to ZHS16GBK
No Resource Manager plan active
**********************************************************




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29519108/viewspace-2077505/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-03-04

  • 博文量
    305
  • 访问量
    428301