mysqldiff对数据库间进行差异比较
mysqldiff对数据库间进行差异比较
Elvis.Xiong 发表于1年前
mysqldiff对数据库间进行差异比较
  • 发表于 1年前
  • 阅读 116
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

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代码 

 收藏代码

  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';  
共有 人打赏支持
粉丝 29
博文 8
码字总数 6819
×
Elvis.Xiong
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: