使用mysqldiff生成兩個數據庫結構不同的腳本


 

1,全庫比較各個表的不同,並輸出到文件

mysqldiff --server1=root:root@localhost --server2=root:root@localhost --difftype=sql aaa:bbb --changes-for=server1 --force > C:\output.sql

2,檢查是否有新表
mysqldiff --server1=root:root@localhost --server2=root:root@localhost --difftype=sql aaa:bbb --changes-for=server1

3,如果有新表,創建簡單的表結構,在運行1,2等步驟

注意:
Auto_increment的處理有點問題:
比較出來的腳本,執行后依然沒有自動增長
ALTER TABLE `aaa`.`tableb`
CHANGE COLUMN id id int(11) NOT NULL,
AUTO_INCREMENT=1;

用下面的才會自動增長
ALTER TABLE `aaa`.`tableb`
CHANGE COLUMN id id int(11) NOT NULL
AUTO_INCREMENT;

 

 

本文介紹mysqldiff工具來比較數據表結構,並生成差異SQL語句。

mysqldiff類似Linux下的diff命令,用來比較對象的定義是否相同,並顯示不同的地方。

如果要比較數據庫是否一致,可以用另外一個工具:mysqldbcompare點擊查看教程)。

以下是mysqldiff的用法。

1 安裝

mysqldiff是MySQL Utilities中的一個腳本,默認的MySQL不包含這個工具集,所以需要獨立安裝。

Linux系統在下載頁面選擇對應發行版。

2 語法

mysqldiff的語法格式是:

$ mysqldiff --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket db1.object1:db2.object1 db3:db4

這個語法有兩個用法:

  • db1:db2:如果只指定數據庫,那么就將兩個數據庫中互相缺少的對象顯示出來,不比較對象里面的差異。這里的對象包括表、存儲過程、函數、觸發器等。
  • db1.object1:db2.object1:如果指定了具體表對象,那么就會詳細對比兩個表的差異,包括表名、字段名、備注、索引、大小寫等所有的表相關的對象。

接下來看一些主要的參數:

  • --server1:配置server1的連接。
  • --server2:配置server2的連接。
  • --character-set:配置連接時用的字符集,如果不顯示配置默認使用character_set_client
  • --width:配置顯示的寬度。
  • --skip-table-options:保持表的選項不變,即對比的差異里面不包括表名AUTO_INCREMENTENGINECHARSET等差異。
    1.  
      -d
    2.  
      DIFFTYPE
    ,--difftype=DIFFTYPE:差異的信息顯示的方式,有[unified|context|differ|sql],默認是unified。如果使用sql,那么就直接生成差異的SQL,這樣非常方便。
  • --changes-for=:修改對象。例如--changes-for=server2,那么對比以sever1為主,生成的差異的修改也是針對server2的對象的修改。
  • --show-reverse:在生成的差異修改里面,同時會包含server2server1的修改。

3 范例

先創建兩個表。

  1.  
    use study;
  2.  
     
  3.  
    create table test1(
  4.  
    id int not null primary key,
  5.  
    a varchar(10) not null,
  6.  
    b varchar(10),
  7.  
    c varchar(10) comment 'c',
  8.  
    d int
  9.  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test1';
  10.  
     
  11.  
    create table test2(
  12.  
    id int not null,
  13.  
    a varchar(10),
  14.  
    b varchar(5),
  15.  
    c varchar(10),
  16.  
    D int
  17.  
    ) ENGINE=myisam DEFAULT CHARSET=utf8 COMMENT='test2';

不使用--skip-table-options

mysqldiff --server1=root:root@localhost --server2=root:root@localhost --changes-for=server2 --show-reverse --difftype=sql study.test1:study.test2

使用--skip-table-options

如果需要生成SQL文件,加上輸出就可以了:

mysqldiff --server1=root:root@localhost --server2=root:root@localhost --changes-for=server2 --show-reverse --difftype=sql study.test1:study.test2 > output.sql

說明:執行MySQL語句時可能會遇到這樣錯誤:Error 1054 - Unknown column 'name' in 'aspect'

這是因為mysqldbcompare生成的ALTER語句中,用逗號,拼裝了多條ADDCHANGE等語句,如果這些語句還包含AFTER關鍵字,就會提示這個錯誤並中斷執行MySQL語句。解決的辦法就是:去除AFTER及其后面的條件。

這可能是MySQL的一個Bug,詳情參考:http://bugs.mysql.com/bug.php?id=34972 和 http://bugs.mysql.com/bug.php?id=60650

 

參考資料:

  1. MySQL 對比數據庫表結構
  2. mysqldiff — Identify Differences Among Database Objects
  3. MySQL管理工具MySQL Utilities — mysqldiff(11)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM