2010-03-05 168 views
14

我想問一下是否可以比較兩個大型數據庫的完整數據庫結構。 我們有兩個數據庫,一個是開發數據庫,​​另一個是生產數據庫。 在我們發佈代碼的某些部分之前,我有時會忘記對生產數據庫進行更改,這會導致生產數據庫不具有相同的結構,因此如果我們發佈某些內容,我們會遇到一些錯誤。 有沒有辦法比較兩者,還是同步?比較兩個數據庫的結構?

+0

我嘗試了以下所有工具,大多數需要付錢,有些無法在mysql服務器上工作,而mysqldiff根本無法工作。我結束了傾銷db strucdture和命令行比較。這很奇怪,因爲我認爲它應該是一個簡單的工具(比命令行diff更健壯一點)? – 2012-04-18 06:46:53

回答

4

紅門SQL比較是一個偉大的工具,將爲你做到這一點。我已經使用了這個多年,取得了巨大的成功。它爲我節省了數千小時的工作時間。

他們也有一個工具可以比較數據。我上面提到的產品比較了模式。

www-red-gate.com

+0

Red Gate SQL比較MySQL的工作嗎?我的印象是隻有MS SQL Server。 – Kibbee 2010-03-05 19:42:15

+0

@Kibbe你正確的只是爲了mssql而不是爲了mysql看看這裏http://www.red-gate.com/about/index.htm – streetparade 2010-03-05 19:43:45

+0

是的,Red Gate確實有MySQL的一個版本。目前它正處於擴展測試階段,所以現在完全免費使用。 http://www.red-gate.com/products/sql-development/mysql-compare/ – 2010-12-11 17:27:24

1

根據您的數據庫,可用工具有所不同。

我使用英巴卡迪諾的ER/Studio的這一點。它具有比較和合並功能。

有很多其他國家,如蟾蜍爲MySQL,也有比較。也同意Red-Gate的建議,但從未將它用於MySQL。

0

SchemaCrawler是一個自由的,獨立於平臺的工具,它允許您比較數據庫結構。這兩個數據庫不需要同時聯機 - 您可以將數據庫結構保存爲可讀的文本文件。使用標準差異工具完成共同犯罪。

我會建議自動化的比較作爲構建的一部分和部署流程,以確保您的生產系統是永遠不會過時的。

4

您可以將它們轉儲爲--no-data並比較文件。

記住使用--lock-表= 0選項對生產數據庫,以避免大的討厭的全局鎖。

如果你使用相同的mysqldump版本(你的開發和生產系統應該有相同的軟件,對嗎?),那麼你會期望得到更多或更少的相同的文件。這些表格將按字母順序排列,因此簡單的差異將很容易顯示差異。

0

如果您使用的是MSSQL,我一定會用AdeptSQL。這是最不好看的,但我嘗試過的最有天賦的數據庫比較工具。它可以比較結構和數據。它告訴你哪個表存在於一個數據庫中,但是不存在於另一個數據庫中,比較常見數據庫的結構和數據,並且可以生成腳本來同步這兩個數據庫。這不是免費的,但有30天的試用期(據我記憶)

1

退房雙子座三角洲 - SQL差異經理.NET。免費測試版可供下載,但完整版僅距離公開發布僅有幾天。

它並不比行級數據的差別,但它比較表,函數,存儲過程,等等,這是快如閃電。 (新版本1.4在4秒內加載並比較了1k Sprocs,與我測試過的其他工具相比,花費了10秒鐘。)

雖然大家都說得對,但RedGate確實是很棒的工具。

0

我終於使用了一種叫做「MySQL的結構比較」簡單的工具來解決這個問題。它僅是爲窗戶,但它是免費的,它的工作原理..

1

我試圖mysqldiff沒有成功,所以我想提請注意mysqlworkbench的比較功能,豐富了未來的讀者。 http://dev.mysql.com/doc/workbench/en/wb-database-diff-report.html#c13030

如果打開模型選項卡並選擇數據庫菜單,則會得到一個比較模式選項,可用於比較兩個不同服務器上的兩個不同模式或同一服務器上的兩個模式或模式和一個模型,或許多其他選項我還沒有嘗試過。

9

您可以使用命令行:

mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName1>file1.sql 
mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName2>file2.sql 
diff file1.sql file2.sql 
+1

好主意Gere,很容易找到區別,但不是表格名稱與diff命令,所以我跳入tkdiff包。我強烈推薦它。 – suarsenegger 2016-12-23 10:38:36

9

對於MySQL數據庫,你可以比較使用該查詢視圖和表(列名和列型):

SET @firstDatabaseName = '[first database name]'; 
SET @secondDatabaseName = '[second database name]'; 

SELECT * FROM 
    (SELECT 
     CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType 
    FROM information_schema.columns cl, information_schema.TABLES ss 
    WHERE 
     cl.TABLE_NAME = ss.TABLE_NAME AND 
     cl.TABLE_SCHEMA = @firstDatabaseName AND 
     ss.TABLE_TYPE IN('BASE TABLE', 'VIEW') 
    ORDER BY 
     cl.table_name) AS t1 
LEFT JOIN      
    (SELECT 
     CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType 
    FROM information_schema.columns cl, information_schema.TABLES ss 
    WHERE 
     cl.TABLE_NAME = ss.TABLE_NAME AND 
     cl.TABLE_SCHEMA = @secondDatabaseName AND 
     ss.TABLE_TYPE IN('BASE TABLE', 'VIEW') 
    ORDER BY 
     cl.table_name) AS t2 ON t1.tableRowType = t2.tableRowType 
WHERE 
    t2.tableRowType IS NULL   
UNION 
SELECT * FROM 
    (SELECT 
     CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType 
    FROM information_schema.columns cl, information_schema.TABLES ss 
    WHERE 
     cl.TABLE_NAME = ss.TABLE_NAME AND 
     cl.TABLE_SCHEMA = @firstDatabaseName AND 
     ss.TABLE_TYPE IN('BASE TABLE', 'VIEW') 
    ORDER BY 
     cl.table_name) AS t1 
RIGHT JOIN      
    (SELECT 
     CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType 
    FROM information_schema.columns cl, information_schema.TABLES ss 
    WHERE 
     cl.TABLE_NAME = ss.TABLE_NAME AND 
     cl.TABLE_SCHEMA = @secondDatabaseName AND 
     ss.TABLE_TYPE IN('BASE TABLE', 'VIEW') 
    ORDER BY 
     cl.table_name) AS t2 ON t1.tableRowType = t2.tableRowType 
WHERE 
    t1.tableRowType IS NULL; 

如果您更喜歡使用工具用戶界面你也可以使用這個腳本 https://github.com/dlevsha/compalex 它可以比較表,視圖,鍵等

Compalex是一個輕量級的腳本來比較兩個數據庫架構。它 支持MySQL,MS SQL Server和PostgreSQL。

截圖(比較表) Compare tables

+0

謝謝!非常好! – 2017-05-27 11:04:31

+0

這太好了。我用這個。謝謝。 – 2018-02-15 04:33:12

0

對於的MySQL在Linux,它是通過phpmyadmin的可能到數據庫導出而不 '數據' 和唯一結構。

通過整個數據庫導出選項滾動,只需取消「數據」,並設定輸出爲文本。導出您希望比較的兩個數據庫。

然後在文件比較你喜歡的程序/網站,比較數據庫的兩個文本文件輸出。本解決方案中的同步仍然是手動的,但這對於比較和查找結構差異非常有效。

1

當前回答這樣的問題,我做了一個使用information_schema內容比較列,數據類型的腳本,並表

SET @database_current = '<production>'; 
SET @database_dev = '<development>'; 
-- column and datatype comparison 
SELECT a.TABLE_NAME, a.COLUMN_NAME, a.DATA_TYPE, a.CHARACTER_MAXIMUM_LENGTH, 
    b.COLUMN_NAME, b.DATA_TYPE, b.CHARACTER_MAXIMUM_LENGTH 
FROM information_schema.COLUMNS a 
    LEFT JOIN information_schema.COLUMNS b ON b.COLUMN_NAME = a.COLUMN_NAME 
     AND b.TABLE_NAME = a.TABLE_NAME 
     AND b.TABLE_SCHEMA = @database_current 
WHERE a.TABLE_SCHEMA = @database_dev 
    AND (
     b.COLUMN_NAME IS NULL 
     OR b.COLUMN_NAME != a.COLUMN_NAME 
     OR b.DATA_TYPE != a.DATA_TYPE 
     OR b.CHARACTER_MAXIMUM_LENGTH != a.CHARACTER_MAXIMUM_LENGTH 
    ); 
-- table comparison  
SELECT a.TABLE_SCHEMA, a.TABLE_NAME, b.TABLE_NAME 
FROM information_schema.TABLES a 
    LEFT JOIN information_schema.TABLES b ON b.TABLE_NAME = a.TABLE_NAME 
     AND b.TABLE_SCHEMA = @database_current 
WHERE a.TABLE_SCHEMA = @database_dev 
    AND (
     b.TABLE_NAME IS NULL 
     OR b.TABLE_NAME != a.TABLE_NAME 
    ); 

希望這個腳本還可以幫助人們尋找非應用程序解決方案,但使用腳本。乾杯

+1

我喜歡使用僅限於mysql的解決方案的想法。但是,過濾器OR b.COLUMN_NAME!= a.COLUMN_NAME是多餘的,因爲在JOIN條件內假定爲等同,或者b.TABLE_NAME!= a.TABLE_NAME。 – 2018-03-08 18:50:40

+0

@PaulCampbell好點!感謝您的幫助,非常感謝。乾杯 – Avidos 2018-03-09 00:42:14