Oracle 从用户管理的(非RMAN)完全数据库备份中恢复被drop删除的表

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

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

服务热线 : 13764045638 QQ号:47079569 邮箱:[email protected]

 

 

适用于:

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


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *