使用方法

引入jar包

<dependency>
  <groupId>cn.codeforfun</groupId>
  <artifactId>mysql-migrate</artifactId>
  <version>${版本号}</version>
</dependency>

测试类

package cn.codeforfun.migrate.core;

import cn.codeforfun.migrate.core.diff.DiffResult;
import cn.codeforfun.migrate.core.entity.DatabaseInfo;
import lombok.extern.slf4j.Slf4j;
import org.junit.Ignore;
import org.junit.Test;

import java.sql.SQLException;
import java.util.List;

@Slf4j
public class MigrateTest {

    private static final Integer FROM_PORT = 3306;
    private static final String FROM_HOST = "localhost";
    private static final String FROM_USERNAME = "root";
    private static final String FROM_PASSWORD = "root";
    private static final String FROM_DB = "test";

    private static final Integer TO_PORT = 3306;
    private static final String TO_HOST = "localhost";
    private static final String TO_USERNAME = "root";
    private static final String TO_PASSWORD = "root";
    private static final String TO_DB = "test1";

    /**
     * 显示数据库建表语句
     */
    @Test
    @Ignore
    public void showSql() throws SQLException {
        DatabaseInfo info = new DatabaseInfo(FROM_HOST, FROM_PORT, FROM_USERNAME, FROM_PASSWORD, FROM_DB);
        Migrate migrate = new Migrate().ignoreCharacterCompare();
        List<String> sql = migrate.showSql(info);
        for (String s : sql) {
            System.out.println(s);
        }
    }

    /**
     * 对比数据库
     */
    @Test
    @Ignore
    public void diff() throws SQLException {
        DatabaseInfo from = new DatabaseInfo(FROM_HOST, FROM_PORT, FROM_USERNAME, FROM_PASSWORD, FROM_DB);
        DatabaseInfo to = new DatabaseInfo(TO_HOST, TO_PORT, TO_USERNAME, TO_PASSWORD, TO_DB);
        Migrate migrate = new Migrate().from(from).to(to).ignoreCharacterCompare();
        DiffResult diffResult = migrate.diff();
        List<String> sqlList = diffResult.getSqlList();
        for (String sql : sqlList) {
            System.out.println(sql);
        }
    }

    /**
     * 更新数据库
     */
    @Test
    @Ignore
    public void update() throws SQLException {
        DatabaseInfo from = new DatabaseInfo(FROM_HOST, FROM_PORT, FROM_USERNAME, FROM_PASSWORD, FROM_DB);
        DatabaseInfo to = new DatabaseInfo(TO_HOST, TO_PORT, TO_USERNAME, TO_PASSWORD, TO_DB);
        Migrate migrate = new Migrate().from(from).to(to).ignoreCharacterCompare();
        migrate.update();
    }

}

示例代码

example目录

图片示例

实现原理

分别查询源数据库以及目标数据库链接下的 information_schema 数据库中的信息,根据信息解析成对应的表、函数等结构,再对比差异,拼接成SQL。

其中 :

更新日志

  • 1.3.13

    • 修复 默认值解析错误 王斌 2022-02-14, 09:55

  • 1.3.12

    • 修复 默认值解析错误 王斌 2022-02-09, 10:22

  • 1.3.11

    • 修复 默认值解析错误 王斌 2021-08-24, 16:16

  • 1.3.10

    • 优化 索引导出 王斌 2021-08-10, 09:55

    • 修复 索引导出错误 王斌 2021-08-10, 09:46

  • 1.3.9

    • 修复 5.x 版本sql解释失败 王斌 2021-07-23, 15:05

  • 1.3.8

    • 修复 对比语句中key的生成错误 王斌 2021-07-21, 17:26

    • 修复 建表语句中丢失索引 王斌 2021-07-21, 16:22

  • 1.3.7

    • 修复 对比语句中key的生成错误 王斌 2021-07-12, 16:34

  • 1.3.6

    • 修复 对比语句中key的生成错误 王斌 2021-07-03, 10:58

    • 修复 建表语句中key的生成错误 王斌 2021-07-02, 16:34

  • 1.3.5

    • 修复 唯一索引对比时忽略字段顺序 王斌 2021-06-24, 14:40

  • 1.3.4

    • 修复 key语句生成错误 王斌 2021-06-16, 11:33

  • 1.3.3

    • 优化 jdbcUrl 时区 王斌 2021-06-11, 16:48

    • 修复 key语句生成错误 王斌 2021-06-11, 13:48

  • 1.3.2

    • 修复 key语句生成错误 王斌 2021-05-26, 13:50

  • 1.3.1

    • 修复 生成view语句错误 王斌 2021-05-25, 11:15

  • 1.3.0

    • 修复 对比逻辑重大错误 王斌 2021-04-26, 17:53

  • 1.2.9

    • 更新 Maven依赖 王斌 2021-04-22, 14:03

    • 修复新版本MySQL驱动时间类型不兼容的BUG 王斌 2021-04-22, 13:59

  • 1.2.8

    • 更新 Maven依赖 王斌 2021-03-23, 14:47

    • 修复 新版本MySQL驱动时间类型不兼容的BUG 王斌 2021-03-23, 14:47

  • 1.2.7

    • 修复 创建procedure语句的生成BUG 王斌 2021-03-11, 16:21

  • 1.2.6

    • 添加 显示全库sql 王斌 2021-03-11, 15:36

  • 1.2.5

    • 添加 对比时忽略字符集选项 王斌 2021-01-04, 09:25

    • 修改 将数据库对象传入table/view/function/procedure/trigger中,将表对象传入column/key中 王斌 2020-12-31, 18:14

    • 添加示例代码 王斌 2020-12-30, 17:24

  • 1.2.4

    • 修复 对比字段类型错误 王斌 2020-12-10, 16:10

  • 1.2.3

    • 修复 联合主键SQL生成错误 大胃王 2020/06/15 10:58

  • 1.2.2

    • 修复 外键SQL生成错误 大胃王 2020/06/15 10:14

    • 修复 联合主键SQL生成错误 大胃王 2020/06/15 10:14

  • 1.2.1

    • 修复 生成key的SQL和H2兼容 大胃王 2020/6/14 上午3:31

  • 1.2.0

    • 修复 对比逻辑重大错误 大胃王 2020/05/26 11:48 上午

  • 1.1.9

    • 修复 routine SQL错误 大胃王 2020/05/25 12:00 上午

    • 修复 默认值’CURRENT_TIMESTAMP’错误的在两边加上了引号导致SQL识别错误 大胃王 2020/05/25 11:43 上午

    • 修复 字段默认值和非空判断混淆的BUG 大胃王 2020/05/25 11:42 上午

  • 1.1.8

    • 由于maven中央仓库错误,故重新部署,实际功能和1.1.7相同

  • 1.1.7

    • 优化Routines对比逻辑,忽略不需要进行对比(比如创建人)的属性 大胃王 2020/05/22 17:13 下午

    • SQL解析出错,创建Key时错误的拆分成多个SQL 大胃王 2020/05/22 17:03 下午

  • 1.1.6

    • 删除所有\n字符,替换为空格,防止某些数据库工具软件无法识别换行符,导致SQL执行失败 大胃王 2020/05/22 16:21 下午

  • 1.1.5

    • 修复-字段默认值空和空字符串不相同的BUG 大胃王 2020/05/21 23:26 下午

    • 修复-字段默认值为系统关键字时的错误 大胃王 2020/05/21 23:15 下午

    • 忽略视图的字符集区别 大胃王 2020/05/21 23:10 下午

    • 对比字段无法识别"on update CURRENT_TIMESTAMP" 大胃王 2020/05/21 10:30 下午

    • 修复unique_index对比错误 大胃王 2020/05/21 10:24 下午

    • 数据库连接错误时,返回信息不完整 大胃王 2020/5/11, 3:43 下午

  • 1.1.4

    • 对比function/procedure的时候生成sql错误,begin前面没有换行 大胃王 2020/05/09, 11:04 上午

    • 将sql生成结果的日志改成trace级别 大胃王 2020/05/09, 11:03 上午

  • 1.1.3

    • fix-对比结构时忽略库名 大胃王 2020/04/28, 15:26 下午

  • 1.1.2

    • fix-对比结构时忽略库名 大胃王 2019/12/23, 10:47 上午

  • 1.1.1

    • 优化jar包依赖 大胃王 2019/12/16, 3:45 下午

  • 1.1.0

    • add-忽略DiffResult转换json时无需转换的字段 大胃王 2019/12/12, 4:34 下午

  • 1.0.1

    • fix-没有外键时候生成sql为空的bug 大胃王 2019/12/12, 3:55 下午

  • 1.0.0

    • 添加procedure 大胃王 2019/12/11, 5:48 下午

  • 0.0.4

    • 添加trigger 大胃王 2019/12/11, 3:23 下午

  • 0.0.3

    • 添加function同步功能

    • fix-生成的sql为null的错误 王斌 2019/12/10, 9:45 上午

    • fix-sql不换行导致的执行错误 王斌 2019/12/10, 10:06 上午

  • 0.0.2

    • 修复字段顺序不匹配导致的结构差异化BUG 大胃王 2019/12/7 上午5:20

    • 修复添加字段导致生成SQL出错的BUG 大胃王 2019/12/7 上午5:30

    • 修复先创建key后创建字段导致字段不存在的Bug 大胃王 2019/12/7 上午6:42

  • 0.0.1

    • 初始化仓库

源码地址

反馈和贡献