Mysql liquibase无法更新数据库和/或速度非常慢

Mysql liquibase无法更新数据库和/或速度非常慢,mysql,sql,jdbc,liquibase,ddl,Mysql,Sql,Jdbc,Liquibase,Ddl,当我们使用Liquibase执行以下变更集时,我们面临一个非常奇怪的问题: <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.l

当我们使用Liquibase执行以下变更集时,我们面临一个非常奇怪的问题:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.3.xsd">

    <changeSet id="add companyinfo.identifier" author="domi">
        <addColumn tableName="companyinfo">
            <column name="identifier" type="VARCHAR(50)" />
        </addColumn>
    </changeSet>

    <changeSet id="add uk companyinfo.identifier" author="domi">
        <addUniqueConstraint    columnNames="identifier" 
                                tableName="companyinfo" 
                                constraintName="uk_companyinfo_identifier"/>
    </changeSet>

</databaseChangeLog>
当我在笔记本电脑上运行与Liquibase相同的命令时,不是通过JDBC,而是从Sequepro MySql客户端中运行,该客户端连接到上述相同的数据库(瑞士的客户端,美国东海岸的数据库),它在大约15分钟内成功完成,没有任何问题

以下是Liquibase执行的语句:

--  *********************************************************************
--  Update Database Script
--  *********************************************************************
--  Change Log: src/main/resources/db/db.changelog-master.xml
--  Ran at: 5/3/17 7:55 AM
--  Against: XXXX@CCCCC@jdbc:mysql://yyyy.xxxx.net:3306/my_db?characterEncoding=utf8
--  Liquibase version: 3.5.3
--  *********************************************************************

--  Lock Database
UPDATE DATABASECHANGELOGLOCK SET LOCKED = 1, LOCKEDBY = 'xxxxx (192.168.1.24)', LOCKGRANTED = '2017-05-03 07:55:44.564' WHERE ID = 1 AND LOCKED = 0;

--  Changeset db/changelog/db.changelog-companyinfo_identifier.xml::add companyinfo.identifier::domi
ALTER TABLE companyinfo ADD identifier VARCHAR(50) NULL;

INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('add companyinfo.identifier', 'domi', 'db/changelog/db.changelog-companyinfo_identifier.xml', NOW(), 838, '7:b2d3082917bf3ff3aecb6cbc363a5e9c', 'add companyinfo.identifier', '', 'EXECUTED', NULL, NULL, '3.5.3', '3790945685');

--  Changeset db/changelog/db.changelog-companyinfo_identifier.xml::add uk companyinfo.identifier::domi
ALTER TABLE companyinfo ADD CONSTRAINT uk_companyinfo_identifier UNIQUE (identifier);

INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('add uk companyinfo.identifier', 'domi', 'db/changelog/db.changelog-companyinfo_identifier.xml', NOW(), 839, '7:5d98affa45f814b9ad32bc9c954ed32b', 'addUniqueConstraint constraintName=uk_companyinfo_identifier, tableName=companyinfo', '', 'EXECUTED', NULL, NULL, '3.5.3', '3790945685');

--  Release Database Lock
UPDATE DATABASECHANGELOGLOCK SET LOCKED = 0, LOCKEDBY = NULL, LOCKGRANTED = NULL WHERE ID = 1;
据我所知,DB没有与2小时限制相匹配的超时设置:

  • wait_timeout
    设置为28.8K秒(8小时)
  • 交互式超时:28800
  • salve\u net\u超时时间
    :3600(1小时)
  • 连接超时:10
  • 锁定等待超时时间
    :31536000
  • 网络读取超时时间
    :30
  • net\u write\u超时
    :60
  • innodb锁定等待超时:50
我认为有两个问题很有趣:

  • 是什么导致liquibase在两小时后失败
  • 为什么使用liquibase时DDL的执行速度要慢得多
…但也许这两个问题的答案相同


更新:我已经执行了完全相同的maven/liquibase命令,我现在从Jenkins从我的本地env(也连接到同一个远程数据库)触发该命令-猜猜看:它像一个符咒一样工作,一点问题也没有-该命令在大约20分钟内完成

mvn -f pom.xml process-resources -Pupdate-db -Dliquibase.username=xxx -Dliquibase.password=xxxx -Dliquibase.url=jdbc:mysql://yyyy.xxxx.net:3306/my_db:3306/yooture_ci?characterEncoding=utf8

因此,我最后的猜测是,我们的CI基础设施和DB之间一定存在某种导致问题的原因,但是什么呢?它总是有效的,只是在这种情况下不行…

我们终于找到了问题

该问题是由默认AWS NAT配置引起的。说:

如果使用NAT网关的连接空闲5分钟或更长时间 此外,连接超时

它真的很低,而且肯定打破了大多数操作系统的默认配置

mvn -f pom.xml process-resources -Pupdate-db -Dliquibase.username=xxx -Dliquibase.password=xxxx -Dliquibase.url=jdbc:mysql://yyyy.xxxx.net:3306/my_db:3306/yooture_ci?characterEncoding=utf8