如果自己搞不定可以找诗檀软件专业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”
- 在测试机上恢复:
——————————
在TEST机上进行恢复时执行以下步骤,假设是没有ORACLE_SID为“PROD”或“TEMP”的实例在测试机上已经运行。
- 在PROD数据库上,作为授权用户连接并创建控制文件的ASCII dump。例如:
SQL> connect / as sysdba
SQL> alter database backup controlfile to trace resetlogs;
在user_dump_dest 目的地中会生成一个跟踪文件。将跟踪文件重命名为ccf.sql并保存。
- 在测试机上创建一个目录。被还原的数据库将位于该目录。在该示例中,目录名为/RESTORE。唯一的要求是,有足够的空间来容纳被还原的数据库和恢复所需的所有归档日志。如果文件系统空间非常宝贵,可以按恢复所需将归档日志选择性还原到/RESTOR并在其被应用后删除。
- 将备份还原到/RESTORE 目录。
- 可选地,将恢复所需的所有归档日志还原到 /RESTORE 目录。
- 将init.ora 文件(initPROD.ora) 从PROD 数据库复制到测试机上的 /RESTORE 目录。这假定所有数据库参数仅在init.ora 文件中指定。如果一个include 文件(ifile) 被引用,也将此文件复制到/RESTORE。
- 在测试机上将 initPROD.ora 重命名为initTEMP.ora 。
- 编辑 initTEMP.ora 并进行以下修改:
a. control_files = /RESTORE/cntrlTEMP.dbf - 如果可用,使任意ifile 引用指向被复制的include文件
- log_archive%参数应该更改,以反映被还原归档日志:
log_archive_destination
log_archive_format
例如:
log_archive_destination=/RESTORE
log_archive_format=arch_%s.dbf - %dump_dest参数应该更改,指向适当的目录
- 如果启动了审计,将其关闭。
- 确保正确设置了shell环境。至少必须定义以下环境参数:
- ORACLE_HOME
b. ORACLE_SID (should be set to TEMP) - 作为授权用户连接。例如:
SQL> connect / as sysdba
- 启动实例,指定TEMP的 init.ora:
SQL> startup nomount pfile=/RESTORE/initTEMP.ora
- ccf.sql 文件(在第1步中创建)包含创建新的控制文件所需的语法。将该脚本复制到测试机并编辑它仅保存(并包括)’CREATE CONTROLFILE’ 和其终止分号间的文本。更改以下部分:
- 日志文件。编辑此部分以反映为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 脚本来创建控制文件。
- 恢复数据库。数据库要被恢复到表被drop的时间之前。这里有两个选择:
- 基于时间的不完全恢复。数据库恢复在指定的日期和时间被停止。
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 来停止恢复。
- 使用RESETLOGS选项打开数据库:
SQL> alter database open resetlogs;
- 导出表。
- 将表导入生产数据库。
- 一旦必要的表被导入,可以关闭TEMP实例且删除所有相关的文件。在删除TEMP实例之前,核实导入成功完成是有必要的。
- 在生产机上恢复:
————————————-
如果测试机不可用于执行恢复,可以使用生产机。在这样做时要格外谨慎。被还原的数据库将和以前一样在TEST实例下运行。在此过程中恢复的数据库名称被更改,以避免在获取mount锁时的问题。
- 在执行任何恢复前,对运行PROD实例的数据库进行完全备份。
- 在连接到PROD 实例时,创建控制文件的一个ASCII dump:
SQL> connect / as sysdba
SQL> alter database backup controlfile to trace resetlogs;
- 创建一个上述的 /RESTORE目录(以上第2步)。
- 将备份(可选归档日志)还原到 /RESTORE 目录(以上第3步,第4步)。
- 创建initTEMP.ora 文件(以上第5, 6, 7 步)。除了已经进行的更改,更改db_name 参数,例如:
db_name=TEMP - 确保shell 环境被正确设置(第8 步):
a. ORACLE_HOME
b. ORACLE_SID (应被设为TEMP) - 启动TEMP 实例(第9, 10 步)。确保正确的pfile用于启动实例。
- 修改 ccf.sql 文件(第11步)。确保DATAFILE 和LOGFILE 名称引用备份位置而不是PROD 实例数据库的文件。除了已进行的更改,更改第一行来设置新数据库名称,例如:
from: CREATE CONTROLFILE DATABASE “PROD” RESETLOGS NOARCHIVELOG
to: CREATE CONTROLFILE SET DATABASE “TEMP” RESETLOGS NOARCHIVELOG - 恢复数据库(第12步)。
- 打开数据库(第13步)。
- 导出表。
- 导入表。
- 清理TEMP实例(第16步)。
参考
NOTE:223543.1 – How to Recover From a DROP / TRUNCATE / DELETE TABLE with RMAN
Leave a Reply