2010-08-30 99 views
6

主要問題是數據庫結構的版本控制。SVN如何體面地跟蹤數據庫結構修改?

標準的mysqldump和pg_dump實用程序不會生成非常適合版本控制的文件。

dump命令會生成帶有自動增量值,TOC條目等的轉儲文件。由於這些對象會不斷變化,因此它總會產生巨大的差異文件。

PostgreSQL的DIFF

-- 
--- TOC entry 2630 (class 0 OID 0) 
+-- TOC entry 2549 (class 0 OID 0) 
-- Dependencies: 6 
-- Name: SCHEMA adm; Type: COMMENT; Schema: -; Owner: admin 
@@ -61,5 +61,5 @@ 

MySQL的DIFF

--- Dump completed on 2010-07-20 14:33:44 
+-- Dump completed on 2010-08-11 8:59:39 
Index: /db.sql 
=================================================================== 
--- /db.sql (revision 1274) 
+++ /db.sql (revision 1317) 
@@ -36,5 +36,5 @@ 
    `message` text, 
    PRIMARY KEY (`id`) 
-) ENGINE=MyISAM AUTO_INCREMENT=21122 DEFAULT CHARSET=utf8; 
+) ENGINE=MyISAM AUTO_INCREMENT=23730 DEFAULT CHARSET=utf8; 

對版本控制的更好的辦法任何建議/鏈接/公用事業感謝!

謝謝。

回答

6

看看LiquiBase(http://www.liquibase.org/

這是專爲允許開發者提交數據庫更改爲SVN的工具,然後安全地並自動將其應用到數據庫中。

更改可以通過比較兩個數據庫進行反向工程,或由開發人員手工編寫並提交。

它還確保數據庫更改以正確的順序應用,並且只應用於給定數據庫一次。

+0

偉大的提示。我一直在尋找數據庫版本控制的開源解決方案。 – 2010-08-30 16:30:36

+0

謝謝你的提示。正在尋找這種工具。 – Igor 2010-09-02 21:46:46

6

我們只是從頭開始編寫用於創建數據庫的腳本。開發人員在文本文件中編輯腳本,而不是在數據庫中編輯腳本。開發人員無權訪問生產SQL服務器,並且DBA團隊使用專門設計用於比較數據庫模式的工具(在我們的示例中爲Red-Gate SQLCompare)以執行生產構建。他們將從腳本創建一個新的空數據庫,並使用比較工具來檢測更改。有些更改可以自動應用,有些必須進行手動更改。

這不是一個完美的系統,但它迄今爲止工作得很好。

+1

這與我們在很多項目中使用的方法是一樣的,對於我們來說這很有效,可能有一些開發人員抱怨不得不編寫sql來創建表格。我通常告訴他們,他們不應該依賴設計師(即使他們確實節省了一些時間)。 – 2010-08-30 16:25:52

+3

我同意。如果開發人員要使用數據庫,他們應該能夠從頭開始編寫表格創建腳本,而不必運行太多的腦細胞。如果他們不能,也許他們應該把數據庫工作留給更合格的人。這就是說,我不會遇到任何人使用他們喜歡的任何工具將腳本放在一起,但是在一天結束時,它會被檢入到顛覆中,或者它沒有被部署。 – Mark 2010-08-30 16:36:32

+0

絕對同意你們,即使我們有時依然依賴IDE。感謝您的建議! – Igor 2010-09-02 21:44:49

2

我不會使用MySQL轉儲,因爲它們主要用於數據備份,並且通常不使用版本控制來管理數據備份。相反,我只是版本控制安裝腳本或用於設置初始數據庫結構的SQL文件。

對於小型項目,我通常只需要一個名爲install.sql的文件,其中包含我所有的CREATE語句和schema.txt其中描述的架構。對於大型項目,您可能想要使用類似dbForge的功能,它允許在專業版中進行數據庫模式版本控制,但如果這就是您所使用的所有功能,則價格有點貴。

簽出this article關於編碼恐怖(特別是該帖子中的第一個鏈接)以獲取更多指導。

+0

謝謝Lèse!在發佈問題之前檢查了這篇文章,並且會說必須仔細閱讀它。 – Igor 2010-09-02 21:54:28

2

Depesz最近寫了一篇博客文章的「HOW TO MANAGE CHANGES TO YOUR DATABASE?

我會說:

  • 如果你簡單地存儲在SVN每個對象的模式,你仍然需要部署具有順序依賴和數據的變化修改,因此所有真正爲你自己購買的東西都是對涉及對象的變化歷史進行分類。
  • 編寫腳本以執行所有更改,包括用於撤消更改的腳本。
  • 使用apgdiff生成(PostgreSQL)數據庫模式差異。
+0

感謝分享! – Igor 2010-09-02 21:51:28

2

對於PostgreSQL數據庫,您可以使用免費的Another PostgreSQL Diff Tool來比較您的開發架構和生產架構。您只需以您最適合的方式更新您的開發數據庫即可。如果要將生產數據庫更新爲開發數據庫狀態,請執行開發數據庫模式和生產數據庫模式的轉儲,並讓apgdiff進行比較。它將生成包含將生產數據庫轉換爲開發數據庫狀態所需的DDL語句的輸出。

事實上,如何將apgdiff部署到您的開發週期就取決於您使用DDL語句創建輸出以將生產數據庫「移動」到與開發數據庫相同的狀態。

在網站上您可以找到有關它如何工作,如何使用它,支持哪些語句等的信息。還有一篇關於PostgreSQL模式升級的文章,位於我的博客www.fordfrog.n​​ame(我被允許包括只有一個鏈接,所以不能使這個地址鏈接)。

+0

謝謝米洛斯拉夫回答!當然會檢查你的博客。 – Igor 2010-10-07 13:11:06