2008-09-19 81 views
4

我在MySQL 5.0.45上運行幾個數據庫,並試圖讓我的遺留數據庫與修訂的模式同步,所以我可以並排運行。我正在通過向新數據庫添加觸發器來實現這一點,但我遇到了複製問題。我的設置如下。MySQL觸發器+複製與多個數據庫

服務器的 「主人」

  • 數據庫 「legacydb」,複製到服務器的 「奴隸」。
  • 數據庫「newdb」,觸發器更新「legacydb」並且不復制。

服務器 「奴隸」

  • 數據庫 「legacydb」

我的更新 「NEWDB」 運行良好,並掀起我的觸發器。他們更新「主」服務器上的「legacydb」。但是,這些更改不會複製到奴隸身上。 MySQL文檔說,爲了簡單起見,在決定要複製哪些查詢而不是查看查詢產品時,複製會查看當前數據庫上下文(例如"SELECT DATABASE();")。我的觸發器是從數據庫「newdb」的上下文運行的,因此複製會忽略更新。

我曾嘗試將更新語句移動到「legacydb」中的存儲過程。當我連接到「主」並手動運行"USE newdb; CALL legacydb.do_update('Foobar', 1, 2, 3, 4);"時,這工作正常(即數據複製到從屬)。但是,從觸發器調用此過程時,它不會複製。

到目前爲止,我對如何解決這個問題的思考一直是下列問題之一。

  • 強制觸發器設置新的當前數據庫。這將是最簡單的,但我不認爲這是可能的。這是我希望用存儲過程實現的。

  • 複製這兩個數據庫,並且在主站和從站中都有觸發器。這將是可能的,但一個痛苦的設立。

  • 無論當前的數據庫上下文如何,強制複製都會選取「legacydb」的所有更改。

  • 如果複製的運行水平太高,它甚至不會看到我的觸發器運行的任何更新,在這種情況下,沒有任何黑客攻擊會達到我想要的效果。

任何有關如何實現這一目標的幫助將不勝感激。

回答

3

這可能是與它:

存儲函數獲得執行前表鎖,以避免在二進制日誌中的不一致是由於哪些語句執行,當他們出現在日誌中的順序不匹配。記錄調用函數的語句,而不是在函數中執行的語句。因此,更新相同基礎表的存儲函數不會並行執行。

相反,存儲過程不會獲取表級鎖。在存儲過程中執行的所有語句都寫入二進制日誌。

此外,還有一些問題整個列表使用觸發器: http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions.html

+0

基本上,萬無一失的辦法是更新數據庫,如果有觸發複製的數據庫,或存儲功能,他們也必須存在在從數據庫上。對於如何編寫觸發器和函數還有一些限制,以便它們自己複製。 – Chris 2008-09-19 03:37:23