2012-01-06 118 views
2

我有一個本地的MySQL數據庫和生產MySQL數據庫。我在本地進行更改,並使用第三方工具將更改同步到實時服務器。該工具使用校驗和功能來識別已更改的行。我的數據庫結構很簡單,一個varchar200字段(充當主鍵)和一個文本字段。用於同步目的替代時間戳列

問題是由於有成千上萬行,因此同步需要很長時間。我相信添加一個時間戳字段會保持快速獲取校驗和,以便工具識別要同步的行。由於時區差異,本地和prod服務器中的時間戳字段不同,因此這會產生更多問題。

我正在尋找一個有用的想法或時間戳的替代方法,當行被修改時會被更改。

PS:我發佈了similar question,但沒有得到任何有用的答案。我不想依賴額外的表格。

+0

您的舊數據是否可以更改或只有新插入? – 2012-01-06 12:51:15

回答

2

我的建議:請勿使用TIMESTAMP數據類型,請使用DATETIME。他們持有相同類型的數據,但每次觸摸時,即使您未設置該列,它也會使用「now」(包括插入)進行更新,而TIMESTAMP會更新

這意味着當您使用TIMESTAMP時,您永遠無法真正同步兩個數據庫 - 該列將始終不同。如果您使用DATETIME,則可以保留該列的數據。

如果您無法編寫應用程序以使用「now」更新DATETIME列,則只需創建一個觸發器即可爲您執行此操作。

2

你可以做幾件事情:

  1. 爲「髒」添加一列源表。使它成爲一個單一的BIT,當該行發生變化時,您可以翻轉並在同步時將其翻轉。如果行ID是主鍵,這是一個簡單的插入...重複密鑰更新
  2. 將您所有的時間存儲爲GMT。所以沒有更多的時區戰鬥。無論如何,這是任何時候存儲時間的標準做法。
  3. 設置兩臺服務器之間的複製,所以MySQL會爲你做複製/更新。這正是它所設計的,它運作良好。
+0

選項2似乎很好。但是,添加日期時間列可以幫助該工具快速爲該行創建校驗和? – Ctroy 2012-01-06 13:27:41

0

對行進行時間戳實際上是一個壞主意,到客戶端更新自己的最新同步時間時,許多行可能會在服務器上得到更新,您可能會錯過這些行。每次在服務器上添加或修改行時,使用一個增加1的計數器,客戶端會自行更新並獲取計數器的最新值。客戶端可能無法獲得計數器的最後值(例如,某些行在客戶端請求更新時得到更新),但它可以保證在下一次更新時趕上