Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

999

积分

1

好友

942

主题
1#
发表于 2017-4-17 16:32:08 | 查看: 4308| 回复: 4
本帖最后由 ALLSTARS_ORACLE 于 2017-4-26 11:19 编辑

紧急求救,表被TRUNCATE TABLE,如何恢复?未备份!惨
紧急求救,Oracle中表被TRUNCATE TABLE,如何恢复
下载专业ORACLE数据库恢复工具PRM-DUL  For Oracle http://www.parnassusdata.com/

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

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

服务热线 : 13764045638  QQ: 47079569     邮箱:service@parnassusdata.com
2#
发表于 2017-4-26 11:20:35
本帖最后由 ALLSTARS_ORACLE 于 2017-4-26 11:22 编辑

可以参考这个视频 使用prm-dul 恢复数据

http://www.tudou.com/programs/view/DrktYsytWRk/

也可以联系我们诗檀软件恢复

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

服务热线 : 13764045638  QQ: 47079569   

回复 只看该作者 道具 举报

3#
发表于 2017-8-11 10:43:29
本帖最后由 biotwang 于 2017-8-11 10:46 编辑

PRM-DUL表恢复

1. 测试表数据
  1. SQL> select * from sh.trunc_test_table;
  2.      EMPNO EMPNAME
  3. ---------- ------------------------------
  4.          1 Kiran
  5.          2 Scott
  6.          3 Tiger
  7.          4 Jeff
  8.          5 Jane
  9.          6 John
  10. 6 rows selected.

  11. SQL> truncate table sh.trunc_test_table;
  12. Table truncated.

  13. SQL> select * from sh.trunc_test_table;
  14. no rows selected
复制代码
2. 使用PRM-DUL
  1. $ sh prm.sh
复制代码
(理论上应该关库或至少通知用户停止一切操作,以避免被truncate的数据受到可能的进一步的损坏)
Menu >> Tools >> Recovery Wizard >> Dictionary Mode >> Choose Files
(实际上仅加包含系统表空间文件和所涉及表的表空间文件即可,实验中,我们就都加上了)


Load




  1. [oracle@m1 parnassus_dbinfo_DB_20170803110941]$ cat sh.trunc_test_table.dat.truncated
  2. "1" "Kiran"
  3. "2" "Scott"
  4. "3" "Tiger"
  5. "4" "Jeff"
  6. "5" "Jane"
  7. "6" "John"
  8. [oracle@m1 parnassus_dbinfo_DB_20170803110941]$
复制代码

回复 只看该作者 道具 举报

4#
发表于 2017-8-11 10:48:20
梗概

目的
了解使用RMAN对DROP或TRUNCATE的表进行恢复的步骤

要点
1. 对数据库中的一部分数据集进行恢复:
a. 连接一个mount状态的数据库
b. 指定'SET UNTIL TIME'
c. 对所有数据文件SET NEWNAME
d. 使用RESTORE TABLESPACE恢复需要的表空间
e. SWITCH DATAFILE ALL
f. ALTER DATABASE DATAFILE ... ONLINE
g. RECOVER DATABASE SKIP FOREVER TABLESPACE .....
h. ALTER DATABASE RENAME FILE all online redo log files
2. 使用resetlogs打开辅助数据库
3. 导出表
4. 导入dump数据
5. 将辅助库删除

--------------------------------------------------------------------------------
目的

本文对表DROP/TRUNCATE/DELETE等误操作的RMAN数据恢复要点进行了阐释。

在Oracle 10g和更高版本,你可以使用recyclebin来对DROP的表进行恢复,当前前提是你没有显式地去禁用它。

如果回收站被禁用或数据库为9i版本,那么有以下几项恢复方式可用:
1. 使用RMAN duplicate建立包含部分数据的数据库作为表drop前的时间点数据库克隆。辅助库可以仅含有需要恢复的表空间。一旦RMAN建立了克隆并打开库,可以将辅助库的表导出并导回到生产库。这是恢复表(或数据)的推荐方法,因为它对其它数据库对象影响最小。
2. 将主库恢复到drop表前的时间点。这属于一种极端方法,因为表恢复的同时,也会将数据库整个回退到指定的时间点。
3. 将表空间恢复到drop之前的时间点,相对于第二种方式,这种方式则较好些,不过它是将整个表空间数据做了回退。这也是标准的表空间时间点恢复(TSPITR)操作,它需要一个辅助库帮助,来将表空间数据带回主库。

如果因为某些原因你无法使用RMAN duplicate,那么还有第四中方式:
4. 将备份库恢复到一个新位置(DUMMY库),然后将误删除的部分表数据导出,再导入到主库中。这仅是在RMAN duplicate命令不能使用时才采用此方式。在11.2版本后的新特性,RMAN duplicate可以被用在绝大多数场景。

注意:12c中RMAN已经有新特性'recover table'来直接对表单独进行恢复了。

对于1~3方式,可以在网络中找相关信息。这里主要是对第4中方式进行说明。

--------------------------------------------------------------------------------
使用RMAN恢复DROP/TRUNCATE表的大致步骤

为了恢复一张被drop或truncate的表,需要一个dummy库(主库拷贝)以用来做时间点恢复和数据抽取。一旦表抽取完成,抽取的数据就可以被导回主库。dummy库可以是主库的子集(即仅含有部分表空间),但是其必须有SYSTEM, UNDO(或ROLLBACK),SYSAUX和所需表对应的表空间。

最简单的推荐的方法当然是使用RMAN duplicate来建立一个dummy库:
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'项允许数据库仅复制部分表空间。在Oracle 8i, 你并不能这么做,因此仅能复制整个数据库,如果这不是你可接受的话,你就不能选用RMAN DUPLICATE这个方式来进行操作了。

注意:之后的信息,主要是针对那些不能使用RMAN DUPLICATE命令的用户。当然能用的情况还是推荐大家用此命令方法来进行数据库克隆。

RMAN对于主库的备份应可用于需要的位置的恢复。
在这里辅助实例(克隆)被建立。意思是initSID.ora被建立(从主库copy一份)并用于启动实例到nomount状态。

!!!!! IMPORTANT !!!!!!!!

如果主库正在运行使用,而你的操作又同时和主库在同一台服务器上,你一定不希望你的操作会覆盖到主库的已存在文件,这样会造成主库损坏并造成宕机。因此请一定小心仔细进行配置操作!!!!

确保辅助库(AUX)实例的所有路径都和主库不同。
确保CONTROL_FILES参数指定不同位置,且最好名字都不同。
对LOCK_NAME_SPACE/DB_UNIQUE_NAME设置和主库名不同的值。
修改/新建 SERVICE_NAME=AUX1
使用和生产库相同的DB_NAME
确保命令脚本最后包含'alter database rename file'命令来变更online redo log文件位置。
环境上将ORACLE_HOME和ORACLE_SID设置为辅助实例

回复 只看该作者 道具 举报

5#
发表于 2017-8-11 10:48:40

例如 :
  1. % set ORACLE_SID=AUX1
  2. % set ORACLE_HOME=<....>
复制代码
!!!!! IMPORTANT !!!!!!!!
注意:请将ORACLE_HOME和ORACLE_SID指向辅助实例,而使用RMAN时,辅助实例是作为操作的目标库进行连接的。

1: 恢复并mount控制文件:
恢复一份'set until'时间相近的控制文件:
  1. RMAN> run {
  2.      restore controlfile from autobackup
  3.      until time "TO_DATE('05/NOV/2007 15:40:00','DD/MON/YYYY HH24:MI:SS')";
  4.     }
复制代码
如果recovery catalog未使用,对于autobackup, RMAN总会按指定until time的对应日找最新的控制文件进行恢复。对此解释,请查阅: RMAN not Choosing the Correct Controlfile Autobackup to Restore and Failing with RMAN-06095 (Doc ID 1326114.1).
RMAN需要的是指定时间点前最近的自动备份。可能指定时间点当日的最新自动备份并不是正确的选择。因此在no catalog情况下,使用以下命令:
  1. RMAN> run {
  2.      restore controlfile   
  3.      until time "TO_DATE('05/NOV/2007 15:40:00','DD/MON/YYYY HH24:MI:SS')";
  4.     }
复制代码
mount数据库:
RMAN> alter database mount clone database;

注意:需要提一下,MOUNT CLONE DATABASE强制所有数据库文件被置于OFFLINE状态。
这实际上等同于:
  1. SQL> startup mount
  2. SQL> alter database datafile <file#> offline;   <--- 对每个数据文件
复制代码
2. 恢复一个数据库子库
a. 连接到mount的目标库上:
如果使用的catalog来进行controlfile恢复,那么你现在必须exit RMAN,再次连接且仅连接目标库。否则,catalog中之前主库的备份信息可能会受到影响。一旦备份控制文件被恢复和mount,其上的信息就可以被使用了。如果控制文件不够旧的话,那么请小心开库(请看步骤3):

b. 指定'SET UNTIL TIME':
指定时间点,正好在DROP/TRUNACTE表前的时点

c. 对所有数据文件 SET NEWNAME:
为数据文件指定新路径以进行恢复。请记住这是在辅助实例上的恢复,不应该对生产库进行覆盖或影响。

注意:由于不使用DUPLICATE命令,因此db_file_name_convert和log_file_name_convert参数就被无视了。
因此数据文件和位置必须使用‘set newname’命令进行设置。

d. 恢复必要表空间 RESTORE TABLESPACE:
恢复所需的那些表空间,其中包括有SYSTEM, SYSAUX, UNDO/Rollback表空间以及被drop或truncate的表所在的表空间。

SYSTEM表空在恢复中是必须的,因为它包含了几乎所有SYS和SYSTEM所拥有的的对象。其它一些表空间如果也存有SYS和SYSTENM用户所有的对象的话,可能也需要进行恢复。
  1. SQL> select distinct tablespace_name
  2.      from dba_segments where owner in ('SYS', 'SYSTEM');
复制代码
注意: 在RAC环境中,必须包括所有undo表空间。那些未被任何进程使用过的undo表空间则可以不必恢复。

e. SWITCH DATAFILE ALL:
使用恢复的新的路径/文件名来更新控制文件(通过SET NEWNAME)。

f. ALTER DATABASE DATAFILE ... ONLINE
使得那些恢复了的数据文件online,之后复原。

g. RECOVER DATABASE SKIP FOREVER TABLESPACE ......;
你需要指定哪些表空间不需要进行recover。否则会由于未找到这些(没被restore)的文件而复原失败。SKIP FOREVER语法会使得RMAN通过DROP项将数据文件处于offline状态。只有这些被指定的SKIP FOREVER表空间在数据库打开后可以被drop掉。因此,请不要在此语法中包含有你需要复原数据的表空间。

h. ALTER DATABASE RENAME FILE 改变所有Online Redo log文件的指定。
此命令被用来改变在线日志文件位置。当'resetlogs'被使用,Oracle会基于控制文件中的定义来建立在线重做日志。此命令可以变更路径及文件名。如果是在同一台服务器上操作,不用此命令的话会造成Oracle将生产库的在线重做日志覆盖重置。这会对生产库造成损害并导致宕机。
警告:如果redo log文件是以OMF结构存放的,当在克隆实例上执行redo log文件rename,它会尝试删除原库的在线重做日志,因此当你正在使用OMF时,你不应该在同台机器上尝试此方法。

一种好的替代方法是重建控制文件并指定redo log文件名。生成控制文件的脚本,执行如下:
SQL> alter database backup controlfile to trace as '/tmp/control.sql' resetlogs;
编辑生成的脚本并修改为新的log file名(非OMF结构)。这样就能避免原数据库在线重做日志文件被删除了。

例如:
  1. RMAN> connect target /

  2. run
  3. {
  4. allocate channel t1 type sbt_tape
  5. parms='SBT_LIBRARY=/home/usupport/liblsm.so';

  6. set until time "to_date( '08-10-2007 06:00', 'DD-MM-RRRR HH24:MI')";

  7. set newname for datafile 1 to '/fs01/oradata/tspitr/system01.dbf';
  8. set newname for datafile 2 to '/fs01/oradata/tspitr/undotbs01.dbf';
  9. set newname for datafile 4 to '/fs01/oradata/tspitr/tools01.dbf';

  10. restore tablespace system, undotbs1, tools;

  11. switch datafile all;

  12. sql "alter database datafile 1,2,4 online";

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

  18. sql "alter database rename file ''/fs01/oradata/primary/REDO01.LOG'' to ''/fs01/oradata/tspitr/REDO01.LOG''";

  19. sql "alter database rename file ''/fs01/oradata/primary/REDO02.LOG'' to ''/fs01/oradata/tspitr/REDO02.LOG''";

  20. sql "alter database rename file ''/fs01/oradata/primary/REDO03.LOG'' to ''/fs01/oradata/tspitr/REDO03.LOG''";

  21. /* 注意:这里语法中使用两个单引号,这是特定于系统的。 */

  22. release channel t1;
  23. }
复制代码
注意:在例子中,磁带库channel被分配,这主要基于备份的位置(你也可以使用磁盘channel)
NOTE: In this example, a Tape channel allocated. The need for this (or use of disk channel) depends on the location of the backups.

3: 使用RESETLOGS打开辅助库
RMAN> alter database open resetlogs;
注意:建议数据库恢复时不要使用catalog连接。不过,如果你当前需要从一个更旧的备份来进行恢复,那么请使用sqlplus,而不是RMAN来进行操作。否则,下一次目标库连接会收到以下报错:
RMAN-20011 "target database incarnation is not current in recovery catalog"

4: 表导出
数据库被复原打开后,就能用来导出所需数据了。例如:
  1. $ exp userid=system/<password> file=table.dmp
  2.   tables=(<owner>.<tablename>, ...) rows=Y
复制代码
5: 导入dump数据文件
将drop掉的表数据重新导入回生产库。例如:
  1. $ imp userid=system/<password> file=table.dmp ignore=Y
复制代码
6: 移除AUX/DUMMY库
在表恢复工作完成后,关闭并移除掉所有和辅助库相关的文件。因为表的导出工作已经完成了。这个库已经不需要了。

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-5-17 20:07 , Processed in 0.048577 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569