我使用Navicat for Oracle来备份整个架构。我错误地选择了“执行SQL文件”而不是“备份文件”选项,并且所有以前的数据都已更改/丢失。我尝试使用Oracle Undo功能,但它表示表定义已更改。请我不熟练使用oracle,我只将它用于项目,因为它是必需的,所以我只是用它来存储数据。我需要所有的帮助,我现在可以恢复整个架构到24小时前的状态,我是如此搞砸......(原谅我的语言)
答案 0 :(得分:0)
根据您的描述,您运行了一个删除并重新创建表的脚本。由于您已启用闪回并且已删除的表位于回收站中,因此您可以use the 'Flashback Drop' feature将已删除的表恢复。
这是一个包含单个表的示例:
create table t43 (id number);
drop table t43;
create table t43 (id2 number);
show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
-------------------------------- ------------------------------ ------------------------- -------------------
T43 BIN$/ILKmnS4b+jgQwEAAH9jKA==$0 TABLE 2014-06-23:15:38:06
如果您尝试使用新表还原表,则会出现错误:
flashback table t43 to before drop;
SQL Error: ORA-38312: original name is used by an existing object
您可以重命名已恢复的表格:
flashback table t43 to before drop rename to t43_restored;
...如果你想保留你的新表但能够引用旧表,这是很有用的;或者在你的情况下可能更有用的是在恢复之前重命名新表:
alter table t43 rename to t43_new;
table T43 altered.
flashback table t43 to before drop;
table T43 succeeded.
desc t43
Name Null Type
---- ---- ------
ID NUMBER
你可以取消所有的表,并且由于参考约束仍然适用于bin中的表,你不必过于担心在子表之前恢复父表,尽管它可能更适合于如果可以,那就这样做。
请注意文档中有关重新编写依赖对象的位 - 索引名称不会被保留,并且您需要在使用alter index
进行还原后重命名它们。
你不能撤消序列;那些不进入回收站的人。如果您需要重置序列以使其不重复您已有的值,您可以获得它应该保留的最高值(从已恢复的表上的主键,比如说)and use temporarily change the increment
value以跳过用过的数字。