Oracle 如何使用RMAN从DROP / TRUNCATE / DELETE TABLE误删除表行数据的恢复

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

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

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

 

 

适用于:

Oracle Database – Enterprise Edition – 版本 8.1.5.0到 12.1.0.2 [Release 8.1.5 到 12.1]
本文信息适用于任何平台。
***于24-Aug-2015检查相关性***
目的

本文叙述了如何使用RMAN从DROP/TRUNCATE/DELETE或需要恢复的其他类型的数据操作失误恢复。

在Oracle10g 及以上版本,如果回收站未被显式禁用,你可以用它来恢复 DROP 表。参见:

Note 265254.1 Flashback Table feature in Oracle Database 10g

如果回收站被禁用或数据库在运行Oracle9i,还有一些可选的操作:

  1. 使用RMAN duplicate创建一个数据库的子集,作为drop之前时间点的克隆。辅助数据库可以是一个表空间的子集,所以只有必要的表空间被还原并恢复。一旦RMAN创建了克隆并打开了数据库,可以从辅助数据库导出表并再导入生产。这是恢复表(或数据)建议的方法,因为这对数据库中其他对象的影响很小。

    2. 还原并恢复主数据库到drop之前的时间点。这种方法对于一个表来说较极端,因为整个数据库的数据都回到该时点。

    3. 还原并恢复表空间到drop之前的时间点。这是较好的选择,但同样会将要整个表空间的数据恢复到过去。这是标准的表空间时间点恢复(TSPITR),将需要一个辅助数据库,但会使表空间的所有数据在目标数据库中回到该时间点。 参见 Note 109979.1了解详情。

如果出于某种原因,你无法使用RMAN duplicate,还有第四个选项:

4. Restore and recover a subset of the database as a DUMMY database to export the table data and import it into the primary database.  This option should ONLY be used if the RMAN duplicate command cannot.  With 11.2’s new feature of targetless duplicate, the RMAN duplicate command can be used in most cases. 还原并恢复数据库的一个子集作为虚拟DUMMY数据库导出表数据,并将其导入主数据库。仅当RMAN复制命令不能使用时才应使用本选项。11.2版本引入无目标复制的新特性,使得RMAN复制命令可以在大多数情况下使用。

注意,在12C 中RMAN具有“recover table”的选项。请参阅:

RMAN RECOVER TABLE Feature New to Oracle Database 12cNote 1521524.1
对于选项1 -3,查看这些选项的相应信息。本文讨论第四个选项,即仅在前三个选项不可用时使用。

问答

使用RMAN从DROP或TRUNCATE表恢复的过程概览。

要从被drop或truncate的表中恢复过来,需要将一个虚拟数据库(主数据库副本)还原并恢复到时间点,以便表导出。一旦完成表导出,就能将表导入到主数据库。虚拟数据库可以是主数据库的一个子集,但必须包括SYSTEM,UNDO(或ROLLBACK),SYSAUX和被drop/truncate表所在的(多个)表空间。

创建该“dummy”数据库最简单和建议的方法是使用RMAN duplicate命令。 参见:

Note 1375864.1 Perform Backup Based RMAN DUPLICATE Without Connecting To Target Database For Both Disk & Tape Backups

Note 452868.1 RMAN ‘Duplicate From Active Database’ Feature in 11G
Note 259694.1 Oracle10G RMAN Database Duplication
Note 228257.1 RMAN Duplicate Database in Oracle9i
Note 73912.1 RMAN Creating a Duplicate Database — Oracle8i

“skip tablespace”选项允许对数据库的子集进行复制。在Oracle8i中使用duplicate时,你不能 “skip”表空间,所以你必须复制整个数据库。如果你认为这个选项不理想,或者你必须还原原始数据库,因此无法使用RMAN副本。

注:本信息其余是谁也无法使用RMAN复制命令的用户。再次,建议使用RMAN重复克隆数据库。

注: 该信息的其余部分针对无法使用RMAN DUPLICATE命令的用户。再次声明,建议使用 RMAN duplicate来克隆数据库。

要求

  • 对于主数据库的RMAN 备份要被还原的主机,该备份必须可用。
  • 复制实例(克隆)被创建。这表示一个initSID.ora被创建并用于在NOMOUNT下启动实例。这可以从主数据库复制,同时考虑到以下因素:

!!!!! 重要 !!!!!!!!

如果与主数据库相同的主机被使用,千万小心,你不希望该过程覆盖主(生产数据库)使用的现有文件。这么做会损坏并使生产数据库崩溃!!!!!!

  • 确保此辅助实例的所有路径与primary不同。
  • 确保CONTROL_FILES参数的位置不同,更重要的是有不同的名称。
  • 添加LOCK_NAME_SPACE/DB_UNIQUE_NAME 为除主数据库名称以外的任意值。
  • 更改/添加 SERVICE_NAME=AUX1。
  • 为生产数据库使用相同的DB_NAME
  • 一定要在脚本末尾包括 ‘alter database rename file’ 命令来更改联机重做日志文件的位置和/或名称。
  • 将ORACLE_HOME和ORACLE_SID 设为辅助实例

示例:
% set ORACLE_SID=AUX1
% set ORACLE_HOME=<….>
!!!!! 重要 !!!!!!!!

注: ORACLE_HOME 和ORACLE_SID 设为辅助实例

注: 此时辅助实例是rman的目标。

1: 还原并mount控制文件:

使用正确的’set until’还原控制文件:

RMAN> run {
restore controlfile from autobackup
until time “TO_DATE(’05/NOV/2007 15:40:00′,’DD/MON/YYYY HH24:MI:SS’)”;
}

如果未使用恢复目录,则RMAN将始终从指定的until time日期还原最新的控制文件自动备份。这在下面的注释中说明:

没有选择正确的控制文件自动备份的RMAN还原失败并显示RMAN-06095 (Doc ID1326114.1)失败。

RMAN将需要一个就在指定时间前生成的自动备份。不一定是要在那天最后生成的自动备份。所以如果没有被使用的目录,使用命令:

RMAN> run {
restore controlfile
until time “TO_DATE(’05/NOV/2007 15:40:00′,’DD/MON/YYYY HH24:MI:SS’)”;
}

现在 mount:

RMAN> alter database mount clone database;

 

注:  MOUNT CLONE DATABASE 强制所有数据文件OFFLINE。这是一个预防措施。
MOUNT CLONE在 ‘Standard Edition’ 中不可用且会报告ORA-439 “Function not enabled: Point-in-time tablespace recovery”.  ‘Standard Edition’ 等同于:
SQL> startup mount
alter database datafile <file#> offline;   <— for each datafile
参见 Note 372996.1 和/或 Note 403883.1 了解还原控制文件的详情。

  1. 还原并恢复数据库的一个子集:
  2. 连接到一个mounted 目标:

如果一个目录用于恢复控制文件,此时你必须退出RMAN,仅连接到目标。否则,在目录中的原始目标信息可能会受到影响。一旦备份控制文件被恢复并mount,这就是可使用的信息。如果控制文件信息是不够旧,在打开数据库(见第3步)时要小心。

  1. 指定一个’SET UNTIL TIME’:

用户定义的时间,只要在DROP/TRUNACTE表之前

  1. 对所有数据文件SET NEWNAME :

这指定要恢复数据文件的新路径。请记住,这要在辅助实例上完成,不应该干扰/覆盖生产数据库。

注:由于未使用DUPLICATE命令,DB_FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT参数被忽略。因此,必须使用’set newname ‘命令创建数据文件的名称和位置。

  1. 必要表空间的还原,,RESTORE TABLESPACE:

还原需要被恢复的表空间。这始终包括SYSTEM,SYSAUX,UNDO /ROLLBACK表空间,以及被drop/truncate表所在的(多个)表空间。

 

始终包括SYSTEM表空间,因为它包含了由SYS和SYSTEM拥有的大多数/全部对象。如果其他一些表空间包含由SYS和SYSTEM拥有的对象,最好也被包括在内。
SQL> select distinct tablespace_name
from dba_segments where owner in (‘SYS’, ‘SYSTEM’);

注:  在RAC环境中,必须包括所有undo表空间。即任何线程使用的undo表空间都不能被跳过。

  1. SWITCH DATAFILE ALL:

使用被还原的数据文件的路径/名称(通过SET NEWNAME设置)更新控制文件。

  1. ALTER DATABASE DATAFILE … ONLINE:

联机所有被还原并需要恢复的数据文件。

  1. RECOVER DATABASE SKIP FOREVER TABLESPACE ……;

你需要指定不会被恢复的表空间的完整列表。否则,恢复将无法找到未被还原的文件。SKIP FOREVER子句导致RMAN使用DROP选项使数据文件脱机。仅当打开数据库后指定表空间将被drop时使用skip forever。即,不要包括含有要恢复数据的表空间。

  1. ALTER DATABASE RENAME FILE all Online REDO log files:

在更改联机日志文件的位置需要这个步骤。当“resetlogs”被发出后,Oracle将基于控制文件中的规范创建联机日志。该命令会更改位置和/或名称。如果这在同一台服务器上执行,不发出rename将导致Oracle重置生产联机日志文件。这会损坏并使生产数据库崩溃!!!!!!

警告:如果重做日志文件是OMF,当我们对克隆实例上的重做日志文件执行rename file时,它会试图删除源数据库的联机重做日志,所以如果你在使用OMF,不能在同一台机器上尝试此方法。

替代它的好方法是重建控制文件,并指定重做日志文件的名称。要生成一个CREATE CONTROLFILE脚本,执行:

SQL> alter database backup controlfile to trace as ‘/tmp/control.sql’ resetlogs;

并使用新的日志文件名(非OMF)编辑脚本。这将避免源数据库的联机重做日志文件被删除。
例如:
————

RMAN> connect target /

run
{
allocate channel t1 type sbt_tape
parms=’SBT_LIBRARY=/home/usupport/liblsm.so’;

set until time “to_date( ’08-10-2007 06:00′, ‘DD-MM-RRRR HH24:MI’)”;

set newname for datafile 1 to ‘/fs01/oradata/tspitr/system01.dbf’;
set newname for datafile 2 to ‘/fs01/oradata/tspitr/undotbs01.dbf’;
set newname for datafile 4 to ‘/fs01/oradata/tspitr/tools01.dbf’;

restore tablespace system, undotbs1, tools;

switch datafile all;

sql “alter database datafile 1,2,4 online”;

recover database skip forever tablespace TEMP,INDX,USERS,OLTS_ATTRSTORE,
OLTS_CT_DN,OLTS_CT_CN, OLTS_CT_OBJCL,OLTS_CT_STORE,OLTS_DEFAULT,
OLTS_TEMP,OLTS_IND_ATTRSTORE,
OLTS_IND_CT_DN,OLTS_IND_CT_CN,OLTS_IND_CT_OBJCL,OLTS_IND_CT_STORE,
P1TS_ATTRSTORE,P1TS_IND_STORE;

sql “alter database rename file ”/fs01/oradata/primary/REDO01.LOG” to ”/fs01/oradata/tspitr/REDO01.LOG””;

sql “alter database rename file ”/fs01/oradata/primary/REDO02.LOG” to ”/fs01/oradata/tspitr/REDO02.LOG””;

sql “alter database rename file ”/fs01/oradata/primary/REDO03.LOG” to ”/fs01/oradata/tspitr/REDO03.LOG””;

/*NOTE: Syntax within rman is two single quotes around each name, this may be operating system specific. */

release channel t1;
}

 

注:在这个例子中,一个磁带通道channel被分配。是否需要它(或使用磁盘通道)取决于备份的位置。

3: 使用 RESETLOGS打开辅助数据库

RMAN> alter database open resetlogs;

注:由于建议在数据库还原期间不应创建目录连接。但如果此时有必要获取较旧的备份信息,在Sqlplus而不是RMAN中打开数据库。否则,下一个目标连接将收到错误,如:

RMAN-20011 “target database incarnation is not current in recovery catalog”

4: 导出表

数据库被恢复并打开,所以它能被用于导出。

例如:

$ exp userid=system/<password> file=table.dmp
tables=(<owner>.<tablename>, …) rows=Y

5: 导入export dump

将被drop表的数据再导入回主/生产数据库中。

例如:

$ imp userid=system/<password> file=table.dmp ignore=Y

6: 删除该辅助/虚拟 AUX/DUMMY数据库

关闭并删除与该数据库相关的所有文件。这满足你的目的。即提供该表的导出。

参考

NOTE:259694.1 – Oracle10G RMAN Database Duplication
NOTE:1521524.1 – RMAN RECOVER TABLE Feature New to Oracle Database 12c
NOTE:452868.1 – RMAN ‘Duplicate From Active Database’ Feature in Oracle11g
NOTE:1375864.1 – Perform Backup Based RMAN DUPLICATE Without Connecting To Target Database For Both Disk & Tape Backups
NOTE:265253.1 – 10g Recyclebin Features and How to Disable it
NOTE:265254.1 – Flashback Table Feature in Oracle Database 10g
NOTE:372996.1 – Using RMAN to Restore and Recover a Database When the Repository and Spfile/Init.ora Files Are Also Lost
NOTE:403883.1 – How To Restore Controlfile From A Backupset Without A Catalog Or Autobackup
NOTE:62385.1 – Oracle7 Recovery Scenarios and Equivalent RMAN Techniques
NOTE:73912.1 – RMAN: Creating a Duplicate Database
NOTE:109979.1 – RMAN: Tablespace Point In Time Recovery (TSPITR) Procedure.
NOTE:228257.1 – RMAN ‘Duplicate Database’ Feature in Oracle9i / 10G and 11G


Posted

in

by

Tags:

Comments

Leave a Reply

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