
目录前言migrationCONCURRENTLY造成的原因根本原因现象解决方式方法1官方推荐方法2方法3更稳定前言很多团队在用Flyway PostgreSQL做数据库迁移时都遇到过一个非常诡异的问题flyway migrate一直卡住没有报错数据库 CPU / IO 都很低日志也没有异常看起来就像Flyway 死锁了。如果你的 migration 里用了CONCURRENTLY创建索引那你很可能踩中了 Flyway 的一个经典坑。migration**Migration数据库迁移**在软件开发里指的是用代码的方式管理数据库结构的变更。简单说就是数据库结构的“版本升级”。CONCURRENTLYCONCURRENTLY是 PostgreSQL 里的一个关键字意思是并发执行不锁表最常见用在 创建索引和删除索引 时让数据库在操作期间 仍然可以读写数据。造成的原因1.在线索引flyway卡住2.两个migration 并且都是非事务 SQL典型场景 1️⃣ 第一个 migration 是 非事务 SQL -- flyway:executeInTransactionfalse CREATE INDEX CONCURRENTLY idx_a ON table_a(col); 2️⃣ 第二个 migration 也是 非事务 SQL -- flyway:executeInTransactionfalse CREATE INDEX CONCURRENTLY idx_b ON table_b(col); 运行 flyway migrate 结果 第一条执行成功 第二条开始后一直卡住 不会报错 不会结束 看起来像卡住根本原因Flyway 9 的锁机制Flyway 9.x PostgreSQL 在线索引卡住的根本原因 Flyway schema lock PostgreSQL CONCURRENTLY 需要等待事务 migration 连接未释放 第二个 migration 无限等待现象migration 一直卡住没有报错数据库 CPU、IO 都很低日志也没有任何异常解决方式方法1官方推荐把在线索引放在单独 migration-- flyway:executeInTransactionfalse CREATE INDEX CONCURRENTLY idx_a ON table_a(col);只放一条语句。方法2在 migration 之间加checkpoint migrationV10__index_a.sql V11__noop.sql V12__index_b.sqlV11SELECT 1;方法3更稳定使用flyway.groupfalse避免多个 migration 合并执行。