mysql如何⽐对两个数据库表结构的⽅法
在开发及调试的过程中,需要⽐对新旧代码的差异,我们可以使⽤git/svn等版本控制⼯具进⾏⽐对。⽽不同版本的数据库表结构也存在差异,我们同样需要⽐对差异及获取更新结构的sql语句。
例如同⼀套代码,在开发环境正常,在测试环境出现问题,这时除了检查服务器设置,还需要⽐对开发环境与测试环境的数据库表结构是否存在差异。到差异后需要更新测试环境数据库表结构直到开发与测试环境的数据库表结构⼀致。
我们可以使⽤mysqldiff⼯具来实现⽐对数据库表结构及获取更新结构的sql语句。
mysqldiff⼯具在mysql-utilities软件包中,⽽运⾏mysql-utilities需要安装依赖mysql-connector-python
mysql-connector-python 安装
mysql-utilities 安装
因本⼈使⽤的是mac系统,可以直接使⽤brew安装即可。
brew install caskroom/cask/mysql-connector-python
brew install caskroom/cask/mysql-utilities
安装以后执⾏查看版本命令,如果能显⽰版本表⽰安装成功
mysql数据库的方法mysqldiff --version
MySQL Utilities mysqldiff version 1.6.5
License type: GPLv2
命令:
mysqldiff --server1=root@host1 --server2=root@host2 --difftype=sql db1.table1:dbx.table3
参数说明:
--server1 指定数据库1
-
-server2 指定数据库2
⽐对可以针对单个数据库,仅指定server1选项可以⽐较同⼀个库中的不同表结构。
--difftype 差异信息的显⽰⽅式
unified (default)
显⽰统⼀格式输出
context
显⽰上下⽂格式输出
differ
显⽰不同样式的格式输出
sql
显⽰SQL转换语句输出
如果要获取sql转换语句,使⽤sql这种显⽰⽅式显⽰最适合。
--character-set 指定字符集
--changes-for ⽤于指定要转换的对象,也就是⽣成差异的⽅向,默认是server1
--changes-for=server1 表⽰server1要转为server2的结构,server2为主。
--changes-for=server2 表⽰server2要转为server1的结构,server1为主。
--skip-table-options 忽略AUTO_INCREMENT, ENGINE, CHARSET的差异。
--version 查看版本
3.实例
创建测试数据库表及数据
create database testa;
create database testb;
use testa;
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);
use testb;
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);
执⾏差异⽐对,设置server1为主,server2要转为server1数据库表结构
mysqldiff --server1=root@localhost --server2=root@localhost --changes-for=server2 --difftype=sql testa.tba:testb.tbb;
# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# Comparing testa.tba to testb.tbb [FAIL]
# Transformation for --changes-for=server2:
#
ALTER TABLE `testb`.`tbb`
CHANGE COLUMN addtime addtime int(10) unsigned NOT NULL,
CHANGE COLUMN age age int(10) unsigned NOT NULL,
CHANGE COLUMN name name varchar(25) NOT NULL,
RENAME TO testa.tba
, AUTO_INCREMENT=1002;
# Compare failed. One or more differences found.
执⾏mysqldiff返回的更新sql语句
mysql> ALTER TABLE `testb`.`tbb`
-> CHANGE COLUMN addtime addtime int(10) unsigned NOT NULL,
-> CHANGE COLUMN age age int(10) unsigned NOT NULL,
-> CHANGE COLUMN name name varchar(25) NOT NULL;
Query OK, 0 rows affected (0.03 sec)
再次执⾏mysqldiff进⾏⽐对,结构没有差异,只有AUTO_INCREMENT存在差异
mysqldiff --server1=root@localhost --server2=root@localhost --changes-for=server2 --difftype=sql testa.tba:testb.tbb;
# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# Comparing testa.tba to testb.tbb [FAIL]
# Transformation for --changes-for=server2:
#
ALTER TABLE `testb`.`tbb`
RENAME TO testa.tba
, AUTO_INCREMENT=1002;
# Compare failed. One or more differences found.
设置忽略AUTO_INCREMENT再进⾏差异⽐对,⽐对通过
mysqldiff --server1=root@localhost --server2=root@localhost --changes-for=server2 --skip-table-options --difftype=sql testa.tba:testb.tbb; # server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# Comparing testa.tba to testb.tbb [PASS]
# Success. All objects are the same.
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论