[推荐] oracle数据库数据恢复:表数据恢复

[复制链接]
  • TA的每日心情
    开心
    2015-4-15 14:15
  • 签到天数: 1 天

    [LV.1]布衣百姓

    22

    主题

    7

    回帖

    668

    积分

    [INTOHARD]连长

    Rank: 4

    积分
    668
    发表于 2015-1-7 17:20:55 | 显示全部楼层 |阅读模式
    本帖最后由 蝴蝶 于 2015-1-7 17:27 编辑

    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

    该用户从未签到

    2

    主题

    1132

    回帖

    1003

    积分

    [INTOHARD]工兵

    Rank: 1

    积分
    1003
    发表于 2015-1-8 13:28:51 | 显示全部楼层
    going overhead
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2020-2-5 10:03
  • 签到天数: 71 天

    [LV.6]五品郎中

    4

    主题

    186

    回帖

    416

    积分

    [INTOHARD]排长

    Rank: 3Rank: 3

    积分
    416
    发表于 2015-1-20 11:31:31 | 显示全部楼层
    好复杂 不过学习了 感谢楼主
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    快速回复 返回顶部 返回列表