2015-04-13 12 views
5

Sto cercando di eseguire un comando CREATE INDEX CONCURRENTLY su un database Postgres 9.2. Ho implementato un MigrationResolver come mostrato nel numero 655. Quando questo passaggio di migrazione viene eseguito tramite mvn flyway:migrate o simile, il comando si avvia ma si blocca in modalità di attesa.Migrazione flyway per postgres CREATE INDEX CONCURRENTLY

ho verificato che il comando è in esecuzione tramite il pg_stat_activity tavolo:

test_2015_04_13_110536=# select * from pg_stat_activity; 
datid |  datname   | pid | usesysid | usename | application_name | client_addr | client_hostname | client_port |   backend_start   |   xact_start   |   query_start   |   state_change   | waiting |  state  |                         query 
-------+------------------------+-------+----------+----------+------------------+-------------+-----------------+-------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------+---------+---------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
21095 | test_2015_04_13_110536 | 56695 | 16385 | postgres | psql    |    |     |   -1 | 2015-04-13 11:10:01.127768-06 | 2015-04-13 11:13:08.936651-06 | 2015-04-13 11:13:08.936651-06 | 2015-04-13 11:13:08.936655-06 | f  | active    | select * from pg_stat_activity; 
21095 | test_2015_04_13_110536 | 56824 | 16385 | postgres |     | 127.0.0.1 |     |  52437 | 2015-04-13 11:12:55.438927-06 | 2015-04-13 11:12:55.476442-06 | 2015-04-13 11:12:55.487139-06 | 2015-04-13 11:12:55.487175-06 | f  | idle in transaction | SELECT "version_rank","installed_rank","version","description","type","script","checksum","installed_on","installed_by","execution_time","success" FROM "public"."schema_version" ORDER BY "version_rank" 
21095 | test_2015_04_13_110536 | 56825 | 16385 | postgres |     | 127.0.0.1 |     |  52438 | 2015-04-13 11:12:55.443687-06 | 2015-04-13 11:12:55.49024-06 | 2015-04-13 11:12:55.49024-06 | 2015-04-13 11:12:55.490241-06 | t  | active    | CREATE UNIQUE INDEX CONCURRENTLY person_restrict_duplicates_2_idx ON person(name, person_month, person_year) 
(3 rows) 

un progetto di esempio che riproduce questo problema può essere trovato nel mio github: chrisphelps/flyway-experiment

Il mio sospetto è che la query flyway contro che è idle in transaction impedisce a postgres di procedere con la creazione dell'indice.

Come posso risolvere il conflitto in modo che Postgres proceda con la migrazione? Qualcuno è stato in grado di applicare questo tipo di migrazione a postgres via flyway?

+0

non capisco perché sarebbe stallo, dal momento che l'indice è su un tavolo diverso da quello usato da flyway (schema _versione). Hmmm ... –

+0

Sei riuscito a confermare il comportamento nel repository? – CPhelps

risposta

6

Nel meantime, c'è un Resolver incluso in flyway che cerca un po 'di magia nel nome del file.

basta aggiungere il prefisso 'NT' (per N o- T ransaction) al file di migrazione, i. e.

V01__usual_migration_1.sql

V02__another_migration.sql

NTV03__migration_that_does_not_run_in_transaction.sql

V04__classical_migration_4.sql

ecc

Problemi correlati