只有DBF的恢复

只有dbf的恢复
灾难场景:
1. ctl,redo,spfile丢失,dbf未丢失,无备份
2. ctl,redo,spfile,dbf均丢失,有备份但无ctl备份

实验一:ctl,redo,spfile丢失,dbf未丢失,无备份,数据库正常关闭

SQL> shutdown immediate

[[email protected] ~]$ cd $ORACLE_HOME/dbs/

[[email protected] dbs]$ cat initdong.ora

*.control_files=‘/u01/app/oracle/oradata/dong/control01.ctl‘,‘/u01/app/oracle/flash_recovery_area/dong/control02.ctl‘#Restore
Controlfile<BR>*.db_name=‘dong‘<BR>*._allow_resetlogs_corruption=TRUE

[[email protected] dbs]$ sqlplus / as sysdba

SQL>startup nomount pfile=‘$ORACLE_HOME/dbs/initdong.ora‘;

 

SQL>CREATE CONTROLFILE REUSE DATABASE "DONG" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
      MAXDATAFILES 100
        MAXINSTANCES 8
       MAXLOGHISTORY 292
    LOGFILE
     GROUP 1 ‘/u01/app/oracle/oradata/dong/redo01.log‘  SIZE 50M BLOCKSIZE 512,
        GROUP 2 ‘/u01/app/oracle/oradata/dong/redo02.log‘  SIZE 50M BLOCKSIZE 512,
     GROUP 3 ‘/u01/app/oracle/oradata/dong/redo03.log‘  SIZE 50M BLOCKSIZE 512
   -- STANDBY LOGFILE
    DATAFILE
      ‘/u01/app/oracle/oradata/dong/system01.dbf‘,
      ‘/u01/app/oracle/oradata/dong/sysaux01.dbf‘,
     ‘/u01/app/oracle/oradata/dong/undotbs01.dbf‘,
    ‘/u01/app/oracle/oradata/dong/users01.dbf‘
      CHARACTER SET WE8MSWIN1252 ;
Control file created.
SQL> alter database open;<BR>

实验二:ctl,redo,spfile丢失,dbf未丢失,无备份,数据库非正常关闭

SQL> create table t2149 as select * from dba_objects;
Table created.
SQL> shutdown abort

[[email protected] ~]$ cd $ORACLE_HOME/dbs/
[[email protected] dbs]$ vi initdong.ora
*.control_files=‘/u01/app/oracle/oradata/dong/control01.ctl‘,‘/u01/app/oracle/flash_recovery_area/dong/control02.ctl‘#Restore Controlfile
*.db_name=‘dong‘
[[email protected] dbs]$ sqlplus / as sysdba
SQL> startup nomount pfile=‘$ORACLE_HOME/dbs/initdong.ora‘;
SQL> CREATE CONTROLFILE REUSE DATABASE "DONG" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
   MAXLOGHISTORY 292
LOGFILE
 GROUP 1 ‘/u01/app/oracle/oradata/dong/redo01.log‘  SIZE 50M BLOCKSIZE 512,
    GROUP 2 ‘/u01/app/oracle/oradata/dong/redo02.log‘  SIZE 50M BLOCKSIZE 512,
  GROUP 3 ‘/u01/app/oracle/oradata/dong/redo03.log‘  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
 DATAFILE
   ‘/u01/app/oracle/oradata/dong/system01.dbf‘,
   ‘/u01/app/oracle/oradata/dong/sysaux01.dbf‘,
  ‘/u01/app/oracle/oradata/dong/undotbs01.dbf‘,
 ‘/u01/app/oracle/oradata/dong/users01.dbf‘
   CHARACTER SET WE8MSWIN1252 ;
Control file created.
SQL> select name,status from v$datafile;
NAME                                               STATUS
-------------------------------------------------- -------
/u01/app/oracle/oradata/dong/system01.dbf          SYSTEM
/u01/app/oracle/oradata/dong/sysaux01.dbf          RECOVER
/u01/app/oracle/oradata/dong/undotbs01.dbf         RECOVER
/u01/app/oracle/oradata/dong/users01.dbf           RECOVER

SQL> recover database until cancel;
ORA-00279: change 1382526 generated at 11/26/2013 20:04:55 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/product/11.2.0/dbhome_1/dbs/arch1_3_832524557.dbf
ORA-00280: change 1382526 for thread 1 is in sequence # 

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
ORA-10879: error signaled in parallel recovery slave
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: ‘/u01/app/oracle/oradata/dong/system01.dbf‘
ORA-10878: parallel recovery slave died unexpectedly 

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00600: internal error code, arguments: [2662], [0], [1382534], [0], [1382569], [4194432], [], [], [], [], [], []
Process ID: 3170
Session ID: 87 Serial number: 3

重新构造环境,然后重新执行recover,发现成功。。。:

SQL> recover database until cancel;
ORA-00279: change 1381057 generated at 11/26/2013 21:49:09 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/product/11.2.0/dbhome_1/dbs/arch1_1_832542546.dbf
ORA-00280: change 1381057 for thread 1 is in sequence #1 

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
ORA-10879: error signaled in parallel recovery slave
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: ‘/u01/app/oracle/oradata/dong/system01.dbf‘
ORA-10878: parallel recovery slave died unexpectedly
SQL> alter database open resetlogs;
Database altered.
SQL> select count(*) from t2149 ;
select count(*) from t2149
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

数据会有丢失,但应该只是丢失已经提交但还没有写到dbf里的。

实验三:ctl,redo,spfile,dbf均丢失,有备份但无ctl备份

对于紧紧有dbf的备份,但没有ctl备份的情况,肯定是需要重建ctl了,那如果ctl重建的话,就肯定查不到dbf的备份信息,在这种情况下,恢复如下:

[[email protected] dong]$ ll
总用量 1850616
-rw-r-----. 1 oracle oinstall  10076160 11月 26 21:58 control01.ctl
-rw-r-----. 1 oracle oinstall  10559488 11月 25 21:09 ff.dbf
-rw-r-----. 1 oracle oinstall  52429312 11月 26 21:58 redo01.log
-rw-r-----. 1 oracle oinstall  52429312 11月 26 21:51 redo02.log
-rw-r-----. 1 oracle oinstall  52429312 11月 26 21:51 redo03.log
-rw-r-----. 1 oracle oinstall 492838912 11月 26 21:58 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 996155392 11月 26 21:58 system01.dbf
-rw-r-----. 1 oracle oinstall  20979712 10月 25 12:23 temp011.dbf
-rw-r-----. 1 oracle oinstall  20979712 10月 22 13:54 temp01.dbf
-rw-r-----. 1 oracle oinstall 214966272 11月 26 21:58 undotbs01.dbf
-rw-r-----. 1 oracle oinstall  10559488 11月 26 21:58 users01.dbf
[[email protected] dong]$ rm -rf *
[[email protected] ~]$ cd $ORACLE_HOME/dbs/
[[email protected] dbs]$ vi initdong.ora
*.control_files=‘/u01/app/oracle/oradata/dong/control01.ctl‘,‘/u01/app/oracle/flash_recovery_area/dong/control02.ctl‘#Restore Controlfile
*.db_name=‘dong‘
[[email protected] dbs]$ sqlplus / as sysdba
SQL> startup nomount pfile=‘$ORACLE_HOME/dbs/initdong.ora‘;
SQL> CREATE CONTROLFILE REUSE DATABASE "DONG" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
  3      MAXLOGMEMBERS 3
  4      MAXDATAFILES 100
  5      MAXINSTANCES 8
  6     MAXLOGHISTORY 292
  7  LOGFILE
  8   GROUP 1 ‘/u01/app/oracle/oradata/dong/redo01.log‘  SIZE 50M BLOCKSIZE 512,
  9      GROUP 2 ‘/u01/app/oracle/oradata/dong/redo02.log‘  SIZE 50M BLOCKSIZE 512,
 10    GROUP 3 ‘/u01/app/oracle/oradata/dong/redo03.log‘  SIZE 50M BLOCKSIZE 512
 11  -- STANDBY LOGFILE
 12   DATAFILE
 13     ‘/u01/app/oracle/oradata/dong/system01.dbf‘,
 14     ‘/u01/app/oracle/oradata/dong/sysaux01.dbf‘,
 15    ‘/u01/app/oracle/oradata/dong/undotbs01.dbf‘,
 16   ‘/u01/app/oracle/oradata/dong/users01.dbf‘
 17     CHARACTER SET WE8MSWIN1252 ;
 CREATE CONTROLFILE REUSE DATABASE "DONG" NORESETLOGS  ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file
‘/u01/app/oracle/oradata/dong/system01.dbf‘--这里很是不解啊?为啥创建ctl的时候会去检查各个dbf是否存在呢,而且还会读取文件的内容
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3

因此尝试将ctl和dbf文件从备份文件中恢复。

恢复控制文件:

SQL> declare
  2  devtype varchar2(256);
  3  done  boolean;
  4  begin
  5  devtype:=sys.dbms_backup_restore.deviceAllocate(type=>‘‘,ident=>‘T1‘);
  6  sys.dbms_backup_restore.restoresetdatafile;
  7  sys.dbms_backup_restore.restorecontrolfileto(cfname=>‘/u01/app/oracle/oradata/dong/control01.ctl‘);
sys.dbms_backup_restore.restorebackuppiece(done=>done,handle=>‘/u01/app/oracle/flash_recovery_area/DONG/autobackup/2013_11_27/o1_mf_s_832590070_99br9o1s_.bkp‘,params=>null);
  9  sys.dbms_backup_restore.devicedeallocate;
 10  end;
 11  / 

PL/SQL procedure successfully completed. 

SQL> !ls -l
-rw-r-----. 1 oracle oinstall 10141696 11月 29 16:21 control01.ctl
SQL> alter database mount; 

Database altered.
[[email protected] dong]$ rman target / 

Recovery Manager: Release 11.2.0.1.0 - Production on Fri Nov 29 16:22:42 2013 

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved. 

connected to target database: DONG (DBID=2075447482, not open) 

RMAN> list backup; 

using target database control file instead of recovery catalog 

List of Backup Sets
=================== 

BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
69      Full    1.21G      DISK        00:01:04     27-NOV-13
        BP Key: 69   Status: AVAILABLE  Compressed: NO  Tag: TAG20131127T110314
        Piece Name: /home/oracle/11271103full832590194
  List of Datafiles in backup set 69
  File LV Type Ckp SCN    Ckp Time  Name
  ---- -- ---- ---------- --------- ----
  1       Full 1384847    27-NOV-13 /u01/app/oracle/oradata/dong/system01.dbf
  2       Full 1384847    27-NOV-13 /u01/app/oracle/oradata/dong/sysaux01.dbf
  3       Full 1384847    27-NOV-13 /u01/app/oracle/oradata/dong/undotbs01.dbf
  4       Full 1384847    27-NOV-13 /u01/app/oracle/oradata/dong/users01.dbf
  5       Full 1297899    25-NOV-13 /u01/app/oracle/oradata/dong/ff.dbf

再直接restore即可,不过这里我们还是使用包来将dbf恢复:

SQL> select status from v$instance; 

STATUS
------------
MOUNTED 

SQL> declare
    devtype varchar2(256);
    done boolean;
    begin
    devtype:=sys.dbms_backup_restore.deviceallocate(type=>‘‘,ident=>‘t1‘);
    sys.dbms_backup_restore.restoresetdatafile;
    sys.dbms_backup_restore.restoredatafileto(dfnumber=>01,toname=>‘/u01/app/oracle/oradata/dong/system01.dbf‘);
     sys.dbms_backup_restore.restoredatafileto(dfnumber=>02,toname=>‘/u01/app/oracle/oradata/dong/sysaux01.dbf‘);
     sys.dbms_backup_restore.restoredatafileto(dfnumber=>03,toname=>‘/u01/app/oracle/oradata/dong/undotbs01.dbf‘);
     sys.dbms_backup_restore.restoredatafileto(dfnumber=>04,toname=>‘/u01/app/oracle/oradata/dong/users01.dbf‘);
     sys.dbms_backup_restore.restoredatafileto(dfnumber=>05,toname=>‘/u01/app/oracle/oradata/dong/ff.dbf‘);
     sys.dbms_backup_restore.restorebackuppiece(done=>done,handle=>‘/home/oracle/11271103full832590194‘,params=>null);
     sys.dbms_backup_restore.devicedeallocate;
     end;
    / 

PL/SQL procedure successfully completed.
[[email protected] dong]$ ll
总用量 1704472
-rw-r-----. 1 oracle oinstall  10141696 11月 29 16:20 control01.ct
-rw-r-----. 1 oracle oinstall  10141696 11月 29 16:27 control01.ctl
-rw-r-----. 1 oracle oinstall  10559488 11月 29 16:26 ff.dbf
-rw-r-----. 1 oracle oinstall 492838912 11月 29 16:27 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 996155392 11月 29 16:27 system01.dbf
-rw-r-----. 1 oracle oinstall 214966272 11月 29 16:26 undotbs01.dbf
-rw-r-----. 1 oracle oinstall  10559488 11月 29 16:26 users01.dbf

接下来就可以recover了:

SQL> alter system set log_archive_dest_1=‘LOCATION=/u01/app/oracle/diag/rdbms/dong‘; 

System altered. 

SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[[email protected] 2013_11_27]$ rman target / 

Recovery Manager: Release 11.2.0.1.0 - Production on Fri Nov 29 16:55:57 2013 

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved. 

connected to target database: DONG (DBID=2075447482, not open) 

RMAN> recover database; 

Starting recover at 29-NOV-13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=99 device type=DISK
datafile 5 not processed because file is read-only 

starting media recovery 

archived log file name=/u01/app/oracle/diag/rdbms/dong/1_7_832589996.dbf thread=1 sequence=7
media recovery complete, elapsed time: 00:00:01
Finished recover at 29-NOV-13 

SQL> alter database open resetlogs; 

Database altered.

小插曲:

恢复归档文件:

declare
devtype varchar2(256);
done boolean;
begin
devtype:=sys.dbms_backup_restore.deviceallocate(type=>‘‘,ident=>‘t1‘);
sys.dbms_backup_restore.restoresetarchivedlog(destination=>‘归档目录‘);
sys.dbms_backup_restore.restorearchivedlog(thread=>1,seqnce=>1);
sys.dbms_backup_restore.restorearchivedlog(thread=>1,seqnce=>2);
sys.dbms_backup_restore.restorearchivedlog(thread=>1,seqnce=>3);
sys.dbms_backup_restore.restorearchivedlog(thread=>1,seqnce=>4);
sys.dbms_backup_restore.restorearchivedlog(thread=>1,seqnce=>5);
sys.dbms_backup_restore.restorearchivedlog(thread=>1,seqnce=>6);
sys.dbms_backup_restore.restorearchivedlog(thread=>1,seqnce=>7);
sys.dbms_backup_restore.restorearchivedlog(thread=>1,seqnce=>8);
sys.dbms_backup_restore.restorebackuppiece(done=>done,handle=>‘归档备份集‘,params=>null);
sys.dbms_backup_restore.devicedeallocate;
end;

时间: 2024-08-02 06:56:50

只有DBF的恢复的相关文章

通过dbf文件恢复oracle

可能有些人会由于各种原因经常重装系统,但是系统里面总是有一些比较重要的软件在重装后就不能用了.比如oracle数据库,众所周知数据库如果通过dmp导入导出麻烦不说,还很耗时,特别是像笔者一个数据库就有上百G的内容,通过导入dmp来恢复就更不现实了.遇到这样的情况,我们就来通过已有的数据库文件还原一个数据库吧. (1)准备一个和原来数据库版本一样的oracle安装文件,如Oracle R2 (10.2.0.1) 64位企业版 (2)删除或备份原来的数据库安装目录,如“E:\oracle\produ

Oracle RMAN备份恢复指导书

目 录 1 目的与范围... 1 2 术语和定义... 1 3 角色和职责... 2 4 使用RMAN备份数据库... 2 4.1.1 检查数据库模式... 2 4.1.2 连接到target数据库... 3 4.1.3 查看备份信息... 3 4.1.4 备份数据库... 5 4.1.5 备份数据文件... 6 4.1.6 备份表空间... 6 4.1.7 备份控制文件... 6 4.1.8 备份归档日志文件... 7 4.1.9 备份闪回区... 8 4.1.10 增量备份... 8 4.2

oracle数据库完全恢复和不完全恢复以及执行用户管理辈分恢复

比较完全恢复和不完全恢复: 一.完全恢复:将数据库恢复到当前最新状态,包括直至请求恢复时进行的所有已提交的数据更改 二.不完全恢复:将数据库恢复到请求恢复操作之前指定的过去时间点 一.完全恢复过程 下面的步骤说明了执行完全恢复期间要采取的操作: 1. 通过备份还原损坏或丢失的文件. 2. 根据需要应用增量备份.归档重做日志文件和联机重做日志文件中的更改.将重做日志更改应用于数据文件,直到到达当前联机日志,并且重新输入了最新的事务处理.在整个过程中会生成还原块.这称为前滚或高速缓存恢复. 3. 此

[转]Oracle DB 执行用户管理的备份和恢复

• 说明用户管理的备份和恢复与服务器管理的备份和恢复之间的差异 • 执行用户管理的数据库完全恢复 • 执行用户管理的数据库不完全恢复 备份和恢复的使用类型 数据库备份和恢复的类型包括: • 用户管理的:不使用RMAN – 使用OS 命令移动文件 – DBA 需要手动维护备份活动记录 • 服务器管理的:使用RMAN 有两种方法可用来恢复数据库.可以使用RMAN 并利用其自动恢复功能.它可以还原相应的文件,并使用非常少的命令使数据库恢复到当前状态.还可以手动进行恢复.这称为“用户管理的恢复”.用户管

静默方式安装10g数据库软件+升级patch+手工建库

通常我们安装Oracle数据库软件,都是用OUI图形界面来完成的,但有些Unix/Linux系统中并未安装图形系统,也就无法使用图形界面来安装Oracle的产品了,对于这种场景,就只能采用静默方式来安装了,Oracle提供了这种silent方式,主要是通过配置响应文件rsp来完成的. 一.静默安装10.2.0.1数据库软件 --解压安装包 [[email protected] u01]$ unzip 10201_database_linux32.zip [[email protected] u0

Oracle 数据库命令个人总结

一.日志管理 1.强制日志切换(forcing log switches) alter system switch logfile; 2.强制执行检查点(forcing checkpoints) alter system checkpoint; 3.增加一个重做日志组 (adding online redo log groups) alter fatabases add logfile [ group 4 ] ('/disk3/log4a.rdo','/disk4/log4b.rdo') siz

学习笔记:Oracle dul数据挖掘 导出Oracle11G数据文件坏块中表中

试验模拟导出Oracle 11G数据库中数据文件坏块中表中的数据 以前一直以为dul对应的版本只能恢复最高的数据库版本一致,今天测试发现dul 10可以恢复11g最新版的数据库.模拟环境 SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition

Oracle RMAN-06023 和ORA-19693错误

在将一个0级备份的数据库还原到其它机器上时,首先遇到了RMAN-06023然后遇到ORA-19693错误,错误发生的环境和内容大致如下: 数据库版本: SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.

oracle系列(五)高级DBA必知的Oracle的备份与恢复(全录收集)

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 数据库备份与恢复是数据库管理员必须掌握的.没有任何系统能免遭硬盘物理损坏.粗心用户的错误操作.或一些可能会威胁到存储数据的潜在灾难的侵袭.为了能够最大限度地恢复数据库数据,保证数据库的安全运行,应该选择最合理的备份方法来防止各种故障所导致的用户数据丢失,本次主要介绍三种备份恢复技术,即RMAN技术.数据泵技术及闪回技术. 一.备份与恢复概