sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

flashback之flashback table
SQL> flashback table "BIN$AhT4Yh0NEoTgU8g4qMAP/A==$0" to before drop; 恢复删除的指定的 数据表和数据

《三思笔记》--读书笔记

1,从recycle bin中恢复

(1)简单删除表恢复

  1. SQL> drop table book_list;
  2. Table dropped.

其实没有删除,查看recycle bin

  1. SQL> select object_name,original_name from recyclebin;
  2. OBJECT_NAME ORIGINAL_NAME
  3. ------------------------------ --------------------------------
  4. BIN$AhOOEum+C8/gU8g4qMAxQQ==$0 FLASH_TBL
  5. BIN$AhT4Yh0LEoTgU8g4qMAP/A==$0 SYS_C0011460
  6. BIN$AhT4Yh0MEoTgU8g4qMAP/A==$0 BOOK_LIST

可以看到,original_name 中有book_list表

下面恢复这个表

  1. SQL> flashback table BOOK_LIST to before drop;
  2. Flashback complete.
  3. SQL> select * from BOOK_LIST;
  4. BOOKID BOOKNAME CREATE_DATE
  5. ---------- -------------------- ------------
  6. 1 sansi's note 31-AUG-14
  7. 2 about sansi 31-AUG-14

显然恢复成功,再查看recyclebin

  1. SQL> select object_name,original_name from recyclebin;
  2. OBJECT_NAME ORIGINAL_NAME
  3. ------------------------------ --------------------------------
  4. BIN$AhOOEum+C8/gU8g4qMAxQQ==$0 FLASH_TBL

虽然此时表已经回来了,但是查看索引的时候,会发现,索引的名字还保留的是在recycle bin中的名字

  1. SQL> select index_name from user_indexes where table_name = 'BOOK_LIST';
  2. INDEX_NAME
  3. ------------------------------
  4. BIN$AhT4Yh0LEoTgU8g4qMAP/A==$0

因此,我们还需要手动执行alter index rename,,将索引名称按照指定的数据库对象命名规范进行修改

  1. SQL> alter index "BIN$AhT4Yh0LEoTgU8g4qMAP/A==$0" rename to SYS_C0011460;
  2. Index altered.
  3. SQL> select index_name from user_indexes where table_name = 'BOOK_LIST';
  4. INDEX_NAME
  5. ------------------------------
  6. SYS_C0011460

(2)稍稍复杂一点的表恢复

如果要恢复的表与当前schema中已经存在同名的表,直接恢复会触发ora-38312错误,如下

  1. SQL> flashback table FLASH_TBL to before drop;
  2. flashback table FLASH_TBL to before drop
  3. *
  4. ERROR at line 1:
  5. ORA-38312: original name is used by an existing object
此时就需要rename to 了,如下

  1. SQL> flashback table FLASH_TBL to before drop rename to FLASH_TBL01;
  2. Flashback complete.

(3)从多次删除中恢复

如先删除表flash_tbl,在没有flashback drop的时候又建了一个表flash_tbl,之后又将这个flash_tbl删除,如下

  1. SQL> drop table flash_tbl;
  2. Table dropped.
  3. SQL> alter table flash_tbl01 rename to flash_tbl;
  4. Table altered.
  5. SQL> drop table flash_tbl;
  6. Table dropped.
  7. SQL> create table flash_tbl(id number);
  8. Table created.
  9. SQL> drop table flash_tbl;
  10. Table dropped.

查看recyclebin

  1. SQL> select object_name,original_name,droptime from recyclebin;
  2. OBJECT_NAME ORIGINAL_NAME DROPTIME
  3. ------------------------------ -------------------------------- -------------------
  4. BIN$AhT4Yh0OEoTgU8g4qMAP/A==$0 FLASH_TBL 2014-09-02:20:47:12
  5. BIN$AhT4Yh0PEoTgU8g4qMAP/A==$0 FLASH_TBL 2014-09-02:20:47:38
  6. BIN$AhT4Yh0NEoTgU8g4qMAP/A==$0 FLASH_TBL 2014-09-02:20:46:36

原始表名都是flash_tbl,这些对象在恢复的时候,会有顺序,测试如下

  1. SQL> flashback table FLASH_TBL to before drop;
  2. Flashback complete.
  3. SQL> select object_name,original_name,droptime from recyclebin;
  4. OBJECT_NAME ORIGINAL_NAME DROPTIME
  5. ------------------------------ -------------------------------- -------------------
  6. BIN$AhT4Yh0OEoTgU8g4qMAP/A==$0 FLASH_TBL 2014-09-02:20:47:12
  7. BIN$AhT4Yh0NEoTgU8g4qMAP/A==$0 FLASH_TBL 2014-09-02:20:46:36

显然是最先被删除的表最先被恢复

我们还可以指定恢复所需要的表,如下

  1. SQL> select object_name,original_name,droptime from recyclebin;
  2. OBJECT_NAME ORIGINAL_NAME DROPTIME
  3. ------------------------------ -------------------------------- -------------------
  4. BIN$AhT4Yh0OEoTgU8g4qMAP/A==$0 FLASH_TBL 2014-09-02:20:47:12
  5. BIN$AhT4Yh0QEoTgU8g4qMAP/A==$0 FLASH_TBL 2014-09-02:20:51:55
  6. BIN$AhT4Yh0NEoTgU8g4qMAP/A==$0 FLASH_TBL 2014-09-02:20:46:36

  1. SQL> flashback table "BIN$AhT4Yh0NEoTgU8g4qMAP/A==$0" to before drop;
  2. Flashback complete.

这样就可以想恢复哪个恢复哪个了

2,从undo 表空间中恢复

实验如下,查看一下表,并记录scn

  1. SQL> select * from flash_tbl;
  2. ID VL
  3. ---------- --
  4. 8 G
  5. 9 H
  6. 10 I
  7. 11 J
  8. 12 K
  9. 13 L
  10. 14 M
  11. 15 N
  12. 116 O
  13. 117 P
  14. 118 Q
  15. ID VL
  16. ---------- --
  17. 119 R
  18. 120 S
  19. 201 A1
  20. 202 B1
  21. 15 rows selected.
  22. SQL> select dbms_flashback.get_system_change_number from dual;
  23. GET_SYSTEM_CHANGE_NUMBER
  24. ------------------------
  25. 1792983

下面进行一系列操作

  1. SQL> update flash_tbl set id = id+100 where id >10;
  2. 12 rows updated.
  3. SQL> insert into flash_tbl values (21,'Z');
  4. 1 row created.
  5. SQL> delete flash_tbl where id =8;
  6. 1 row deleted.
  7. SQL> commit;
  8. Commit complete.
  9. SQL> select * from flash_tbl;
  10. ID VL
  11. ---------- --
  12. 9 H
  13. 10 I
  14. 111 J
  15. 112 K
  16. 113 L
  17. 114 M
  18. 115 N
  19. 216 O
  20. 217 P
  21. 218 Q
  22. 219 R
  23. ID VL
  24. ---------- --
  25. 220 S
  26. 301 A1
  27. 302 B1
  28. 21 Z
  29. 15 rows selected.

若此时发现,操作有误,希望回退到没有做操作的时候,那么用scn进行查询

  1. SQL> select * from flash_tbl as of scn 1792983;
  2. ID VL
  3. ---------- --
  4. 8 G
  5. 9 H
  6. 10 I
  7. 11 J
  8. 12 K
  9. 13 L
  10. 14 M
  11. 15 N
  12. 116 O
  13. 117 P
  14. 118 Q
  15. ID VL
  16. ---------- --
  17. 119 R
  18. 120 S
  19. 201 A1
  20. 202 B1
  21. 15 rows selected.

可见,数据可以恢复到那个scn,下面进行恢复操作

  1. SQL> flashback table flash_tbl to scn 1792983;
  2. flashback table flash_tbl to scn 1792983
  3. *
  4. ERROR at line 1:
  5. ORA-08189: cannot flashback the table because row movement is not enabled

却发现报错,原因是,基于undo的表恢复,被恢复的表必须启用row movement,表的row movement属性用来控制是否允许修改列值所造成的记录移动,表的row movement属性为disable时,如果记录值有移动操作,则更新语句会触发ora-08189错误

要查看某表是否启用了row movement,可以到数据字典user_tables中查询,如下

  1. SQL> select row_movement from user_tables where table_name = 'FLASH_TBL';
  2. ROW_MOVE
  3. --------
  4. DISABLED

启用

  1. SQL> ALTER TABLE FLASH_TBL ENABLE ROW MOVEMENT;
  2. Table altered.
  3. SQL> select row_movement from user_tables where table_name = 'FLASH_TBL';
  4. ROW_MOVE
  5. --------
  6. ENABLED

然后再恢复表

  1. SQL> flashback table flash_tbl to scn 1792983;
  2. Flashback complete.
  3. SQL> select * from flash_tbl;
  4. ID VL
  5. ---------- --
  6. 8 G
  7. 9 H
  8. 10 I
  9. 11 J
  10. 12 K
  11. 13 L
  12. 14 M
  13. 15 N
  14. 116 O
  15. 117 P
  16. 118 Q
  17. ID VL
  18. ---------- --
  19. 119 R
  20. 120 S
  21. 201 A1
  22. 202 B1
  23. 15 rows selected.




posted on 2022-03-23 12:27  sunny123456  阅读(40)  评论(0编辑  收藏  举报