如何在不中断服务的情况下重命名/重新创建表?

时间:2017-03-22 13:55:43

标签: sql postgresql transactions locking

我需要在不中断服务的情况下清除一张桌子。大约99.99%的数据应该被删除,因此我尝试重新创建表并将0.01%有用的数据移动到新表中,如下所示(我稍后会截断旧表):

BEGIN ISOLATION LEVEL SERIALIZABLE;
  LOCK TABLE table1 IN ACCESS EXCLUSIVE MODE;
  /* I rename the old table */
  ALTER TABLE table1 RENAME TO table1_to_be_deleted;
  /* And I recreate the table */
  CREATE TABLE table1 (
    ...
  );
  /* Restore usefull data from old table to new one */
  INSERT INTO table1 SELECT * FROM table1_to_be_deleted WHERE toBeKept = 1;
COMMIT;

但是当我运行我的交易时,由于没有在新表中找到但在旧表中存在的行,我得到了一些客户端错误。这些行被很好地标记为保留,因此它们应该从旧表复制到事务内部的新内容,并由客户端的请求找到....

当其他请求等待在表上获取锁时,是否有指向目标对象的指针?在我提交交易后,它是唯一可以解释旧表更新的我...

PS:我使用的是Postgres 9.1

1 个答案:

答案 0 :(得分:1)

要做到这一点,我宁愿:

  1. 创建辅助表
  2. 创建规则到DML而不是原始表到auxilary
  3. 创建规则来选择而不是原始的,`unionned'两个
  4. 将好的数据从ONLY原始移至auxilary
  5. 截断原文
  6. 移回数据(不需要重建引用)或重命名
  7. 删除过时的规则和对象
  8. 但实际上,我只是从99%的地方删除,而不是发明轮子