2013-03-14 111 views
2

我越瞭解flyway對數據庫遷移的影響,我越喜歡它。flyway mysqldump遷移

我試圖讓遷飛閱讀從mysqldump的-d產生的遷移和我偶然發現了一些奇怪的行爲。

在主頁上,它說

DDL通過mysqldump的出口可以在遷飛路線遷移不變地使用。

我的經驗是有點不同。 你如何使用mysqldump與flyway生成的文件?


我是想:

我嘗試用

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

這並不工作,並給了我一個文件,它看起來像這樣得到的DDL(是的,它是一個來自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 @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 
/*!40103 SET @[email protected]@TIME_ZONE */; 
/*!40103 SET TIME_ZONE='+00:00' */; 
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 
/*!40111 SET @[email protected]@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 */; 

依此類推。

我有遷徙路線設置(簡單的彈簧集成),並且拿起文件。 然而,它沒有做任何事情(不執行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)遷徙路線只執行刪除表,之後停止。

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 TABLE遷徙路線不喜歡的語法

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的東西飛路的輸出會喜歡? 非常感謝你們!

回答

0

Flyway的解析器是特定於DB的。由於您試圖導入到H2中,因此它會嘗試解析H2語法而不是解析mysql語法。導入到MySQL數據庫,你應該很好去。

+0

我有用於測試和生產的MySQL和用於單元測試的H2。我的想法是從生產數據庫中提取DDL並將其用作所有環境的基礎。如果我正確理解你,這是行不通的。這是否意味着我將不得不爲單元測試和V1和所有其他版本生產單獨的腳本。它是否正確? – David 2013-03-15 08:26:10

+0

您可以清理轉儲以使其與H2兼容,並確保將來的遷移使用與兩個DB兼容的語法。或者選擇更好的選擇:在開發環境中使用mysql,並刪除您的產品環境的另一個區別。 – 2013-03-15 10:30:45

+0

這就是我現在所做的,謝謝!我清理了MySQL轉儲。不過,將它轉移到MySQL是有道理的。 – David 2013-03-15 16:32:28