文档章节

MySql之自动同步表结构

无毁的湖光-Al
 无毁的湖光-Al
发布于 2017/03/15 10:22
字数 615
阅读 2272
收藏 100

MySql之自动同步表结构

开发痛点

在开发过程中,由于频繁的修改数据库的字段,导致rd和qa环境的数据库表经常不一致。
而由于这些修改数据库的操作可能由多个rd操作,很难一次性收集全。人手工去和qa环境对字段又特别繁琐,容易遗漏。

解决之道

于是笔者就写了一个能够自动比较两个数据库的表结构,并生成alter语句的程序。同时还可以进行配置从而自动这行这些alter语句。详情见github

原理

同步新增的表

如果rd环境新增的表,而qa环境没有,此程序可以直接输出create table语句。原理如下:
addtable
用到的sql主要有:

show table from rd_db;
show create table added_table_name;

同步表结构

如果rd表结构有改动,而qa环境没有,此程序可以直接输出alter语句,原理如下:
synctable
用到的sql有:

select 
	COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,COLUMN_COMMENT,EXTRA 
from 
	information_schema.columns
where 
 	TABLE_SCHEMA='rd_db'
 	and TABLE_NAME = 'rd_table';

比较表结构的代码:

        for (Column column : sourceTable.getColumns().values()) {
            if (targetTable.getColumns().get(column.getName()) == null) {
                // 如果对应的target没有这个字段,直接alter
                String sql = "alter table " + target.getSchema() + "." + targetTable.getTableName() + " add " + column
                        .getName() + " ";
                sql += column.getType() + " ";
                if (column.getIsNull().equals("NO")) {
                    sql += "NOT NULL ";
                } else {
                    sql += "NULL ";
                }
                if (column.getDefaultValue() != null) {
                    sql += "DEFAULT " + SqlUtil.getDbString(column.getDefaultValue()) + " ";
                }
                if (column.getComment() != null) {
                    sql += "COMMENT " + SqlUtil.getDbString(column.getComment()) + " ";
                }
                if (after != null) {
                    sql += "after " + after;
                }
                changeSql.add(sql+";");
            } else {
                // 检查对应的source 和 target的属性
                String sql =
                        "alter table " + target.getSchema() + "." + targetTable.getTableName() + " change " + column
                                .getName() + " ";
                Column sourceColumn = column;
                Column targetColumn = targetTable.getColumns().get(sourceColumn.getName());
                // 比较两者字段,如果返回null,表明一致
                String sqlExtend = compareSingleColumn(sourceColumn, targetColumn);
                if (sqlExtend != null) {
                    changeSql.add(sql + sqlExtend+";");
                }
            }
            after = column.getName();
        }

同步索引结构

如果rd表的索引有改变,而qa环境没有,此程序可以直接输出修改索引语句。原理和上面类似,在此不再赘述。

配置

sourceHost=127.0.0.1:3306
sourceUser=root
sourcePass=123123123
sourceSchema=mystique_db
sourceCharset=utf8

targetHost=127.0.0.1:3306
targetUser=root
targetPass=123123123
targetSchema=mystique_test
targetCharset=utf8

autoExecute=YES //此处表明自动同步

运行

按照上面的模板进行配置 用IDE打开,找到

alchemystar.runner.ShellRunner 

运行其中的main方法即可

生成效果展示

alter table mystique_test.t_test_3 change id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ''
alter table mystique_test.t_test_3 add index (name)
alter table mystique_test.t_test_3 drop index name_id
alter table mystique_test.t_test_3 add id_2 varchar(50) NULL DEFAULT '' COMMENT '' after name

如果打开了自动执行,会自动执行这些语句

github链接

https://github.com/alchemystar/Lancer

码云链接

https://git.oschina.net/alchemystar/Lancer

原文链接

https://my.oschina.net/alchemystar/blog/858996

© 著作权归作者所有

无毁的湖光-Al

无毁的湖光-Al

粉丝 447
博文 31
码字总数 54420
作品 0
浦东
后端工程师
私信 提问
加载中

评论(36)

无毁的湖光-Al
无毁的湖光-Al 博主

引用来自“无毁的湖光-Al”的评论

引用来自“jack_jones”的评论

如果重命名字段,还能用这个工具吗

@jack_jones 可以

引用来自“jack_jones”的评论

是按照顺序对比吗,如果重命名后,并且改变了字段顺序,好像无法识别

引用来自“无毁的湖光-Al”的评论

不是顺序对比,类似map对比,A表的key在B表里面没有,那么key就会构造alter add key。所以名字不一样是无法修改重命名的。只会alter add。里面是按字段名做搜索的。

引用来自“jack_jones”的评论

明白了,好像mysql没对字段重命名做记录,所以无法判断是新建字段还是重命名的
对^_^
jack_jones
jack_jones

引用来自“无毁的湖光-Al”的评论

引用来自“jack_jones”的评论

如果重命名字段,还能用这个工具吗

@jack_jones 可以

引用来自“jack_jones”的评论

是按照顺序对比吗,如果重命名后,并且改变了字段顺序,好像无法识别

引用来自“无毁的湖光-Al”的评论

不是顺序对比,类似map对比,A表的key在B表里面没有,那么key就会构造alter add key。所以名字不一样是无法修改重命名的。只会alter add。里面是按字段名做搜索的。
明白了,好像mysql没对字段重命名做记录,所以无法判断是新建字段还是重命名的
无毁的湖光-Al
无毁的湖光-Al 博主

引用来自“无毁的湖光-Al”的评论

引用来自“jack_jones”的评论

如果重命名字段,还能用这个工具吗

@jack_jones 可以

引用来自“jack_jones”的评论

是按照顺序对比吗,如果重命名后,并且改变了字段顺序,好像无法识别
不是顺序对比,类似map对比,A表的key在B表里面没有,那么key就会构造alter add key。所以名字不一样是无法修改重命名的。只会alter add。里面是按字段名做搜索的。
jack_jones
jack_jones

引用来自“无毁的湖光-Al”的评论

引用来自“jack_jones”的评论

如果重命名字段,还能用这个工具吗

@jack_jones 可以
是按照顺序对比吗,如果重命名后,并且改变了字段顺序,好像无法识别
无毁的湖光-Al
无毁的湖光-Al 博主
@无毁的湖光-Al 不过应该是alter add一个新字段
无毁的湖光-Al
无毁的湖光-Al 博主

引用来自“jack_jones”的评论

如果重命名字段,还能用这个工具吗

@jack_jones 可以
jack_jones
jack_jones
如果重命名字段,还能用这个工具吗
无毁的湖光-Al
无毁的湖光-Al 博主

引用来自“Andy.Lin”的评论

1
😄
Andy.Lin
Andy.Lin
1
无毁的湖光-Al
无毁的湖光-Al 博主

引用来自“六块巧克力”的评论

为代码点赞,但实际工作中非生产环境,sqlyog的架构同步工具非常好用的:)

@六块巧克力看来这一类工具很多呀 :)
MySQL表结构同步工具--mysql-schema-sync

mysql-schema-sync 是一款使用go开发的、跨平台的、绿色无依赖的 MySQL 表结构自动同步工具。 用于将线上(其他环境)数据库结构变化同步到测试(本地)环境! 可以解决多人开发,每人都使用独立...

undefined
2015/10/10
4.7K
2
MySQL和MsSQL实时自动同步

SyncNavigator的基本功能: 自动同步数据/定时同步数据 无论是实时同步/24小时不间断同步,还是根据计划任务(每小时/每日/每周/等)定时自动同步都能完全胜任。 完整支持 Microsoft SQL Serv...

1169334005
2015/12/02
0
0
hidu/mysql-schema-sync

mysql-schema-sync mysql表结构自动同步工具 用于将 数据库结构变化同步到 ! 支持功能: 同步新表 同步字段 变动:新增、修改 同步索引 变动:新增、修改 支持预览(只对比不同步变动) 邮件...

hidu
2015/10/11
0
0
mysql-schema-sync v0.2 mysql表结构自动同步工具

mysql-schema-sync 是一款使用go开发的、跨平台的、绿色无依赖的 MySQL 表结构自动同步工具。 用于解决多个环境数据库表结构不同步问题。 支持功能: 1. 同步 新表 2. 同步 字段 变动:新增、...

undefined
2015/10/11
5.4K
26
Navicat for MySQL 有哪些常用功能

Navicat for MySQL 是一套管理和开发 MySQL 或 MariaDB 的理想解决方案,支持单一程序,可同时连接到 MySQL和MariaDB。这个功能齐备的前端软件为数据库管理、开发和维护提供了直观而强大的图...

Navicat数据库管理工具
2016/06/02
320
1

没有更多内容

加载失败,请刷新页面

加载更多

经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
26分钟前
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
36分钟前
8
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
46分钟前
6
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
49分钟前
6
0
实战项目-学成在线(八)

在前后端分离架构中,服务层被拆分成了很多的微服务,微服务的信息如何管理?Spring Cloud中提供服务注册中心来管理微服务信息。 注册中心作用: 1、微服务数量众多,要进行远程调用就需要知...

lianbang_W
50分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部