mysqldiff对数据库间进行差异比较

Wesley13
• 阅读 657

mysqldiff对数据库间进行差异比较

  mysqldiff该工具是官方mysql-utilities工具集的一个脚本,可以用来对比不同数据库之间的表结构,或者同个数据库间的表结构 
   如果在windows下,直接下载mysql-utilities安装就可以了,然后运行后,会跑到命令行下: 

1) 基本用法 
   mysqldiff --server1=admin:123456@192.168.79.10 --server2=admin:123456@192.168.79.11 
--difftype=differ test:test 

  这样就比较两个不同库中的数据库test,假设两个库中库名都是test 
也可以比较不同的表 

mysqldiff --server1=user@host1 --server2=user@host2 testdb.table1:anotherdb.anothertable 
     就是使用库名.表名的方式就可以了 

  下面是出来的一个效果 

# mysqldiff --force --server1=root:msandbox@127.0.0.1:21489 --server2=root:msandbox@127.0.0.1:21490 employees:employees 
# WARNING: Using a password on the command line interface can be insecure. 
# server1 on 127.0.0.1: ... connected. 
# server2 on 127.0.0.1: ... connected. 
# Comparing `employees` to `employees`                             [PASS] 
# Comparing `employees`.`departments` to `employees`.`departments`   [FAIL] 
# Object definitions differ. (--changes-for=server1) 

--- `employees`.`departments` 
+++ `employees`.`departments` 
@@ -1,6 +1,6 @@ 
CREATE TABLE `departments` ( 
   `dept_no` char(4) NOT NULL, 
-  `dept_name` varchar(40) NOT NULL, 
+  `dept_name` varchar(256) DEFAULT NULL, 
   PRIMARY KEY (`dept_no`), 
   UNIQUE KEY `dept_name` (`dept_name`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

  可以看到,默认-号代表左边要比较的server1的变化,+号代表右边server2的不同, 
如果要交换,可以使用参数: 
    –changes-for=server2 

  如果要在比较不同的时候,强行继续比较下去,要增加--force选项 

2) 可以生成差异化的SQL,因为方法1)中,只产生了不同的地方,但如为了生产考虑, 
要生成达到server2的脚本,则可以使用参数 
  --difftype=sql, 
则: 
  mysqldiff --server1=admin:123456@192.168.79.10 --server2=admin:123456@192.168.79.11 
--difftype=sql test:test 

mysqldiff的核心是使用INFORMATION_SCHEMA 
Java代码 

 mysqldiff对数据库间进行差异比较

  1. SHOW CREATE TABLE `departments`;  
  2. SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE, AUTO_INCREMENT, AVG_ROW_LENGTH, CHECKSUM, TABLE_COLLATION, TABLE_COMMENT, ROW_FORMAT, CREATE_OPTIONS  
  3.   FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'employees' AND TABLE_NAME = 'departments';  
  4. SELECT ORDINAL_POSITION, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE,  
  5.          COLUMN_DEFAULT, EXTRA, COLUMN_COMMENT, COLUMN_KEY  
  6.   FROM INFORMATION_SCHEMA.COLUMNS  
  7.   WHERE TABLE_SCHEMA = 'employees' AND TABLE_NAME = 'departments';  
  8. SELECT PARTITION_NAME, SUBPARTITION_NAME, PARTITION_ORDINAL_POSITION,  
  9.          SUBPARTITION_ORDINAL_POSITION, PARTITION_METHOD, SUBPARTITION_METHOD,  
  10.          PARTITION_EXPRESSION, SUBPARTITION_EXPRESSION, PARTITION_DESCRIPTION  
  11.   FROM INFORMATION_SCHEMA.PARTITIONS  
  12.   WHERE TABLE_SCHEMA = 'employees' AND TABLE_NAME = 'departments';  
  13. SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_SCHEMA,  
  14.          REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME  
  15.   FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE  
  16.   WHERE TABLE_SCHEMA = 'employees' AND TABLE_NAME = 'departments' AND  
  17.         REFERENCED_TABLE_SCHEMA IS NOT NULL;  
  18. SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE, AUTO_INCREMENT, AVG_ROW_LENGTH, CHECKSUM, TABLE_COLLATION, TABLE_COMMENT, ROW_FORMAT, CREATE_OPTIONS  
  19.   FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'employees' AND TABLE_NAME = 'departments';  
  20. SELECT ORDINAL_POSITION, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE,  
  21.          COLUMN_DEFAULT, EXTRA, COLUMN_COMMENT, COLUMN_KEY  
  22.   FROM INFORMATION_SCHEMA.COLUMNS  
  23.   WHERE TABLE_SCHEMA = 'employees' AND TABLE_NAME = 'departments';  
  24. SELECT PARTITION_NAME, SUBPARTITION_NAME, PARTITION_ORDINAL_POSITION,  
  25.          SUBPARTITION_ORDINAL_POSITION, PARTITION_METHOD, SUBPARTITION_METHOD,  
  26.          PARTITION_EXPRESSION, SUBPARTITION_EXPRESSION, PARTITION_DESCRIPTION  
  27.   FROM INFORMATION_SCHEMA.PARTITIONS  
  28.   WHERE TABLE_SCHEMA = 'employees' AND TABLE_NAME = 'departments';
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这