2013-03-13 115 views
4

我一直在尋找一種方法來防止從屬服務器處理MySQL刪除語句,我正在處理數據倉庫項目,並且我希望在數據複製後從生產服務器中刪除數據對奴隸。沒有刪除數據的MySQL複製

完成這件事的最好方法是什麼?

謝謝

+0

你可以排除刪除查詢請參考stac http://dba.stackexchange.com/questions/20020/how-would-i-run-delete-queries-on-a-master-without-executing-same-deletes -on-a – shola 2013-03-13 15:14:13

回答

5

有幾種方法可以做到這一點。

  1. 運行SET SQL_LOG_BIN=0;爲執行您的刪除之前在主站上的相關會話。這樣它不寫入二進制日誌
  2. 在從屬上執行一個BEFORE DELETE觸發器忽略刪除。

我傾向於使用方法#1來處理我不想複製的語句。它需要SUPER權限。

我還沒有嘗試#2,但它應該是可能的。

3

你只能用一個黑客來實現這一點,它可能會導致問題。 MySQL複製不是爲此設計的。

想象一下,您在您的主設備中插入一條記錄,它將複製到從設備。然後,您從主站刪除,但不會從從站刪除。如果某人使用相同的唯一密鑰添加了記錄,則從屬設備上會出現衝突。

一些替代方案:

  1. 如果您正在尋找進行備份,我想通過另一種方式做到這一點。您可以使用運行mysqldump的cronjob進行定期備份,但這是假設您不想保存每條記錄,只創建定期還原點。
  2. 觸發器更新第二個鏡像數據庫。雖然這不能跨越服務器,但您必須用不同的名稱重新創建每個表。而且,計算成本會很高,從這個備份恢復將會很困難。
  3. 不要實際刪除任何東西,只需創建一個活動或禁用的狀態字段,然後隱藏用戶的禁用。這也有問題,例如,ON DELETE CASCADE無法使用,它必須全部在代碼中手動完成。

也許如果你提供你希望這個鏡像數據庫沒有刪除的原因,我可以給你一個更有針對性的解決方案。

+0

我有一些忙碌的數據庫,每天有1.6百萬條記錄,我試圖讓所有記錄存儲在單個數據庫中,然後在生產上運行清理工作來維護小型/快速數據庫,並且從站/報告服務器設置歷史數據。 我需要刪除在master上運行,以維護小型數據庫。 – Deano 2013-03-13 15:23:03

+0

@Deano,我很想知道哪種方法實際上適用於您。提前致謝! – 2015-03-04 10:14:04

+0

@ el.atomo,我創建了一個Perl腳本,它將每10分鐘運行一次,然後掃描master db以獲取最近的記錄,然後連接到倉庫db,並寫入新記錄,Perl mysql模塊,支持事務,因此它將扮演角色如果遇到錯誤並返回事務。也許這不是最好的方法,但現在一段時間以來它一直沒有問題。 – Deano 2015-03-04 23:06:28