2012-02-14 33 views
1

我有幾個mysql數據庫和表需要「聆聽」。我需要知道哪些數據發生了更改,並將更改發送到具有數據庫本地鏡像的遠程服務器。我可以使用自制代碼反映數據庫中的更改嗎?

如何鏡像mysql數據庫中的更改?我正在考慮設置將所有更改寫入另一個表的mysql觸發器。該表具有數據庫名稱,表名和所有列。然後,我會編寫自定義代碼來傳輸更改,並定期將其安裝在遠程鏡像上。這會完成我的需求嗎?

+0

正如當前的答案所演示的那樣,使用DBMS之外的機制來處理像複製這樣的數據庫任務將被打破。 – msw 2012-02-14 17:51:38

+0

@msw我的回答如何被破壞?它不在數據庫之外。 – jterrace 2012-02-14 17:56:19

+0

@jterrace由於它試圖使用非數據庫機制來完成任務,所構成的問題已被打破。我編輯了這個問題,以更準確地反映所描述內容的語義。 – msw 2012-02-15 06:43:49

回答

1

您的計劃100%正確。

這個額外的表被稱爲「審計」或「歷史」表(有細微的區別,但你不應該太在意 - 但你現在有「官方」的條款,你可以用來做進一步的研究)。

如果主表具有A,B,C列,那麼審計將有3個以上:A,B,C,Operation,Changed_By,Change_DateTime(名稱取決於您的口味和編碼標準)。

「操作」欄存儲更改是插入,刪除,更新的舊值還是更新的新值(經常是3個字符寬,操作爲「INS」/「DEL」/「U_D」和「 U_I「,但還有其他方法)。

審覈表中的數據通過主表上的觸發器填充。

然後確保在Change_DateTime列上有一個索引。

,並找到更改列表,您跟蹤您上次調查的,然後簡單地做

SELECT * FROM Table_Audit WHERE Change_DateTime > 'LAST_POLL_TIME' 
1

你可以讓MySQL從一個特定的時間點上創建增量備份。這些數據僅包含自那時起對數據庫的更改。

您必須打開二進制日誌記錄,然後才能使用mysqlbinlog命令導出自給定時間戳以來的更改。請參閱本手冊的Point-in-Time (Incremental) Recovery部分以及documentation for mysqlbinlog。具體來說,您將需要--start-datetime參數。

以文本格式導出日誌後,可以在另一個數據庫實例上執行該日誌。

0

只要你走出DBMS的機制來完成像鏡像這樣固有的面向數據庫的任務,就違反了DB與大多數普通文件的區別。

特別是,您提議的機制違反了MySQL建立的atomicity, consistency, isolation, and durability。例如,鏡像日誌的不完整播放會使鏡像處於與父數據庫不一致的狀態。你所建議的只能近似鏡像,因此你應該更喜歡DBMS的內在機制,除非你不關心鏡子是否準確地反映了父項的狀態。

相關問題