Oracle 11g重命名。保证是原子的吗?

时间:2009-12-15 14:21:18

标签: oracle plsql rename

我在plsql脚本中有一些(5)重命名语句

drop table new;
rename old to new;

“旧”表格包含非常有价值的信息。

我认为,如果重命名命令保证是原子的,那么我就解决了一个问题。

是原子的吗?如果没有,有没有办法进行“安全”重命名?

提前致谢

5 个答案:

答案 0 :(得分:7)

RENAME是一个DDL命令。所以它是一个单独的离散事务,如果这就是你在这种情况下的原子意味着什么。因此,它与任何事情一样安全。我无法想象重命名会如何导致您丢失数据。但如果你感到偏执,请记住这就是大自然为我们提供备份和恢复的原因。

修改

如果DROP成功且RENAME失败,请确保您不会丢失数据的方法是部署RENAME两次:

SQL>  rename old_table to something_else;
SQL>  rename new_table to old_table;
SQL>  drop table something_else;

这样您就可以在线获取数据。这也最大限度地减少了停机时间。

答案 1 :(得分:3)

鉴于您的评论“它是一个日常过程”和“是的,我担心丢弃和重命名声明之间的混乱”

你有多少钱(或者更具体地说,你有分区选项)?如果是这样,请查看partition exchange

您的永久表由一个分区组成。在一天结束时,您将该分区与表交换(作为单个原子语句)。通过不删除/重命名主表,您不应该使任何包等无效(尽管这可能取决于数据库版本)。

未能使用视图并执行创建或替换视图主AS SELECT * FROM table_a,并且每晚在不同的表上用新的视图替换视图。这可能会使包无效。

答案 2 :(得分:1)

Rename将是原子的,所以你应该没事。正如APC所指出的那样,

  

我无法想象重命名会如何导致您丢失数据。

我在脚本中唯一能看到的是丢弃之后和重命名之前的时间,没有new表,因此可能会有一些SQL失败。但是,那段时间会非常短暂而且更复杂(如Insert From Select)会更成问题。

答案 3 :(得分:1)

我猜你担心在重命名期间可能会错过旧表上的并发DML(插入/更新/删除)?在这种情况下,请不要担心--RENAME是DDL,它会持续锁定表。

答案 4 :(得分:1)

如果您担心丢弃和重命名之间的时间,这是另一个想法:使用指向“正确的基础表”的视图。

你从

开始
CREATE VIEW someName as Select * From OldTable;

然后你可以设置你的newTable。当你准备好了,那么只需

CREATE OR REPLACE View someName as Select * From NewTable;

然后你可以放弃你的OldTable。下次获取一些新数据时,构建另一个NewTable_2(或重用OldTable ..然后最好使用Table1和Table2)并再次重新定义视图。

视图非常简单,因此它应该可以更新而不会出现问题。唯一棘手的事情是始终构建一个新表(或在两个表之间切换),但这不应该太难设置,并且可能比完全避免原始建议可能出现的任何问题更容易。