2010-02-11 60 views
5

我有50GB的mysql數據庫(80表),我需要從它刪除一些內容。 我有一個參考表,其中包含需要從其他表中刪除產品ID的列表。MYSQL批量刪除從80個表

現在,其他表格可以是每個2 GB,包含需要刪除的項目。

  1. 我的問題是:因爲這是一個不小的數據庫,什麼是刪除 爲了避免出現問題一次性數據的最安全的方法?

  2. 什麼是驗證整個數據被刪除的最佳方法?

回答

0

我同意Thirler使用外鍵是可取的。它保證了整個數據庫的參照完整性和一致性。
我可以相信生活有時需要更棘手的邏輯。 所以,你可以使用手動查詢,如

delete from a where id in (select id from keys) 

你可以一次或鍵的範圍或刪除使用LIMIT刪除所有記錄。正確的索引是必須的。 要驗證一致性,您需要函數或查詢。例如:

create function check_consistency() returns boolean 
begin 
    return not exists(select * from child where id not in (select id from parent)) 
     and not exists(select * from child2 where id not in (select id from parent)); 
    -- and so on 
end 
1

可能這對我們沒有幫助了。但是在創建數據庫時應該牢記這一點。在mysql中(取決於表存儲類型,例如在InnoDB中),您可以指定關係(它們被稱爲foreign key constraints)。這些關係意味着,如果從一行(例如產品)中刪除條目,則可以自動更新或刪除其他表中具有該行作爲外鍵的條目(例如product_storage)。這些關係警惕你有100%一致的狀態。但事後看來,這些關係可能難以加以補充。如果你打算經常這樣做,如果你可以將它們添加到你的數據庫中,這將是非常值得研究的,它們將爲你節省很多工作(各種查詢變得更簡單)

沒有這些關係,你不能百分百肯定。所以你必須查看所有表格,而不是查看哪些列,然後編寫一堆sql查詢以確保沒有任何條目。

1

正如Thirler指出的那樣,如果你有外鍵,那將會很好。如果沒有他們,可以使用burnall的解決方案進行交易,以確保沒有不一致性。

無論你怎麼做,這可能需要很長時間,甚至幾小時,所以請爲此做好準備。

1

正如前面指出的,外鍵在這個地方會很好用。但是關於問題1,您可以在MySQL提示符下運行事務中的更改。這假設你正在使用像InnoDB這樣的事務安全存儲引擎。如果需要,您可以從myisam轉換到InnoDB。無論如何這樣的事情:

START TRANSACTION; 

...Perform changes... 
...Control changes... 

COMMIT; 
...or... 
ROLLBACK; 

是否可以接受任何停機時間?

當使用數據庫> 250Gb的PostgreSQL處理時,我們在生產服務器上使用此技術來執行數據庫更改。如果結果不符合預期,我們只會回滾交易。當然,由於I/O系統必須工作一點,這是一種懲罰。

// John