Flyway e Liquibase — Cheat Sheet

Tag: flyway, liquibase, database, migrations, java, spring-boot, devops, sql

Livello: intermedio

TL;DR: Tool di database migration version-controlled per evolvere lo schema in modo tracciabile, ripetibile e sicuro nei team e nelle pipeline CI/CD.

Concetti chiave

Gestione dello schema database versionata all'interno del repository del codice sorgente.

Flyway adotta un approccio SQL-first con script di migrazione versionati, ripetibili e di callback.

Liquibase adotta un approccio basato su changelog dichiarativi agnostici (XML, YAML, JSON) o SQL nativo.

Flyway traccia le migrazioni applicate tramite la tabella di metadati flyway_schema_history.

Liquibase usa due tabelle di tracking: DATABASECHANGELOG e DATABASECHANGELOGLOCK.

Entrambi calcolano un checksum (hash) per ogni script/changeset per rilevare modifiche post-esecuzione.

DATABASECHANGELOGLOCK in Liquibase previene esecuzioni concorrenti in ambienti distribuiti o multi-istanza.

Flyway ordina le migrazioni in base al numero di versione specificato nel nome del file.

Liquibase ordina i changeset in base all'ordine di apparizione nel master changelog, tracciandoli per id/author.

Supporto a migrazioni idempotenti e rollback controllati nelle pipeline automatizzate.

Domande tipiche e risposte pronte

Q: Qual è la differenza principale tra Flyway e Liquibase?R: Flyway privilegia la semplicità con script SQL puri e convenzioni sui nomi dei file; Liquibase offre astrazione dal DBMS tramite formati dichiarativi e supporta nativamente il rollback automatico.

Q: Come viene gestita l'esecuzione concorrente delle migrazioni all'avvio di più repliche?R: Liquibase acquisisce un lock esplicito su DATABASECHANGELOGLOCK; Flyway utilizza i lock a livello di tabella/database a seconda del driver supportato per evitare corse critiche.

Q: Cosa succede se modifico uno script di migrazione già applicato in precedenza?R: Il tool calcola un checksum differente rispetto a quello salvato nella tabella di storico e blocca l'avvio dell'applicazione segnalando un errore di validazione.

Q: Quando preferire Flyway rispetto a Liquibase?R: Preferisco Flyway quando il database target è fisso, il team padroneggia SQL nativo e si vuole minima complessità di configurazione senza astrazioni extra.

Q: Quando preferire Liquibase rispetto a Flyway?R: Scelgo Liquibase quando l'applicazione deve supportare molteplici RDBMS eterogenei o quando i prerequisiti aziendali richiedono rollback strutturati e changelog contestualizzati per ambiente.

Insidie e errori comuni

Modificare uno script SQL già deployato e registrato con il proprio hash, rompendo la validazione.

Dimenticare di impostare un timeout o un unlock manuale quando un'istanza Liquibase muore con il lock attivo.

Eseguire migrazioni lunghe o bloccanti (es. ALTER TABLE su tabelle enormi) durante l'avvio del container in produzione.

Inserire logica di business o migrazione massiva di dati complessi all'interno di script DDL transazionali.

Mancata sincronizzazione delle versioni Flyway in rami Git paralleli, generando conflitti di sequenza numerica.

Snippet e comandiSQL

```-- Convenzione nomi file Flyway: V<Versione>__<Descrizione>.sql

-- V1_0_1__create_users_table.sql

CREATE TABLE users (

id BIGSERIAL PRIMARY KEY,

username VARCHAR(100) NOT NULL UNIQUE,

created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW()

);

Esempio changeset Liquibase in formato YAML

databaseChangeLog:

  • changeSet:

id: 20261022-01

author: udipuorto

changes:

  • createTable:

tableName: users

columns:

  • column:

name: id

type: bigint

autoIncrement: true

constraints:

primaryKey: true

  • column:

name: username

type: varchar(100)

constraints:

nullable: false

unique: true

Esecuzione da CLI Flyway

flyway -url=jdbc:postgresql://localhost:5432/mydb -user=app -password=secret migrate

flyway info

flyway validate

flyway repair

Esecuzione da CLI Liquibase

liquibase --changelog-file=db/changelog/db.changelog-master.yaml update

liquibase status

liquibase rollback-count 1

liquibase release-locks

```

Da ripassare

[ ] Regole di naming e prefissi Flyway (V versionata, U undo, R repeatable).

[ ] Gestione del lock bloccato in Liquibase con il comando release-locks.

[ ] Meccanismo di calcolo e riparazione dei checksum con flyway repair.

[ ] Precondizioni (preConditions) e tag di contesto (context) in Liquibase.

[ ] Strategie di migrazione zero-downtime (pattern expand and contract).

Jarvis Interviews
Jarvis