flyway mysqldump迁移

Posted

技术标签:

【中文标题】flyway mysqldump迁移【英文标题】:flyway mysqldump migration 【发布时间】:2013-03-03 11:39:39 【问题描述】:

我越了解 flyway 如何进行数据库迁移,我就越喜欢它。

我试图让 flyway 读取从 mysqldump -d 生成的迁移,但我偶然发现了一些奇怪的行为。

首页上写着

mysqldump 导出的 DDL 可以在 Flyway 迁移中原样使用。

我的经历有点不同。 mysqldump生成的文件如何与flyway一起使用?


我在尝试什么:

我尝试通过使用来获取 DDL

mysqldump -h host --user=user -p -d --hex-blob databasename > V1__Basic.sql

这确实有效,并给了我一个看起来像这样的文件(是的,它是来自 Activiti 的数据库方案 :)):

-- MySQL dump 10.13  Distrib 5.5.28, for osx10.6 (i386)
--
-- Host: host    Database: database
-- ------------------------------------------------------
-- Server version   5.5.27-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `ACT_GE_BYTEARRAY`   
--

DROP TABLE IF EXISTS `ACT_GE_BYTEARRAY`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `ACT_GE_BYTEARRAY` (
  `ID_` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `REV_` int(11) DEFAULT NULL,
  `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `DEPLOYMENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
  `BYTES_` longblob,
  `GENERATED_` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`ID_`),
  KEY `ACT_FK_BYTEARR_DEPL` (`DEPLOYMENT_ID_`),
  CONSTRAINT `ACT_FK_BYTEARR_DEPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES     `ACT_RE_DEPLOYMENT` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Table structure for table `ACT_GE_PROPERTY`
--

DROP TABLE IF EXISTS `ACT_GE_PROPERTY`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;

等等。

我有 flyway 设置(简单的 spring 集成),它正在拾取文件。 但是它什么也没做(不执行 sql):

INFO  @ 14 Mar 2013 22:34:41,646 @ com.googlecode.flyway.core.command.DbMigrate - Current version of schema "PUBLIC": << Empty Schema >>
INFO  @ 14 Mar 2013 22:34:41,647 @ com.googlecode.flyway.core.command.DbMigrate - Migrating schema "PUBLIC" to version 1
DEBUG @ 14 Mar 2013 22:34:41,649 @ com.googlecode.flyway.core.command.DbMigrate - Successfully completed and committed migration of schema "PUBLIC" to version 1
DEBUG @ 14 Mar 2013 22:34:41,651 @ com.googlecode.flyway.core.command.DbMigrate - Finished migrating schema "PUBLIC" to version 1 (execution time 00:00.002s)

但是,如果我删除第一条 SQL 语句 (DROP TABLE) 之前的所有行,flyway 只会执行 drop 表并在之后停止。

DEBUG @ 14 Mar 2013 22:34:41,698 @ com.googlecode.flyway.core.dbsupport.SqlScript - Found statement at line 1: DROP TABLE IF EXISTS `ACT_GE_BYTEARRAY`
DEBUG @ 14 Mar 2013 22:34:41,698 @ com.googlecode.flyway.core.dbsupport.SqlScript - Executing SQL: DROP TABLE IF EXISTS `ACT_GE_BYTEARRAY`
DEBUG @ 14 Mar 2013 22:34:41,700 @ com.googlecode.flyway.core.command.DbMigrate - Successfully completed and committed migration of schema "PUBLIC" to version 1.1
DEBUG @ 14 Mar 2013 22:34:41,700 @ com.googlecode.flyway.core.command.DbMigrate - Finished migrating schema "PUBLIC" to version 1.1 (execution time 00:00.004s)

如果我删除直到 CREATE TABLEflyway 的所有内容不喜欢语法

ERROR @ 14 Mar 2013 22:45:01,270 @ com.googlecode.flyway.core.command.DbMigrate - Caused by org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "CREATE TABLE ""ACT_GE_BYTEARRAY"" (
  ""ID_"" VARCHAR(64) COLLATE[*] UTF8_BIN NOT NULL DEFAULT '',

我怎样才能得到 mysqldump 的输出到 flyway 喜欢的东西? 非常感谢各位!

【问题讨论】:

【参考方案1】:

Flyway 的解析器是特定于 DB 的。由于您尝试导入 H2,因此它会尝试解析 H2 语法而不是 mysql 语法。将其导入到 mysql 数据库中,您应该一切顺利。

【讨论】:

我有一个用于测试和生产的 MySQL 和一个用于单元测试的 H2。我的想法是从生产数据库中提取 DDL,并将其用作所有环境的基础。如果我理解正确,这是行不通的。这是否意味着我必须为 V1 和所有其他版本的单元测试和生产提供单独的脚本。这是正确的吗? 您可以清理转储,使其与 H2 兼容,并确保未来的迁移使用与两个 DB 兼容的语法。或者选择更好的选择:在 dev 中使用 mysql 并消除与您的 prod 环境的另一个差异。 这就是我现在所做的,谢谢!我清理了 MySQL 转储。不过,将来将其移至 MySQL 确实有意义。

以上是关于flyway mysqldump迁移的主要内容,如果未能解决你的问题,请参考以下文章

使用 mvn flyway:migrate 的 Flyway 迁移给出“迁移 1.0.53 不匹配”错误

Flyway - 迁移到特定版本

flyway 后的 Flyway 迁移错误:基线

从特定版本开始 Flyway 迁移

使用 Flyway 迁移创建用户

创建 jpa 表后的 Flyway 迁移