liquibase 不生成表 DATABASECHANGELOG

Posted

技术标签:

【中文标题】liquibase 不生成表 DATABASECHANGELOG【英文标题】:liquibase does not generate table DATABASECHANGELOG 【发布时间】:2017-06-01 15:35:17 【问题描述】:

我是 liquibase 的新手,我想在生产中的数据库上使用它。 这是一个小型应用程序,但我不想手动创建架构,而是使用更专业的东西,例如 liquibase。

我打算做的是在生产中的当前模式和为新应用程序准备好的新模式之间制作一个变更日志。我已经学习了很多教程,但仍然缺少一些东西。输出 changelog.xml 始终导入所有架构,并且与现有架构没有区别。我看到 liquibase 必须创建表 DATABASECHANGELOG,但我在计算机上看不到它们。

我做了什么:

在生产中转储当前数据库并在开发计算机上导入 从核心项目添加 liquibase.properties 并启动以下命令:mvn clean resources:resources liquibase:generateChangeLog 这生成了一个包含所有架构的master.xml,但没有在DB中创建表DATABASECHANGELOG(注释outputChangeLogFile时创建了表DATABASECHANGELOGLOCK,LOCKED值为0) 从http://www.liquibase.org/databases.html 手动创建了DATABASECHANGELOG 重新运行命令 mvn liquibase:generateChangeLog。还是什么都没有

pom.xml:

<dependencies>
    ...
    <dependency>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-core</artifactId>
        <version>3.5.3</version>
    </dependency>
    <dependency>
        <groupId>org.yaml</groupId>
        <artifactId>snakeyaml</artifactId>
        <version>1.17</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
</dependencies>

 <!-- edited build after 1st comment. Still got the problem -->
<build>
    <plugins>
        <plugin>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-maven-plugin</artifactId>
            <version>$liquibase.version</version>
            <configuration>
                <promptOnNonLocalDatabase>true</promptOnNonLocalDatabase>
                <changeLogFile>$project.build.directory/classes/changelog/db.changelog-master.xml</changeLogFile>
                <propertyFile>src/main/resources/liquibase.properties</propertyFile>
            </configuration>
        </plugin>
    </plugins>
</build>

<!--- old section build, left for history purpose --->
<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-maven-plugin</artifactId>
                <version>$liquibase.version</version>
                <configuration>
                    <promptOnNonLocalDatabase>true</promptOnNonLocalDatabase>
                    <changeLogFile>$project.build.directory/classes/changelog/db.changelog-master.xml</changeLogFile>
                    <propertyFile>src/main/resources/liquibase.properties</propertyFile>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

liquibase.properties:

url=jdbc:mysql://localhost:3306/my_db
username=user
password=pass
driver=com.mysql.jdbc.Driver
outputChangeLogFile=src/main/resources/liquibase/master.xml

注意:注释 outputChangeLogFile 使 liquibase 创建了表 DATABASECHANGELOGLOCK,但只有这个。

maven 输出:

[INFO] ------------------------------------------------------------------------
[INFO] Building -CORE 0.0.2
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- liquibase-maven-plugin:3.5.3:generateChangeLog (default-cli) @ EDI-CORE ---
[INFO] ------------------------------------------------------------------------
[INFO] Parsing Liquibase Properties File
[INFO]   File: src/main/resources/liquibase.properties
[INFO]   'classpath' in properties file is not being used by this task.
[INFO] ------------------------------------------------------------------------
[INFO] Executing on Database: jdbc:mysql://localhost:3306/my_db
[INFO] Generating Change Log from database root@localhost @ jdbc:mysql://localhost:3306/my_db (Default Schema: edi)
INFO 17/01/17 15:01: liquibase: src\main\resources\liquibase\master.xml exists, appending
WARNING 17/01/17 15:01: liquibase: MySQL does not support a timestamp precision of '19' - resetting to the maximum of '6'
WARNING 17/01/17 15:01: liquibase: MySQL does not support a timestamp precision of '19' - resetting to the maximum of '6'
WARNING 17/01/17 15:01: liquibase: MySQL does not support a timestamp precision of '19' - resetting to the maximum of '6'
[INFO] Output written to Change Log file, src/main/resources/liquibase/master.xml
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

【问题讨论】:

您正在使用&lt;pluginManagement&gt;,有关行为的解释和修复,请参阅链接问题。 我现在已经更改了这部分(参见编辑的 pom.xml),但问题仍然存在:没有创建表 Liquibase 提供了从当前工作数据库自动生成模式的工具,在您的情况下它是生产。您只需将工具指向您的数据库,它就会为您创建架构。 ***.com/questions/12449824/…检查这个解决方案。 【参考方案1】:

检查您的配置,如果路径是相对路径。如果标签中的路径值错误,liquibase不会报错,但不会执行sql脚本。

【讨论】:

【参考方案2】:

您当前的问题似乎是:

[我跑的时候]

mvn clean resources:resources liquibase:generateChangeLog

[为什么] liquibase 不生成表 DATABASECHANGELOG?

这个问题的答案是 DATABASECHANGELOG 表被 Liquibase 用来跟踪哪些变更日志已应用于当前表,因此它仅在 update 和类似命令期间创建。命令generateChangeLog 不会运行任何更改日志,因此无需在DATABASECHANGELOG 中创建任何条目。

我怀疑这可能不是您的根本问题。你为什么关心 Liquibase 是否创建DATABASECHANGELOG

这个问题是否被编辑过多次?这里的很多答案都没有解决目前的问题。

我想知道您的真正问题是否更像是“当已经存在一些现有架构时,我如何使用 Liquibase 来管理架构更改”?如果是这样,教程页面“How to set up Liquibase with an Existing Project and Multiple Environments”会在某种程度上回答这个问题。

GL!

【讨论】:

【参考方案3】:

Liquibase 通过变更日志和变更集工作。它首先尝试定位主变更日志文件,然后按顺序执行该文件中提到的变更集。如果您指定了任何数据库连接,则 Liquibase 将使用该凭据,如果没有,则您可以指定 liquibase 数据库凭据。

请参阅 liquibase 的 spring boot 文档以获取属性列表 - https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#data-migration-properties

liquibase 属性示例

  liquibase:
    change-log: classpath:db/changelog/db.changelog-master.xml
    enabled: true
    drop-first: false
    liquibase-tablespace: 
    liquibase-schema: 
    default-schema: 

【讨论】:

【参考方案4】:

由于您在属性文件中指定了 outputChangeLogFile,因此 Liquibase 正在尝试根据您指定的连接为您创建 (via liquibase:generateChangeLog)。尝试在您的 liquibase.prperties 中使用 changeLogFile

url=jdbc:mysql://localhost:3306/my_db
username=user
password=pass
driver=com.mysql.jdbc.Driver
changeLogFile=src/main/resources/liquibase/master.xml

【讨论】:

【参考方案5】:

它不支持'19'timestamp 精度是关于MySQL 中的Data Type

MySQL 不支持您的Data Type 列用于您的Entity

【讨论】:

【参考方案6】:

仔细检查您的文件是否缩进良好,以及您是否正确编写了诸如 changeSet 之类的标签

【讨论】:

【参考方案7】:

据我所知(我也是新手),表 DATABASECHAGELOG 和 DATABASECHANGELOGLOCK 是由更新选项创建的:mvn liquibase:update

【讨论】:

以上是关于liquibase 不生成表 DATABASECHANGELOG的主要内容,如果未能解决你的问题,请参考以下文章

仅使用 databasechangelog 表生成 liquibase sql 文件

从 MySQL 中的现有表生成更改日志时,liquibase 如何处理自动递增的 PK?

Liquibase 根据表名前缀在 db 上生成更改日志

我可以使用 Liquibase 创建 Hibernate Envers 特定表吗

使用 mvn liquibase:diff 时如何禁用删除表和列?

在重新部署 .ear 文件期间未执行 Liquibase 脚本[关闭]