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

例如同一套代码,在开发环境正常,在测试环境出现问题,这时除了检查服务器设置,还需要比对开发环境与测试环境的数据库表结构是否存在差异。找到差异后需要更新测试环境数据库表结构直到开发与测试环境的数据库表结构一致。

我们可以使用mysqldiff工具来实现比对数据库表结构及获取更新结构的sql语句。

1.mysqldiff安装方法

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

安装以后执行查看版本命令,如果能显示版本表示安装成功

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 查看版本

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.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python比较两个数据库表_mysql如何比对两个数据库表结构的方法相关推荐

  1. mariadb mysql表_mysql/mariadb学习记录——创建删除数据库、表的基本命令

    查看已有的数据库: mysql>show databases;+--------------------+ | Database | +--------------------+ | infor ...

  2. 怎么查找表_MySQL索引是怎么支撑千万级表的快速查找?

    前言 在 MySQL 官方提到,改善操作性能的最佳方法 SELECT在查询中测试的一个或多个列上创建索引.索引条目的作用类似于指向表行的指针,从而使查询可以快速确定哪些行与WHERE子句中的条件匹配, ...

  3. delete 会不会锁表_MySQL的insert into select 引发锁表

    上周五HaC我要上线,有一个脚本需要执行,执行前需要备份一个表. 运维大佬:"这个表的备份为什么要这么久,,??" 1秒过去了--2秒过去了-- 期间运营反馈系统出现大量订单超时情 ...

  4. 如何用mysql创建orders表_MySQL学习十四创建和操纵表

    摘要: 本篇博客仅作为笔记,如有侵权,请联系,立即删除(网上找博客学习,然后手记笔记,因纸质笔记不便保存,所以保存到网络笔记). 本博讲述表的创建.更改和删除的基本知识. 一.创建表 MySQL不仅用 ...

  5. mysql如何恢复单表_MySQL如何恢复单库或单表,以及可能遇到的坑

    前言: MySQL 逻辑备份工具最常用的就是 mysqldump 了,一般我们都是备份整个实例或部分业务库.不清楚你有没有做过恢复,恢复场景可能就比较多了,比如我想恢复某个库或某个表等.那么如何从全备 ...

  6. 虚拟机mysql创建一个表_MySQL:创建、修改和删除表

    其实对很多人来说对于SQL语句已经忘了很多,或者说是不懂很多,因为有数据库图形操作软件,方便了大家,但是我们不能忘记最根本的东西,特别是一些细节上的东西,可能你用惯了Hibernate,不用写SQL语 ...

  7. mysql数据库如何创建冗余小的表_mysql – Hibernate创建冗余的多对多表

    在开发我的Spring Boot应用程序时,我不得不放弃我的数据库并让Hibernate使用hibernate.hbm2ddl.auto = update再次生成它.之后我想确保它完成了我想做的所有事 ...

  8. mysql数据库元表_mysql中元数据库information_schema学习之TABLES表

    在information_schema数据库中的表都只是只读的,不能进行更新.删除和插入操作,也不能加触发器,因为它们实际只是一个视图,不是基本表,没有关联的文件. 在information_sche ...

  9. mysql存储过程查询所有表_mysql存储过程利用游标查询每个数据库的所有表

    DELIMITER $ DROP PROCEDURE listAllDB; CREATE PROCEDURE listAllDB() BEGIN DECLARE no_more_record INT ...

最新文章

  1. 设计模式-创建型-抽象工厂
  2. MySql增加字段、删除字段、修改字段名称、修改字段类型
  3. [深入学习C#]LINQ查询表达式详解(2)——查询表达式的转换
  4. 为什么jsp的form表单不能跳转_UI设计干货分享:设计语言 - 表单(登录/注册)...
  5. 无向带权图的存储结构_每天5分钟用C#学习数据结构(27)图 Part 8
  6. Asp.net 在线转Flv
  7. 《Python黑客编程之极速入门》正式开课
  8. 用聚宽数据排一排商誉雷(附结果)
  9. linux查看设备pid vid,Linux设备PID VID详细说明
  10. 医学图像笔记(八)窗宽窗位
  11. python:计算四分位距IQR
  12. 《可以量化的管理学》绪论
  13. mac序列号生成主板号_如何查找Mac的序列号(即使您没有Mac也是如此)
  14. 修约函数,四舍六进五单双 的修约规则,给有需要的朋友参考
  15. 封装PC端使用海康插件播放摄像头直播流(基于VUE)
  16. Java集合--阻塞队列(LinkedBlockingQueue)
  17. 如何优雅地弄好PCB丝印
  18. Win10安装驱动后,无法连接打印机柯尼卡美能达 bizhub 363
  19. 【工具集:在线解方程、自动解题、科学计算】
  20. 4款堪称神器的必备高效率办公工具!

热门文章

  1. 【Java数据结构与算法】第十七章 二分查找(非递归)和分治算法(汉诺塔)
  2. java并发AtomicIntegerArray
  3. MIS 740: Software Concepts Use different GUI components i
  4. 【C#】三种结构:顺序、分支(if、switch、条件运算符)、循环
  5. (办公)eclipse连接github cannot open git-upload-pack(git-receive-pack)
  6. JavaScript-12(脚本化CSS)
  7. thread_LockSupport
  8. Powershell实例小结(服务管理)
  9. 【ExtJS实践】之五 :常用语句及脚本备忘
  10. PostgreSQL 空间处理函数