1. 程式人生 > >mysqldiff window 下安裝以及使用

mysqldiff window 下安裝以及使用

在開發工程中 我們需要進行程式碼比對

這時我們一般使用 BCompare(程式碼對比)、或者直接利用git 命令 gitdiff 來檢視程式碼差異

那麼 mysql 在使用的過程中 如果開發環境 和生產環境  中的 mysql 表結構不一致的話 造成的後果是非常嚴重的!

那麼 有沒有類似於 git diff 命令這種工具呢?!  mysqldiff  顧名思義 和 gitdiff 命令 好像

那麼下面筆者介紹在windos下怎麼安裝 :

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

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

如果要比較資料庫是否一致,可以用另外一個工具:mysqldbcompare點選檢視教程)。

以下是mysqldiff的用法。

1 安裝

mysqldiff是MySQL Utilities中的一個指令碼,預設的MySQL不包含這個工具集,所以需要獨立安裝。

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

安裝成功之後可以使用命令:

cmd中   mysqldiff --version


2 語法

mysqldiff的語法格式是:

$ mysqldiff --server1=user:[email protected]:port:socket --server2=user:[email protected]
: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等差異。
  • -d DIFFTYPE,--difftype=DIFFTYPE:差異的資訊顯示的方式,有[unified|context|differ|sql],預設是unified。如果使用sql,那麼就直接生成差異的SQL,這樣非常方便。
  • --changes-for=:修改物件。例如--changes-for=server2,那麼對比以sever1為主,生成的差異的修改也是針對server2的物件的修改。
  • --show-reverse:在生成的差異修改裡面,同時會包含server2server1的修改。

直接來例項:

localhost

線上伺服器

mysql 都建立test 庫

localhost 本地mysql 建表tba

CREATE TABLE `tba` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(25) NOT NULL,
 `age` int(10) unsigned NOT NULL,
 `addtime` int(10) unsigned NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8;

insert into `tba`(name,age,addtime) values('fdipzone',18,1514089188);

生產環境mysql  test庫 建表tbb

CREATE TABLE `tbb` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(20) NOT NULL,
 `age` int(10) NOT NULL,
 `addtime` int(10) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `tbb`(name,age,addtime) values('fdipzone',19,1514089188);

下面 使用mysqldiff對比兩表差異

E:\mysqldiff>mysqldiff --server1=root:[email protected]:3306:scoket --server2=haiyong:[email protected]:3306:socket  test.tba:test.tbb


3 範例

先建立兩個表。

use study;

create table test1(
    id int not null primary key,
    a varchar(10) not null,
    b varchar(10),
    c varchar(10) comment 'c',
    d int
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test1';

create table test2(
    id int not null,
    a varchar(10),
    b varchar(5),
    c varchar(10),
    D int
)ENGINE=myisam DEFAULT CHARSET=utf8 COMMENT='test2';

不使用--skip-table-options

mysqldiff --server1=root:[email protected] --server2=root:[email protected] --changes-for=server2 --show-reverse --difftype=sql study.test1:study.test2

使用--skip-table-options

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

mysqldiff --server1=root:[email protected] --server2=root:[email protected] --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及其後面的條件