2010-12-09 185 views
1

在我的數據庫中,我想跟蹤每次更改的列的值。以某種方式,每當某個字段的值發生更改時,我們都可以知道以前的值是多少。爲每個更改分配時間戳。我使用MySQL作爲數據庫服務器。在MySQL中更改數據捕獲

回答

4

要做到這一點,你需要創建一個觸發器,這是當發生在一個給定表的INSERT, UPDATE, DELETE被觸發的事件。

查看CREATE TRIGGER的文檔。

對於您想要做的事情,您可能需要在主表上爲每個INSERT/UPDATE插入一行輔助表,AFTER它恰好包含已更改行的ID,舊值爲新值和時間戳。

0

這是我會建議的。這可能是一小部分工作,但如果你這樣做,我真的認爲你將有一個堅實的方式在MySQL中進行變更數據捕獲。請記住,在考慮鎖定和隔離級別等問題時,在數據庫中執行更改跟蹤實際上是一件很難做到的事情。我強烈建議使用這樣的過程。

查看來自iAnywhere的名爲MobiLink的產品。您可以從here下載它的免費開發者版本。 MobiLink的目的是允許您將數據更改從MySQL等數據庫同步到SQL Anywhere數據庫。當然,您唯一感興趣的部分是能夠從MySQL獲取更改。幸運的是,MobiLink將在MySQL數據庫中非常有效地創建這些更改數據捕獲觸發器。實際上,它甚至會爲您提供用於執行此操作的sql腳本,以防您需要再次執行此操作。之後,您可以卸載SQL Anywhere。

要開始,在安裝它之後,將會有一個名爲Sybase Central的產品,您需要打開它。打開這個對話框時,會出現一個嚮導,它將引導您完成針對MySQL數據庫的MobiLink配置。我認爲如果遇到困難,安裝的幫助文件中會有一篇演練,但我現在無法訪問它進行驗證。

通過嚮導運行後,它將配置您的MySQL數據庫以更改數據捕獲。如果你看看你的數據庫,你也會得到所有你需要的觸發器和更改跟蹤列。

希望幫助....

0

觸發器並不總是以記錄在數據庫中更改事件的最好辦法。因爲一旦表的模式發生變化,觸發器就會失效,並且會導致實際的表操作失敗。

對於mysql,您需要從二進制日誌文件捕獲更改事件。 Mysql提供API來讀取二進制日誌(後5.6版)。

您可能還需要尋找到Flexviews,它提供了Oracle像物化視圖日誌來記錄變更事件。

0

我創建了一個名爲cdc_audit工具,任何或所有自動錶在MySQL審計表的創作,甚至保留了預先存在的觸發器。我在考慮更改數據捕獲(針對數據倉庫ETL應用程序)時編寫了它。也許你或別人會覺得它有用。我也blogged about it

特點

  • 自動審覈表代
  • 自動生成的觸發器來填充審計表
  • 在審計表自動的新行同步到.csv文件。
  • 讀取mysql information_schema自動確定表和列。
  • 可以爲所有數據庫表或指定列表生成表格+觸發器。
  • 可以同步所有數據庫表或指定列表的審計表。
  • 當生成AFTER觸發器時,保留預先存在的觸發器邏輯(如果有)。
  • 同步腳本選項可刪除除最後一個審計行以外的所有行,以使源數據庫保持較小。