如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638 QQ号:47079569 邮箱:service@parnassusdata.com

    适用于: Oracle Database - Enterprise Edition – 版本8.1.5.0 及以上 本文详细适用于任何平台。 目的 本公告列出在不恢复整个数据库的情况下执行恢复来还原被drop表的步骤。公报假定读者熟悉Oracle文档集中记的录Oracle恢复过程。 本公告是根据用户管理(非RMAN)备份,因此数据文件和ARCHIVELOG文件的还原是基于用户管理的备份。对于RMAN过程,请参见: How to Recover From a DROP / TRUNCATE / DELETE TABLE with RMAN (Note 223543.1) 故障排除步骤 术语 ----------- 生产机PROD machine - 生产数据库运行的主机。还表示生产实例的ORACLE_SID。 测试机TEST machine - 主机,物理上与生产数据库运行的机器不同 TEMP – 用于访问被还原数据库的实例的ORACLE_SID 。 备份The backup - 用作恢复被drop表的基础的备份数据库结构集(参见要求)。一旦被还原,这组结构被称为部分还原的数据库。 要求 ------------ 备份中必须有以下数据结构: - 所有系统表空间数据文件 - 所有回滚段/undo 表空间数据文件 - 被恢复表中要存储的所有数据文件 - 归档日志 – 参见注释 (a) 注释: (a) 如果被还原数据文件是热备份的一部分,或你想要将它们前滚,必须有所需的归档日志。 在理想的情况,部分还原的数据库将可用于在TEST机器上恢复。但这不总是可能的,且可能有必要还原到与“源”(PROD)数据库所在的同一机器上。后者是不建议的,因为在恢复过程中的用户错误可能会损坏生产数据库。 如果包括部分还原数据库的数据文件在表被drop时处于热备份模式,则有必要还原以前的备份。这样做的原因是,热备份必须前滚超过“end backup”标记(该表空间离开热备份模式时),数据库才能打开。 当试图打开数据库,无法将被还原的数据文件恢复到超过它们end backup marker将导致以下错误: ORA-1195 "online backup of file %s needs more recovery to be consistent"
  1. 在测试机上恢复: ------------------------------
在TEST机上进行恢复时执行以下步骤,假设是没有ORACLE_SID为“PROD”或“TEMP”的实例在测试机上已经运行。
  1. 在PROD数据库上,作为授权用户连接并创建控制文件的ASCII dump。例如:
SQL> connect / as sysdba SQL> alter database backup controlfile to trace resetlogs; 在user_dump_dest 目的地中会生成一个跟踪文件。将跟踪文件重命名为ccf.sql并保存。
  1. 在测试机上创建一个目录。被还原的数据库将位于该目录。在该示例中,目录名为/RESTORE。唯一的要求是,有足够的空间来容纳被还原的数据库和恢复所需的所有归档日志。如果文件系统空间非常宝贵,可以按恢复所需将归档日志选择性还原到/RESTOR并在其被应用后删除。
  2. 将备份还原到/RESTORE 目录。
  3. 可选地,将恢复所需的所有归档日志还原到 /RESTORE 目录。
  4. 将init.ora 文件(initPROD.ora) 从PROD 数据库复制到测试机上的 /RESTORE 目录。这假定所有数据库参数仅在init.ora 文件中指定。如果一个include 文件(ifile) 被引用,也将此文件复制到/RESTORE。
  5. 在测试机上将 initPROD.ora 重命名为initTEMP.ora 。
  6. 编辑 initTEMP.ora 并进行以下修改: a. control_files = /RESTORE/cntrlTEMP.dbf
  7. 如果可用,使任意ifile 引用指向被复制的include文件
  8. log_archive%参数应该更改,以反映被还原归档日志: log_archive_destination log_archive_format 例如: log_archive_destination=/RESTORE log_archive_format=arch_%s.dbf
  9. %dump_dest参数应该更改,指向适当的目录
  10. 如果启动了审计,将其关闭。
  11. 确保正确设置了shell环境。至少必须定义以下环境参数:
  12. ORACLE_HOME b. ORACLE_SID (should be set to TEMP)
  13. 作为授权用户连接。例如:
SQL> connect / as sysdba
  1. 启动实例,指定TEMP的 init.ora:
SQL> startup nomount pfile=/RESTORE/initTEMP.ora
  1. ccf.sql 文件(在第1步中创建)包含创建新的控制文件所需的语法。将该脚本复制到测试机并编辑它仅保存(并包括)'CREATE CONTROLFILE' 和其终止分号间的文本。更改以下部分:
  2. 日志文件。编辑此部分以反映为TEMP实例创建的联机日志的名称。如果PROD实例有大量大型large联机日志成员,建议指定较小日志成员的较少量。但你必须至少指定两个联机日志组。 b. 数据文件。编辑此部分以反映仅被还原数据文件的名称。 c. 其他项: - 删除REUSE 关键字 - 可选择将ARCHIVELOG 关键字更改为NOARCHIVELOG (所以TEMP 数据库不会在archivelog 模式下运行)
完成的ccf.sql 脚本的示例有: CREATE CONTROLFILE DATABASE "PROD" RESETLOGS NOARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 2 MAXDATAFILES 20 MAXINSTANCES 1 MAXLOGHISTORY 337 LOGFILE GROUP 1 '/RESTORE/log1PROD.dbf' SIZE 1M, GROUP 2 '/RESTORE/log2PROD.dbf' SIZE 1M DATAFILE '/RESTORE/sys1PROD.dbf', '/RESTORE/rbs1RBS.dbf', '/RESTORE/users1PROD.dbf' ; 然后执行ccf.sql 脚本来创建控制文件。
  1. 恢复数据库。数据库要被恢复到表被drop的时间之前。这里有两个选择:
  2. 基于时间的不完全恢复。数据库恢复在指定的日期和时间被停止。 b. 基于Cancel的不完全恢复。数据库恢复在一个归档日志boundary上停止,即基于cancel的恢复的粒度是归档日志。
基于时间的恢复的示例: SQL> recover database until time '2010-01-10:12:00:00' using backup controlfile 在以上示例中,按要求应用归档日志。恢复会在12:00 Januaru 10th, 2010自动停止。 基于cancel的恢复是示例: SQL> recover database until cancel using backup controlfile 一旦你应用了最后所需的归档日志,输入CANCEL 来停止恢复。
  1. 使用RESETLOGS选项打开数据库:
SQL> alter database open resetlogs;
  1. 导出表。
  2. 将表导入生产数据库。
  3. 一旦必要的表被导入,可以关闭TEMP实例且删除所有相关的文件。在删除TEMP实例之前,核实导入成功完成是有必要的。
  4. 在生产机上恢复: -------------------------------------
如果测试机不可用于执行恢复,可以使用生产机。在这样做时要格外谨慎。被还原的数据库将和以前一样在TEST实例下运行。在此过程中恢复的数据库名称被更改,以避免在获取mount锁时的问题。
  1. 在执行任何恢复前,对运行PROD实例的数据库进行完全备份。
  2. 在连接到PROD 实例时,创建控制文件的一个ASCII dump:
SQL> connect / as sysdba SQL> alter database backup controlfile to trace resetlogs;
  1. 创建一个上述的 /RESTORE目录(以上第2步)。
  2. 将备份(可选归档日志)还原到 /RESTORE 目录(以上第3步,第4步)。
  3. 创建initTEMP.ora 文件(以上第5, 6, 7 步)。除了已经进行的更改,更改db_name 参数,例如: db_name=TEMP
  4. 确保shell 环境被正确设置(第8 步): a. ORACLE_HOME b. ORACLE_SID (应被设为TEMP)
  5. 启动TEMP 实例(第9, 10 步)。确保正确的pfile用于启动实例。
  6. 修改 ccf.sql 文件(第11步)。确保DATAFILE 和LOGFILE 名称引用备份位置而不是PROD 实例数据库的文件。除了已进行的更改,更改第一行来设置新数据库名称,例如: from: CREATE CONTROLFILE DATABASE "PROD" RESETLOGS NOARCHIVELOG to: CREATE CONTROLFILE SET DATABASE "TEMP" RESETLOGS NOARCHIVELOG
  7. 恢复数据库(第12步)。
  8. 打开数据库(第13步)。
  9. 导出表。
  10. 导入表。
  11. 清理TEMP实例(第16步)。
参考 NOTE:223543.1 - How to Recover From a DROP / TRUNCATE / DELETE TABLE with RMAN