我在plsql脚本中有一些(5)重命名语句
drop table new;
rename old to new;
“旧”表格包含非常有价值的信息。
我认为,如果重命名命令保证是原子的,那么我就解决了一个问题。
是原子的吗?如果没有,有没有办法进行“安全”重命名?
提前致谢
答案 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)并再次重新定义视图。
视图非常简单,因此它应该可以更新而不会出现问题。唯一棘手的事情是始终构建一个新表(或在两个表之间切换),但这不应该太难设置,并且可能比完全避免原始建议可能出现的任何问题更容易。