2016-09-20 56 views
0

我碰到這個問題,前幾天來了,一直修修補補與 - 和琢磨一下幾種不同的方法,但我似乎無法找到一個很好的答案:MySQL的複製/同步:從主清除而不是從奴隸

我有兩個MySQL服務器,一個主/熱和一個從/檔案。所有寫入請求都發送給主設備,並且還將(最終)複製/複製到從設備。然而,在一段時間(比如說一個星期)之後,主人中的證明數據會變得「陳舊」,然後被清除,從而使主人的桌子變短。然而這個清除不應該影響從屬。我該如何着手解決這個問題?

本質上,我的主數據庫的行爲有點像「熱」數據庫,其中數據是新鮮的,一旦變老就會被清除。它應該包含用戶可能需要的數據,因此我們希望保持表格的小巧。另一方面,我的奴隸更像是一個存檔,它應該包含所有數據,不管「熱度」如何。對從機的查詢不需要快速執行,從機數據可能會滯後幾分鐘,但它需要包含自我們開始以來的所有記錄。

  • 我最初的想法是利用普通的複製,但我可以以某種方式過濾某些查詢,不影響奴隸?我正在考慮創建一個清除查詢,該查詢從主服務器刪除舊數據,但不影響從服務器。從閱讀MySQL文檔看來,這種過濾似乎只能在數據庫或Tabel級別上完成。

  • 另一個想法是通過外部應用程序來完成此操作,並手動從主服務器中選擇數據並將其插入從服務器,然後使用一些巧妙的邏輯來決定要選擇的數據。這適用於日誌表,它只會添加數據,但對於表示狀態的表(如用戶設置)不起作用。這種方法可能還會包含很多特殊情況,因爲我無法找到描述數據庫中所有表的好的一致方式(有日誌表,狀態表,配置表和一些我無法真正分類的表) )。

這些方法都不是以簡單的方式解決問題,但我覺得我不能成爲第一個有這個問題的人。任何想法都歡迎,並提前致謝。

如果需要更多的信息,隨意評論,我會在

回答

1

只要使用正規的複製編輯。當您刪除的主數據,你在同一個會話

SET sql_log_bin = 0; 
DELETE FROM my_table WHERE whatever = true; 
SET sql_log_bin = 1; 

做到這可以防止這些語句被寫入二進制日誌。因此它不會被複制到奴隸。

  • 閱讀更多關於它here
+0

如果我理解正確這,我應該通過SET SESSION SQL_LOG_BIN = 0調用該方法,對嗎?我只希望purging命令不被記錄,所有其他併發查詢仍應記錄。 – Gikkman

+0

是的,它這樣做。它只會阻止此會話中的語句不被記錄。其他會議的發言不受影響。 – fancyPants

+0

好吧,我會用這個做一些測試,如果它能解決問題,我會返回並標記爲正確的:-) – Gikkman