我需要在不中断服务的情况下清除一张桌子。大约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
答案 0 :(得分:1)
要做到这一点,我宁愿:
但实际上,我只是从99%的地方删除,而不是发明轮子