在开发及调试的过程中,需要比对新旧代码的差异,我们可以使用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.

mysql比对两个数据库表结构的方法相关推荐

  1. python比较两个数据库表_mysql如何比对两个数据库表结构的方法

    在开发及调试的过程中,需要比对新旧代码的差异,我们可以使用git/svn等版本控制工具进行比对.而不同版本的数据库表结构也存在差异,我们同样需要比对差异及获取更新结构的sql语句. 例如同一套代码,在 ...

  2. mysql怎么对比表结构_mysql怎么对比两个数据库表结构

    mysql怎么对比两个数据库表结构 发布时间:2021-02-03 11:45:58 来源:亿速云 阅读:58 作者:小新 这篇文章主要介绍了mysql怎么对比两个数据库表结构,具有一定借鉴价值,感兴 ...

  3. java 修改mysql数据库表结构_MYSQL数据库表结构优化方法详解

    摘要:这篇MySQL栏目下的"MYSQL数据库表结构优化方法详解",介绍的技术点是"mysql数据库表结构.MySQL数据库.数据库表结构.MySQL.据库表结构.数据库 ...

  4. mysql内核架构_热血江湖mysql内核技术之门派数据库表结构说明

    小编之前已经多次和大家说过了一个概念,不管你打算架设的是什么游戏什么版本都必须熟悉它的数据库整体结构.今天小编要说的是热血江湖私服游戏中最难的MYSQL内核技术,对于玩家来说MYSQL技术无疑是最难的 ...

  5. 如何比较两个数据库表结构的不同

    这些天在做基于开源系统二次开发,边改边加字段. 线上还运行了之前改好的系统. 表结构的设计管理混乱. 又没有好的办法,网上找的一下也没有很好的办法. 很多软件可以生成变更的sql代码,但不能直观查看便 ...

  6. ezdml 支付mysql 吗_关于EZDML数据库表结构制作设计工具使用踩的坑

    我使用的是一款EZDML的数据库表结构制作设计工具 最开始在数据库创建数据库名为personalmall,基字符集为默认,数据库排序规则也是默认,创建完成之后 去EZDML生成SQL 点击执行sql ...

  7. MYSQL对比两个数据库表结构

    有时候,需要对比一下测试环境和生产环境中,数据库的表结构是否有所差异.有两个常用的工具. AmpNmp.DatabaseCompare GUI 界面,支持多种数据库(MySQL.SQL Server. ...

  8. 用navicat对比两个数据库表结构

    1.打开Navicat,点击"工具"-->选择"结构同步" 2.选择需要比对的数据库,点击比对即可

  9. DbHelperSQL 判断数据库表结构公用方法

    #region 公用方法         /// <summary>         /// 判断是否存在某表的某个字段         /// </summary>      ...

最新文章

  1. 百万级PHP网站架构工具箱
  2. iOS如何查看静态库.a文件支持的cpu类型
  3. 第10章 Python 数字图像处理(DIP) - 图像分割 基础知识 标准差分割法
  4. 程序猿果真有前端后端client吗
  5. [转]Zabbix 3.0 安装笔记
  6. 优秀案例|App内弹窗界面设计灵感
  7. 使用Android Studio打包app
  8. 两种预处理命令的写法的区别
  9. JavaFx实现(2)-随机图形绘制
  10. 工具资源合集【持续更新】文字识别、英文写作、频段查询
  11. JFrame显示透明图片与动态图片
  12. 部标设备JTT808数据模拟器+Socket数据发送(JAVA版)
  13. C语言不使用中间变量交换两个变量的数据
  14. 俄罗斯卢布为什么整个2016年都在升值?
  15. 2021年科创板股权激励研究报告发布
  16. 计算机硬件系统不包括什么,硬件有哪些(计算机硬件不包括)
  17. Xmy的Python----Numpy库
  18. 10种室内定位技术原理深度解析
  19. 华为2019算法大赛CTR预估数据探索
  20. 机器学习笔记(十一)——学支持向量机怎能不懂“核”

热门文章

  1. 【论文笔记】AAAI2022:Do Feature Attribution Methods Correctly Attribute Features?
  2. 程序员需要善于在工作中总结
  3. c# 打开的窗口显示在最前面_安装CATIA V5 6R2017 Win64时“许可证管理工具”窗口不弹出解决方案...
  4. html实现在线展示PDF,html展示 pdf 利器
  5. 数字图像处理-数字水印的嵌入与提取
  6. 模拟仿造wifi信号登录界面(实验)
  7. 新浪微博Android客户端SSO授权认证缺陷
  8. C语言实现三子棋小游戏---超详细讲解
  9. 计算机开机后桌面放大,win10系统电脑重启后桌面图标变大的修复方法
  10. 高频高速板材该怎样选择