Не удается получить блокировку таблицы — возможно, запущен другой экземпляр Flyway

#spring-boot #flyway #cockroachdb

#весенняя загрузка #flyway #cockroachdb

Вопрос:

Я использую интеграцию Spring Boot и Flyway (6.5.5) для запуска обновлений для кластера CockroachDB. Когда несколько экземпляров службы запускаются одновременно, все они пытаются заблокировать flyway_schema_history таблицу для проверки миграции. Однако возникает следующее исключение:

 2020-09-09 00:00:00.013 ERROR 1 --- [           main] o.s.boot.SpringApplication               :
Application run failed org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: 
Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: 
Unable to obtain table lock - another Flyway instance may be running
  

Я не смог найти какое-либо свойство конфигурации для настройки этого. Может быть, кто-то столкнулся с такой же проблемой и как-то решил ее?

Обходной путь: перезапустите службу.

Комментарии:

1. Вы пытаетесь выполнить миграцию из нескольких служб одновременно? Или просто информация?

2. При инициализации контекста приложения компонент Flyway проверяет миграции и применяет их, которые необходимы. Службы развертываются одновременно, так что да, все они пытаются применить миграции.

Ответ №1:

После отладки проблемы она появилась в очень странном поведении Flyway: org.flywaydb.core.internal.database.cockroachdb.CockroachDBTable

 
CockroachDB-specific table.
Note that CockroachDB doesn't support table locks. We therefore use a row in the schema history as a lock indicator;
if another process ahs inserted such a row we wait (potentially indefinitely) for it to be removed before
carrying out a migration.
*/
  

Итак, в моем случае во время применения миграции служба была перезапущена, и эта запись псевдозахвата осталась навсегда.

Обходным путем было удаление «блокировки» вручную:

   installed_rank |             version              |               description                | type |                      script                      |  checksum   |    installed_by    |           installed_on           | execution_time | success
----------------- ---------------------------------- ------------------------------------------ ------ -------------------------------------------------- ------------- -------------------- ---------------------------------- ---------------- ----------
            -100 | d9ab17626a4d66a4d8a89fe9bdca98e9 | flyway-lock                              |      |                                                  |           0 |                    | 2020-09-14 11:25:02.874838 00:00 |              0 |  true
  

Надеюсь, это кому-то поможет.

Создан соответствующий билет:https://github.com/flyway/flyway/issues/2932