使用FLASHBACK TABLE…TO BEFORE DROP语句从回收站恢复对象。
可以指定表在回收站中的名称或原始的名称。
场景:
假设错误地删除了表。
许多次你被请求在测试库中删除表,但这次你意外地连接到了生产库并删除了hr.employee_demo表。
规划:使用FLASHBACK TABLE获取删除的对象
练习:获取删除的表
|
--1. 使用SQL*Plus连接到目标数据库,并从回收站获取被删除的表的名称 --1.1 ORIGINAL NAME和RRECYCLEBIN NAME分别为对象的原始名称和在回收站中的名称 SHOW RECYCLEBIN;
ORIGINAL NAME RECYCLEBIN NAME TYPE DROP TIME ---------------- --------------------------------- ------------ ------------- EMPLOYEE_DEMO BIN$gk3lsj/3akk5hg3j2lkl5j3d==$0 TABLE 2005-04-11:17:08:54
--1.2 也可以查看USER_RECYCLEBIN和DBA_RECYCLEBIN来获取表的名称 SELECT object_name AS recycle_name, original_name, type FROM recyclebin;
RECYCLE_NAME ORIGINAL_NAME TYPE -------------------------------- --------------------- ---------- BIN$gk3lsj/3akk5hg3j2lkl5j3d==$0 EMPLOYEE_DEMO TABLE BIN$JKS983293M1dsab4gsz/I249==$0 I_EMP_DEMO INDEX
-- 如果你计划手动地还原依赖对象的原始名称,则在还原表之前要确保清楚每个依赖的对象的系统产生的回收站的名称 -- 注意:对象视图例如DBA_OBJECTS不显示回收站对象 -- 2. (可选),查询在回收站中的表.必须在查询中使用对象的回收站名称而不是原始名称 SELECT * FROM "BIN$gk3lsj/3akk5hg3j2lkl5j3d==$0"; -- 注意:如果你具有必须的权限,则也可以在回收站中的表上使用闪回查询,但只能使用回收站名称而不是原始名称。 -- 不能在回收站中的对象上执行DML和DDL操作。 --3. 获取删除的表. 使用FLASHBACK TABLE ... TO BEFORE DROP --3.1 使用回收站对象名称,要用双引号引起来,因为在名称中有特殊字符 FLASHBACK TABLE "BIN$gk3lsj/3akk5hg3j2lkl5j3d==$0" TO BEFORE DROP; --3.2 使用原始名称 FLASHBACK TABLE HR.EMPLOYEE_DEMO TO BEFORE DROP; --3.3 给还原后的表指定新的名称 FLASHBACK TABLE "BIN$KSD8DB9L345KLA==$0" TO BEFORE DROP RENAME TO hr.emp_demo; --4. (可选)验证所有依赖的对象仍然是系统产生的回收站对象名称 SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'EMPLOYEE_DEMO';
INDEX_NAME ------------------------------ BIN$JKS983293M1dsab4gsz/I249==$0
--5. 将获取的索引改名为原始的名称 ALTER INDEX "BIN$JKS983293M1dsab4gsz/I249==$0" RENAME TO I_EMP_DEMO; --6. 如果获取的表在它被放入回收站之前具有引用约束,则重建约束。这步必须手动完成,因为回收站不会保留引用约束。 |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17013648/viewspace-1096758/ ,如需转载,请注明出处,否则将追究法律责任。