Liquibase无法生成DATABASECHANGELOG表

11

我是liquibase的新手,想要在生产中使用它来管理数据库。虽然这是一个小应用程序,但与其通过手动创建模式,我希望使用更专业的工具,比如liquibase。

我计划在当前生产环境下的模式和新应用程序所需的模式之间制作一个changelog。我已经按照许多教程的指导操作过了,但似乎还有些缺失。生成的changelog.xml始终导入所有模式,没有体现和现有的差异。我看到liquibase必须创建DATABASECHANGELOG表,但我在我的电脑上找不到它们。

我的操作如下:

  • 将当前生产数据库转储并导入开发计算机
  • 从核心项目添加了liquibase.properties,并运行以下命令:mvn clean resources:resources liquibase:generateChangeLog
  • 它生成了一个包含所有模式的master.xml,但没有在数据库中创建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 :

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

NB: 在评论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] ------------------------------------------------------------------------

你正在使用 <pluginManagement>,请查看链接的问题以了解行为和修复方法。 - Tunaki
我已经修改了这部分(请参见编辑后的pom.xml),但问题仍然存在:没有创建任何表。 - belkor
Liquibase提供了一种工具,可以从当前工作的数据库(在您的情况下是生产环境)自动生成模式。您只需将该工具指向您的数据库,它就会为您创建模式。请查看此解决方案:https://dev59.com/fGcs5IYBdhLWcg3w-YhD。 - Mayur
7个回答

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

0

它不支持 '19'timestamp 精度,这与你在 MySQL 中的 Data Type 有关。

MySQL 不支持你的 Entity 列的 Data Type


0

您当前的问题似乎是:

当我执行

mvn clean resources:resources liquibase:generateChangeLog

为什么Liquibase没有生成DATABASECHANGELOG表?

答案是,DATABASECHANGELOG表用于Liquibase跟踪已应用于当前表的更改日志,因此它仅在update和类似命令期间创建。命令generateChangeLog不运行任何更改日志,因此没有必要在DATABASECHANGELOG中创建任何条目。

我怀疑这可能不是您真正想问的问题。您为什么关心Liquibase是否创建DATABASECHANGELOG呢?

这个问题被编辑了几次吗?这里的许多答案都没有回答当前问题。

我想知道你的真正问题更像是“当已经存在一些现有模式时,如何使用Liquibase管理模式更改”?如果是这样,教程页面“如何在现有项目和多个环境中设置Liquibase”可以在一定程度上回答这个问题。祝好运!

0

检查您的配置,是否为相对路径。如果您在标签中的路径值错误,Liquibase 不会抛出错误,但不会执行任何 SQL 脚本。


0

由于您在属性文件中指定了outputChangeLogFile,Liquibase正在尝试基于您指定的连接创建它{{link1:(通过liquibase:generateChangeLog)}}。请尝试改用changeLogFile在您的liquibase.prperties中:

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

0

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

请查看Spring Boot文档以获取Liquibase属性列表- 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
请仔细检查您的文件是否正确缩进,以及是否正确编写了像changeSet这样的标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接