共计 3795 个字符,预计需要花费 10 分钟才能阅读完成。
自动写代码机器人,免费开通
这篇文章主要介绍了 mysql 怎么对比两个数据库表结构,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。
在开发及调试的过程中,需要对比新旧代码的差异,我们可以使用 git/svn 等版本控制工具进行比对。而不同版本的数据库表结构也存在差异,我们同样需要对比差异及获取更新结构的 sql 语句。
例如同一套代码,在开发环境正常,在测试环境出现问题,这时除了检查服务器设置,还需要对比开发环境与测试环境的数据库表结构是否存在差异。找到差异后需要更新测试环境数据库表结构直到开发与测试环境的数据库表结构一致。
我们可以使用 mysqldiff 工具来实现对比数据库表结构及获取更新结构的 sql 语句。
1.mysqldiff 安装方法
mysqldiff 工具在 mysql-utilities 软件包中,而运行 mysql-utilities 需要安装依赖 mysql-connector-python
mysql-connector-python 安装
下载地址:https://dev.mysql.com/downloads/connector/python/
mysql-utilities 安装
下载地址:https://downloads.mysql.com/archives/utilities/
因本人使用的是 mac 系统,可以直接使用 brew 安装即可。
brew install caskroom/cask/mysql-connector-python
brew install caskroom/cask/mysql-utilities
安装以后执行查看版本命令,如果能显示版本表示安装成功
mysqldiff --version
MySQL Utilities mysqldiff version 1.6.5
License type: GPLv2
2.mysqldiff 使用方法
命令:
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 查看版本
更多 mysqldiff 的参数使用方法可参考官方文档:
https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqldiff.html
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.
感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“mysql 怎么对比两个数据库表结构”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!
向 AI 问一下细节