diskgenius
硬盘基地 门户 数据库 Oracle 查看内容

oracle数据库数据恢复:表数据恢复

2015-1-7 17:28| 发布者: 八喜| 查看: 2433| 评论: 4|原作者: 蝴蝶

摘要: oracle数据库操作不小心把数据表内的数据删除了,这可是一件非常不幸的消息,于是会---》杯具了,残酷的事实摆在面前,如何恢复数据变得十分严峻,下面是模拟oracle数据库删除表内数据进行恢复。 1、建表 -- Creat ...
oracle数据库操作不小心把数据表内的数据删除了,这可是一件非常不幸的消息,于是会  ---》杯具了,残酷的事实摆在面前,如何恢复数据变得十分严峻,下面是模拟oracle数据库删除表内数据进行恢复。
1、建表
  1. -- Create table
  2. create table DARCY
  3. (
  4. ID   NUMBER,
  5. INFO NVARCHAR2(32)
  6. )
  7. tablespace DATA_SGPM
  8. pctfree 10
  9. initrans 1
  10. maxtrans 255
  11. storage
  12. (
  13.     initial 64K
  14.     minextents 1
  15.     maxextents unlimited
  16. );
复制代码


2、插入数据

  1. insert into "SGPM"."DARCY"("ID","INFO") values ('1','aaa');

  2. insert into "SGPM"."DARCY"("ID","INFO") values ('2','bbb');

  3. insert into "SGPM"."DARCY"("ID","INFO") values ('3','ccc');
复制代码


3、删除数据

  1. SQL> select * from darcy;

  2.         ID INFO
  3. ---------- --------------------------------------------------------------------------------
  4.          1 aaa
  5.          2 bbb
  6.          3 ccc

  7. SQL> delete from darcy where id = 1;

  8. 1 row deleted

  9. SQL> commit;

  10. Commit complete

  11. SQL> select * from darcy;

  12.         ID INFO
  13. ---------- --------------------------------------------------------------------------------
  14.          2 bbb
  15.          3 ccc
复制代码


4、恢复数据

方法1:

查询最新的系统变更number

  1. SQL> select dbms_flashback.get_system_change_number from dual;

  2. GET_SYSTEM_CHANGE_NUMBER
  3. ------------------------
  4.                 18144344
复制代码


查看此次变更后的表记录

  1. SQL> select * from darcy as of scn 18144344;
复制代码


        ID INFO
---------- --------------------------------------------------------------------------------
         2 bbb
         3 ccc

说明这是删除数据后的表记录,我们只要找到某个scn,即删除表记录前的scn,

恢复到这个scn时的记录。

  1. SQL> SELECT * FROM DARCY as of scn 18144252;
复制代码


        ID INFO
---------- --------------------------------------------------------------------------------
         1 aaa
         2 bbb
         3 ccc

然后直接执行insert语句

方法2:

  1. SQL> select * from flashback_transaction_query where table_name='DARCY';
复制代码


XID               START_SCN START_TIMESTAMP COMMIT_SCN COMMIT_TIMESTAMP LOGON_USER                     UNDO_CHANGE# OPERATION                        TABLE_NAME                                                                       TABLE_OWNER                      ROW_ID              UNDO_SQL
---------------- ---------- --------------- ---------- ---------------- ------------------------------ ------------ -------------------------------- -------------------------------------------------------------------------------- -------------------------------- ------------------- --------------------------------------------------------------------------------
07001500AB280000   18144149 2010-9-9 10:14:   18144281 2010-9-9 10:17:1 SGPM                                      1 DELETE                           DARCY                                                                            SGPM                             AAAYQwAAcAAAKk2AAA insert into "SGPM"."DARCY"("ID","INFO") values ('1','aaa');
080018005F370000   18144244 2010-9-9 10:16:   18144252 2010-9-9 10:16:3 SGPM                                      1 INSERT                           DARCY                                                                            SGPM                             AAAYQwAAcAAAKk2AAC delete from "SGPM"."DARCY" where ROWID = 'AAAYQwAAcAAAKk2AAC';
080018005F370000   18144244 2010-9-9 10:16:   18144252 2010-9-9 10:16:3 SGPM                                      2 INSERT                           DARCY                                                                            SGPM                             AAAYQwAAcAAAKk2AAB delete from "SGPM"."DARCY" where ROWID = 'AAAYQwAAcAAAKk2AAB';
080018005F370000   18144244 2010-9-9 10:16:   18144252 2010-9-9 10:16:3 SGPM                                      3 INSERT                           DARCY                                                                            SGPM                             AAAYQwAAcAAAKk2AAA delete from "SGPM"."DARCY" where ROWID = 'AAAYQwAAcAAAKk2AAA';

执行UNDO_SQL,即:insert into "SGPM"."DARCY"("ID","INFO") values ('1','aaa');即可恢复数据。

001.png
或者直接运行:

  1. SQL> flashback table DARCY to timestamp to_timestamp('2010-9-9 10:16:3','yyyy-mm-dd hh24:mi:ss');
复制代码


flashback table DARCY to timestamp to_timestamp('2010-9-9 10:16:3','yyyy-mm-dd hh24:mi:ss')

ORA-08189: 因为未启用行移动功能, 不能闪回表

  1. SQL> alter table DARCY enable row movement;
复制代码


Table altered

  1. SQL> flashback table DARCY to timestamp to_timestamp(2010-9-9 10:17:1,'yyyy-mm-dd hh24:mi:ss');

  2. Done

  3. SQL> SELECT * FROM DARCY;
复制代码


        ID INFO
---------- --------------------------------------------------------------------------------
         1 aaa
         2 bbb
         3 ccc

5、drop表后的恢复

  1. SQL> drop table darcy;

  2. Table dropped

  3. SQL> select * from darcy;
复制代码

  1. select * from darcy
复制代码


ORA-00942: 表或视图不存在

  1. SQL> select * from recyclebin;[/color]

  2. OBJECT_NAME                    ORIGINAL_NAME                    OPERATION TYPE                      TS_NAME                        CREATETIME          DROPTIME               DROPSCN PARTITION_NAME                   CAN_UNDROP CAN_PURGE    RELATED BASE_OBJECT PURGE_OBJECT      SPACE
  3. ------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ----------
  4. BIN$CrbfFp0nRTWzETrAMvbD+A==$0 DARCY                            DROP      TABLE                     DATA_SGPM

  5. [code]SQL> SELECT * FROM USER_RECYCLEBIN;
复制代码


OBJECT_NAME                    ORIGINAL_NAME                    OPERATION TYPE                      TS_NAME                        CREATETIME          DROPTIME               DROPSCN PARTITION_NAME                   CAN_UNDROP CAN_PURGE    RELATED BASE_OBJECT PURGE_OBJECT      SPACE
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ----------
BIN$CrbfFp0nRTWzETrAMvbD+A==$0 DARCY                            DROP      TABLE                     DATA_SGPM                      2010-09-09:10:15:50 2010-09-09:11:12:04   18154031                                  YES        YES            99376       99376        99376          8

  1. SQL> flashback table darcy to before drop;

  2. Done

  3. SQL> select * from darcy;
复制代码


        ID INFO
---------- --------------------------------------------------------------------------------
         1 aaa
         2 bbb
         3 ccc      

INTOHARD.COM

开心

鄙视

鼓掌

愤怒

可怜
发表评论

最新评论

引用 suptidatta 2015-1-8 13:28
going overhead
引用 xiaolongYP 2015-1-20 11:31
好复杂 不过学习了 感谢楼主

查看全部评论(4)

返回顶部