1

我正在尝试使用以下参数(默认参数,只是修改路径)运行 liquibase:

liquibase --driver=com.mysql.jdbc.Driver \
     --classpath=mysql-connector-java-5.1.20-bin.jar
     --changeLogFile=changelog.xml \
     --url="jdbc:mysql://localhost/example" \
     --username=root \
     migrate

changelog.xml 非常小:

 <?xml version="1.0" encoding="UTF-8"?>   <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-2.0.xsd">  
 </databaseChangeLog>

我得到的错误是:

Liquibase 更新失败:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 '????????????????' 附近使用正确的语法 在第 1 行 SEVERE 6/5/12 上午 2:42:liquibase:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 '????????????????' 附近使用正确的语法 在第 1 行 liquibase.exception.DatabaseException: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 '????????????????' 附近使用正确的语法 在 liquibase.integration.commandline.CommandLineUtils.createDatabaseObject(CommandLineUtils.java:111) 的第 1 行 liquibase.integration.commandline.Main.doMigration(Main.java:
在 liquibase.integration.commandline.Main.main(Main.java:134) 引起:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 '????????????????' 附近使用正确的语法 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO. java:4028) 在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490) 在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651) 在 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl .java:2677) 在 com.mysql.jdbc.ConnectionImpl.configureClientCharacterSet(ConnectionImpl.java:1943) 在 com.mysql.jdbc.ConnectionImpl。
在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) 在 liquibase.integration.commandline.CommandLineUtils.createDatabaseObject(CommandLineUtils.java:101) ...2 更多

不知道是什么原因造成的。我正在运行 liquibase 2.0.5。

谢谢。

4

2 回答 2

2

我有一个非常相似的问题,'???????????????? 让我怀疑是字符集问题。附加:

  ?useJvmCharsetConverters=true

到 liquibase.properties 中的 url 字符串,正如这篇文章中所建议的,为我修复了它。

我建议您尝试更换:

  --url="jdbc:mysql://localhost/example"

经过:

  --url="jdbc:mysql://localhost/example?useJvmCharsetConverters=true"

在您的 liquibase 命令行中。

希望这可以帮助。

于 2013-03-15T03:04:46.087 回答
0

我怀疑 MySQL 服务器的版本与您使用的 JDBC 客户端 jar 不匹配。现在 5.1 版本已经很老了,MySQL 的最新版本是 5.6

要对此进行调查,您可以使用 liquibase 生成一个 SQL 文件,并尝试使用mysql之类的工具对您的数据库运行它。

liquibase --driver=com.mysql.jdbc.Driver \
     --classpath=mysql-connector-java-5.1.20-bin.jar
     --changeLogFile=changelog.xml \
     --url="jdbc:mysql://localhost/example" \
     --username=root \
     updateSQL

更新

我使用调试运行我的示例,如下所示:

java -jar liquibase.jar --logLevel=debug --logFile=update.log updateSQL

生成如下日志文件:

DEBUG 13/06/12 19:08:liquibase: Unable to load/access Apache Derby driver class to check version
DEBUG 13/06/12 19:08:liquibase: Connected to liquibase@localhost@jdbc:mysql://localhost:3306/liquibase
INFO 13/06/12 19:08:liquibase: Successfully acquired change log lock
DEBUG 13/06/12 19:08:liquibase: Executing QUERY database command: SELECT MD5SUM FROM `DATABASECHANGELOG` WHERE MD5SUM IS NOT NULL
INFO 13/06/12 19:08:liquibase: Reading from `DATABASECHANGELOG`
DEBUG 13/06/12 19:08:liquibase: Executing QUERY database command: SELECT FILENAME,AUTHOR,ID,MD5SUM,DATEEXECUTED,ORDEREXECUTED,TAG,EXECTYPE FROM `DATABASECHANGELOG` ORDER BY DATEEXECUTED ASC, ORDEREXECUTED ASC
..
..

重现了相同的 Apache Derby 消息(在我看来,这就像默认的数据库检查)。

重要的一点是 MySQL 连接消息是否出现在您的日志文件中?

如您所见,Liquibase 然后针对其 DATABASECHANGELOG 表执行 SQL 语句以确定 DB 模式的状态。

于 2012-06-05T20:29:09.547 回答