【问题标题】:How to rename/recreate a table without disrupting service?如何在不中断服务的情况下重命名/重新创建表?
【发布时间】:2017-03-22 13:55:42
【问题描述】:

我有一张桌子需要在不中断服务的情况下清除。大约 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

【问题讨论】:

  • 那些行是在你提交之后插入的?..

标签: sql postgresql transactions locking


【解决方案1】:

我更愿意这样做:

  1. 创建辅助表
  2. 创建规则到 DML 而不是原始表到辅助
  3. 创建规则以选择而不是原始规则,“联合”两者
  4. 将好的数据从 ONLY 原始数据转移到辅助数据
  5. 截断原文
  6. 要么移回数据(不需要重建引用)要么重命名
  7. 删除过时的规则和对象

但实际上,我只是从 99% 的地方删除,而不是发明轮子

【讨论】:

    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2017-02-26
    • 2011-09-19
    • 1970-01-01
    相关资源
    最近更新 更多