oracle 丢失备份 Oracle DB备份恢复篇之丢失控制文件

目标
本文主要介绍如何重建控制文件

解决方案
警告:尽量从你多路复用的控制文件或最近的备份中恢复出你的控制文件。这里我们仅是帮助你在控制文件备份都损坏无法使用情况下可尝试的方法。

当发生以下情况时,你才不得不考虑自己去重建控制文件:

  • 数据库下当前所有的备份都丢失或损坏了。
  • 你可以恢复控制文件的所用备份也丢失或损坏了。
  • 你需要在控制文件中修改一个hard limit数据库参数。
  • 如果你正要将数据库从原来的位置转移存放到另一台服务器上,且目录结构存放位置不同。

如果当前数据库是mount或open状态的,那么可以使用命令来生成一个新的controlfile脚本

首先你必须从数据库中提取并生成一份ascii导出文件。执行以下命令:

SQL> alter database backup controlfile to trace;

导出的控制文件信息会被写入user_dump_destination下的trace文件中。

SQL> show parameter user_dump_dest 

NAME            TYPE         VALUE 
--------------  ------       ------------------------------------------------ 
user_dump_dest  string       /oracle/product/11.1.0/db_1/diag/rdbms/V11/trace

在相应目录下找到生成的文件并定位信息:

% cd /oracle/product/11.1.0/db_1/diag/rdbms/V11/trace
% ls -ltr

一般你定位到的文件trace文件如下:

Trace file /oracle/product/11.1.0/db_1/diag/rdbms/V11/trace/V11_ora_31225.trc 

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 
ORACLE_HOME = /oracle/product/11.1.0/db_1 
...

或者你可以使用一个更简单的方法来得到tracefile位置:

SQL> alter database backup controlfile to trace;

Database altered.

SQL> oradebug setmypid;
Statement processed.
SQL> oradebug tracefile_name;
/opt/app/oracle/diag/rdbms/ora11g/ORA11G/trace/ORA11G_ora_17822.trc

 在文件中,你需要留意到其中create controlfile内容,修改其中部分以建立你所需的控制文件:
 

CREATE CONTROLFILE REUSE DATABASE "V11" NORESETLOGS ARCHIVELOG  
MAXLOGFILES 16  
MAXLOGMEMBERS 3  
MAXDATAFILES 100  
MAXINSTANCES 8  
MAXLOGHISTORY 292  
LOGFILE  
GROUP 1 '/oradata/V11/redo01.log' SIZE 50M,  
GROUP 2 '/oradata/V11/redo02.log' SIZE 50M,  
GROUP 3 '/oradata/V11/redo03.log' SIZE 50M  
DATAFILE  
'/oradata/V11/system01.dbf',  
'/oradata/V11/sysaux01.dbf',  
'/oradata/V11/undotbs01.dbf', 
'/oradata/V11/user01.dbf'  
CHARACTER SET WE8MSWIN1252  
;

注意删除"CREATE CONTROLFILE"前和CHARACTER SET后那些无关信息。保证你的脚本后面“;”别漏。
在上面的例子中数据库当前运行在归档模式下,我们选用NORESETLOGS来应用新的控制文件启动数据库并恢复。
因此请确保在保存在重建控制文件脚本后,使用immediate命令项来进行关库。
 

SQL> shutdown immediate;
SQL> startup nomount;
SQL>@control.sql

注意:在你重建控制文件后,需要将已经存在的TEMP文件添加回数据库中。例如:

ALTER TABLESPACE TEMP_TEST ADD TEMPFILE '/oradata/V11/temp01.dbf' reuse;

如果数据库使用resetlogs打开的,那么请记得尽快给数据库做一个备份。


如果你是在数据库无法mount的情况下,建立新的控制文件。

在极端情况下,你没用正常渠道来获取一份控制文件:

  1. 从已有备份中恢复控制文件
  2. 你在过去的trace文件中找不到之前使用"backup controlfile to trace script"生成过的控制文件历史信息。
  3. 或你必须从头开始手工建立一个脚本来列出所需的数据库文件,来生成控制文件。
CREATE CONTROLFILE REUSE DATABASE "DBNAME" NORESETLOGS ARCHIVELOG

那么请一定仔细小心以避免遗漏,可按照以下顺序列出:

  • 重做日志位置.
  • 数据文件位置
  • 指定好字符集.

一旦你已经正确列出所有所需文件并准备重建控制文件,就可以继续建立操作了:

SQL> startup nomount; 
SQL>@control.sql

猜你喜欢

转载自blog.csdn.net/liu_maclean/article/details/81287564