0

我正在使用 Navicat for Oracle 备份整个 Schema。我错误地选择了执行 SQL 文件而不是备份文件选项,并且所有以前的数据都已更改/丢失。我尝试使用 Oracle Undo 功能,但它说表定义已更改。请我不熟悉oracle,我只将它用于项目,因为它是必需的,所以我只是用它来存储数据。我需要我现在能得到的所有帮助来将整个架构恢复到 24 小时前的状态,否则我会被搞砸……(原谅我的语言)

4

1 回答 1

0

根据您的描述,您运行了一个删除并重新创建表的脚本。由于您启用了闪回并且您删除的表在回收站中,您可以使用“闪回删除”功能来恢复已删除的表。

这是一个带有单个表的示例:

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.

您无法取消删除序列;那些不会进入回收站。如果您需要重置序列以使其不重复您已有的值,您可以获得它应该保持的最高值(例如,从恢复的表上的主键)并使用临时更改increment以跳过使用过的值数字。

于 2014-06-23T14:57:47.733 回答