2012-10-10 3 views
2

방금 ​​flyway를 mysql 데이터베이스가있는 꽤 표준 2.5 스프링 애플리케이션으로 사용하기 시작했습니다. 수 년 동안 생산되어 왔으며 많은 양의 데이터가 있습니다. 동일한 데이터베이스를 동시에 마이그레이션하려는 여러 앱 인스턴스

나는

<bean id="flyway" class="com.googlecode.flyway.core.Flyway" init-method="migrate"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

로 시작시 자동 마이그레이션에 매여 및 JPA (사용) 만든 봄의 퍼시스턴스 유닛 매니저는 JPA 초기화하기 전에 그래서 데이터베이스가 이주 될 것이다 그것에 따라 달라집니다.

잘 작동합니다.

우리 프로덕션 환경에는 우리가 동시에 업데이트하려는 여러 노드가 있습니다. 따라서 장기 실행중인 각 인스턴스는 동일한 마이그레이션을 실행하려고 시도합니다. 이동 경로의 잠금 기능이이를 방지해야합니다.

저는 프로덕션에서 어떤 작업을하기 전에 이러한 것들을 테스트하기를 좋아합니다.

는 스택 추적에서 아래로
Caused by: com.googlecode.flyway.core.exception.FlywayException: Unable to lock metadata table 'schema_version' in schema 'dbschema' 
    at com.googlecode.flyway.core.metadatatable.MetaDataTable.lock(MetaDataTable.java:148) 
    at com.googlecode.flyway.core.migration.DbMigrator$1.doInTransaction(DbMigrator.java:116) 
    at com.googlecode.flyway.core.migration.DbMigrator$1.doInTransaction(DbMigrator.java:114) 
    at com.googlecode.flyway.core.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:54) 
    at com.googlecode.flyway.core.migration.DbMigrator.migrate(DbMigrator.java:113) 
    ... 

깊은이되는 SQLException입니다 : 어떤 두 개의 응용 프로그램 인스턴스가 긴 실행 마이그레이션 (6 분)과 동시에 두 번째 인스턴스가 실패했습니다 잠시 후 즉 시작했을 때 무슨 일이 있었 :

Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
    ... 

본질적으로 시간이 초과 된 것처럼 보입니다.

mysql> show variables like 'innodb_lock_wait_timeout'; 
+--------------------------+-------+ 
| Variable_name   | Value | 
+--------------------------+-------+ 
| innodb_lock_wait_timeout | 120 | 
+--------------------------+-------+ 

이다 : 내가 그것을 이주하려는 된 DB와 잠금 대기 제한 시간을 확인

select * from dbschema.schema_version for update 

와 메타 데이터 테이블을 고정하려고 AFAIK

우리는 MySQL을 사용하고있어 명백한 범인. 그러나 다른 이유로 인해 그러한 일이 발생할 경우 시간 초과가 필요할 수 있으므로 금액을 늘리고 싶지는 않습니다.

마이그레이션 기간 동안 더 높은 값으로 설정하려고 할 수 있습니다. 이 읽기 전용 변수가 될 것으로 보인다 것을 제외하고 : 나는 예에 의해, 장기 실행 마이그레이션있을거야 알고있는 경우

SET innodb_lock_wait_timeout = 240; 
ERROR 1238 (HY000): Variable 'innodb_lock_wait_timeout' is a read only variable 

나는 물론 수는 배포 반 수동으로 할 하나의 인스턴스를 업데이트하고 마이그레이션을 통과 할 때까지 기다린 다음 다른 인스턴스를 업데이트하십시오.

다른 제안 사항이 있습니까?

답변

0

3 가능성이 있습니다 그들은 제한 시간을 초과하지 않도록 당신이 set innodb_lock_wait_timeout at runtime

  • 는 서버 설정
  • 분할의 마이그레이션을 글로벌 innodb_lock_wait_timeout을 증가시킬 수 MySQL의 5.5

    • 이동
  • +0

    이동 경로는 마이그레이션 스크립트를 호출하기 전에 db를 잠그는 것 같습니다.MetaDataTable # lock()이 타임 아웃을 매개 변수로 전달하는 것을 지원하지 않는 한 런타임에서 전역 잠금 대기 시간 초과를 설정하는 것이 불가능하지 않습니까? 클러스터의 다른 모든 인스턴스는 metaDataTable # lock()을 호출하려고 시도하지만 서버의 전역 시간 초과 설정 (50 초)으로 항상 시간 초과됩니다. – dukethrash

    관련 문제