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.
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.
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.
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.
```-- 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()
);
databaseChangeLog:
id: 20261022-01
author: udipuorto
changes:
tableName: users
columns:
name: id
type: bigint
autoIncrement: true
constraints:
primaryKey: true
name: username
type: varchar(100)
constraints:
nullable: false
unique: true
flyway -url=jdbc:postgresql://localhost:5432/mydb -user=app -password=secret migrate
flyway info
flyway validate
flyway repair
liquibase --changelog-file=db/changelog/db.changelog-master.yaml update
liquibase status
liquibase rollback-count 1
liquibase release-locks
```
[ ] 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).