2013-03-14 1 views
2

데이터베이스 마이그레이션을 위해 플라이 웨이가 어떻게 작동하는지 이해할수록 좋아집니다.flyway mysqldump migration

나는 flyway에서 mysqldump -d에서 생성 된 마이그레이션을 읽으려고하고 있는데 이상한 행동을 발견했습니다. 홈페이지에

그것은 mysqldump를 내 보낸

DDL은 철새 이동 경로의 이동에 변경 사용할 수 있습니다 말한다.

내 경험이 약간 다릅니다. flyway에서 mysqldump가 생성 한 파일을 어떻게 사용합니까?


내가하려고했던 :

내가이 일을 수행하고 나에게 이런 식으로 뭔가를 보이는 파일을 제공

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 */; 

등등.

나는 flyway 설정 (간단한 스프링 통합)을 가지고 있으며 파일을 선택하고 있습니다.

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) 이동 경로는 드롭 테이블을 실행하고 나중에 중지 : 그러나 그것은 아무것도 (어떤 SQL이 실행되지 않습니다)하지 않습니다.

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

이동 경로 파서는 DB에 따라 다릅니다. H2로 가져 오기를 시도하기 때문에 H2 구문을 구문 분석하려고 시도하지만 mysql 구문은 분석하지 않습니다. 그것을 mysql DB로 가져 오면 좋을 것입니다.

+0

테스트 및 프로덕션 용 MySQL과 유닛 테스트 용 H2가 있습니다. 내 생각은 생산 DB에서 DDL을 추출하여 모든 환경의 기초로 사용하는 것이 었습니다. 내가 너를 올바르게 이해한다면 이것은 효과가 없다. 이것은 V1 및 다른 모든 버전 모두에 대해 단위 테스트 및 생산을위한 별도의 스크립트가 있어야한다는 것을 의미합니까? 이 올바른지? – David

+0

H2와 호환되도록 덤프를 정리하고 차후의 마이그레이션이 두 DB와 호환되는 구문을 사용하도록하십시오. 또는 더 나은 옵션을 찾으십시오 : dev에있는 mysql을 사용하고 다른 환경을 제거하십시오. –

+0

그게 바로 내가 끝내 준 것입니다, 감사합니다! 나는 MySQL 덤프를 청소했다. 하지만 앞으로는 이것을 MySQL로 옮기는 것이 합리적입니다. – David