2012-09-14 31 views
0

我有兩個數據庫,一個用於我的開發系統,另一個用於生產系統。如何檢測兩個數據庫之間的表和存儲過程更改?

是否有可能檢測到兩個系統之間的結構變化? (沒有數據,只能檢測到結構變化)

此刻我更新了一個文本文件,其中包含表存儲過程的所有結構更改。我想自動執行該操作,例如在部署shell腳本中。

以下是試圖解決這個問題。問題是我沒有得到可以執行的完整的sql語句。

mysqldump --skip-comments --no-data --routines --host=sql.test.de --user=root --password=123 bim_stage > /home/deploybackups/stagestructure.sql 
mysqldump --skip-comments --no-data --routines --host=sql.test.de --user=root --password=123 bim_dev > /home/deploybackups/devstructure.sql 

diff /home/deploybackups/stagestructure.sql /home/deploybackups/devstructure.sql > /home/deploybackups/diffstructure.sql 

回答

1

我敢肯定,你可以解決大多數問題與一些文字或圖形界面比較工具。但是,每當格式發生變化或某人不遵守標準時,所有內容似乎都會發生變化。某處的路線,你會發現自己固定奇怪的錯誤,如計算空格

什麼我得到的是,在我的經驗,這是不完全做到這一點的最好辦法。多年來,我已經看到了一些關於如何解決這個更新問題的不同嘗試。

  • Visual Studio有一個角度,通過創建一個數據庫項目來保存某些版本日誌中的所有更改。不完全確定具體細節。簡單地把你按同步和tada!它可以工作,但是如果你問我,它會非常全面和緩慢。

處理這個IMO最簡單的方法是將所有結構更改變成版本日誌/表;可以這麼說。

假設您的基本數據庫需要一個新表。你會進入你的編輯器並添加它(使用GUI或代碼),按保存,你就完成了。

改爲按Extract SQL;不要按保存。

我現在建議是什麼,是這樣的:

你建立一個小的內部網絡接口與一個大的輸入框和一個提交按鈕。點擊提交按鈕將對輸入框執行任何SQL對本地開發數據庫並返回結果。

如果DB返回成功,則SQL字符串添加到您的changeLogSQLVersionThingyTable至少有三列:

1)自動遞增的版本(整數) 2)SQL(文本) 3)日期和時間(時間日期) 4)開發人員ID?

當您對數據庫進行更改時(例如添加之前的表),請改用此工具。

現在,您已將所有對數據庫所做的更改都放在一個漂亮的版本列表中。要更新數據庫,您只需要執行changeLogSQLVersionThingyTable中的每一行,即從上次更新特定數據庫的版本開始。

通過一些努力,你也可以重建你的數據庫到更早的點;只需創建一個新的數據庫並將所有行一直運行到您想要的版本點。

1

您可以使用MySQL GUI工具(如SQLyog)輕鬆完成。 SQlyog的模式同步嚮導可以執行您所需的任務,即檢查結構中的更改並對其進行同步。看附件的截圖。

Schema Sync SQLyog

1

您試圖制定技術解決方案時,它實際上是過程中斷。誰將原始更改轉換爲生產而未安排將完全相同的sql應用於分段,QA和開發?這就是說,如果你有一個「正常」大小的數據庫,並且這些變化「很少發生」,我會使用方法來確定是否進行了更改。手動製作SQL腳本來影響更改並不困難。不過,我仍然會騷擾做出改變的人。

請注意,差異有選項可以忽略空白/空白行的變化。

完成後,將新模式檢入到您的源代碼庫中。它有一天會派上用場。

相關問題