2017-03-22 58 views
0

我有一張桌子,我需要清除而不會中斷服務。約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

這樣做,我寧願:

  1. 創建輔助的表
  2. 創建規則來DML,而不是原來的表輔助的
  3. 創建規則,僅從原來的t選擇的,而不是原來的,'unionned」兩
  4. 移動數據好Ø輔助的
  5. 截斷原
  6. 要麼搬回數據(不需要重建引用)或重命名
  7. 下降廢棄的規則和對象

不過說真的,我剛剛從那裏99%的刪除,沒有發明輪子

相關問題