如何确保正在替换的表上的同步DDL操作?

时间:2013-12-19 21:59:38

标签: amazon-redshift

我有多个进程在Redshift中不断刷新数据。他们启动一个事务,创建一个新表,COPY从S3到新表的所有数据,然后删除旧表并将新表重命名为旧表。

伪代码:

start transaction;
create table foo_temp;
copy into foo_temp from S3;
drop table foo;
rename table foo_temp to foo;
commit;

我有几十个表,我以这种方式更新。这很好但我希望有多个进程执行这些表更新以实现冗余,并确保数据相当新鲜(不同的进程可以同时更新不同表的数据)。

除非一个进程尝试刷新另一个进程正在处理的表,否则它可以正常工作。在这种情况下,第二个进程被第一个进程阻塞,直到它提交为止,当它提交第二个进程时会出错:

  

错误:表12345因并发事务而被删除

我是否有一种简单的方法可以保证只有一个进程刷新表,以便第二个进程不会遇到这种情况?

我考虑为每个真实表创建一个特殊的锁表。在处理伴随真实表之前,该过程将LOCK特殊锁定表。我认为这样可行,但我想避免为每个表创建一个特殊的锁表。

1 个答案:

答案 0 :(得分:8)

您需要保护读者不要看到丢弃,请执行以下操作:

  • 开始交易
  • 将主表重命名为old_main_table
  • 将tmp表重命名为主表
  • 提交
  • drop table old_main_table
 
    Conn #1         Conn #2
    --------------  ------------------------------------------
                    > create table bar (id int,id2 int,id3 int);
                    CREATE TABLE
    > begin;
    BEGIN
                    > begin;
                    BEGIN
                    > alter table bar rename to bar2;
                    ALTER TABLE
    > select * from bar;  
                    > create table bar (id int,id2 int,id3 int,id4 int);
                    CREATE TABLE
                    > commit; drop table bar2;
                    COMMIT
    id | id2 | id3 
    ----+-----+-----
    (0 rows)
    > commit;
    COMMIT
                    DROP TABLE