2011-03-12 62 views
3

我需要做一些mysql複製。 一些信息:共享主機中的Mysql複製

  • 我有兩個數據庫實例,在共享主機,所以我不能使用MySQL複製(我沒有訪問配置文件)。
  • 這是一個非盈利項目(教育),所以我們買不起我們自己的服務器。
  • 如果主服務器關閉幾分鐘,通常沒有那麼糟糕,但是存在特定的日子,我們真的需要有一個備份解決方案,與主服務器(網站的時間受限的事件)同步。

現在系統在每個表的每一行上都使用修訂號,我們會定期檢查修改這些號碼(並更新相應的行)。 這很慢。

我在想的是每個SELECT/INSERT/UPDATE查詢都記錄在特定的表中,並且「從服務器」定期詢問「主服務器」這個表的內容並應用相應的查詢。

你對這個想法有什麼看法?

我知道這並不完美,在所有查詢被傳播之前服務器可能會關閉,但我想盡量減少可能出現的問題,儘可能減少代碼行數。

什麼是實施它的最佳方式?

  • 在PHP代碼中,在每一個SELECT/INSERT/UPDATE我可以在一個特定的表做一個其他的刀片(1只需插入查詢)
  • 與觸發器?
+0

TRIGGER可能會導致問題。檢查這個問題http://stackoverflow.com/questions/4249269/what-if-a-trigger-fails。我會去應用程序查詢日誌和INSERT DELAYED,這樣就不會出現延遲。 – wisefish 2011-09-10 15:06:57

+0

而不是將查詢插入到表中,爲什麼不直接執行另一個插入到備份數據庫? – sreimer 2012-02-09 19:43:26

回答

0

兩個想法:

  1. 是找到MAX(ID),一個cron S IN備份數據庫表,然後獲取超出主數據庫中的所有記錄。

  2. 要包括我的評論中的建議,請將您的寫入直接複製到第二個數據庫,而不是將查詢寫入表中。這可能會導致一些開銷,但可能是最容易實現的。

2

我成功地使用觸發器的組合和聯合表一臺服務器上從一個MyISAM表模擬數據的複製MyISAM表在共享託管環境不同的服務器上。

我的主表上的任何插入/更新/刪除通過AFTER INSERT/AFTER UPDATE/AFTER DELETE觸發器複製到同一服務器上的聯合表。該聯合表然後將更改推送到不同服務器上的表中。

我不能居功能想出這種方法,因爲它是由RolandoMySQLDBA在服務器故障非常有益記載:
Is a MySQL stored procedure able to insert/update to a remote backup MySQL server?

下面是我實現的步驟:

Server2上...

  • 我創建了一個表(姑且稱之爲slave_table)與匹配那些在主柱 在SERVER1上的表(我們稱之爲 master_table)。

Server1上...

  • 我創建了一個表(姑且稱之爲federated_table)與匹配 列那些master_table,指定 FEDERATED存儲引擎一個CONNECTION字符串引用SERVER2上的slave_table ... CONNECTION='mysql://username:[email protected]:port/database/slave_table';

  • 我加入AFTER INSERTAFTER UPDATEAFTER DELETE觸發器來 master_table含有SQL命令...
    INSERT INTO federated_table VALUES (NEW.id,NEW.title);
    UPDATE federated_table SET id=NEW.id,title=NEW.title WHERE id=OLD.id;
    DELETE FROM federated_table WHERE id=OLD.id;分別。

我希望可以幫助某人處於類似的情況。