Migrazione del Database: Modifiche dello Schema e Deploy senza Downtime
La migrazione del database è il processo di applicazione delle modifiche dello schema in modo sicuro e controllato. Questa guida copre le strategie di migrazione, il deploy senza downtime e i piani di rollback.
Ultimo aggiornamento:Cos'è la Migrazione del Database?
La migrazione del database è un processo controllato utilizzato per cambiare lo schema del database (strutture delle tabelle, indici, vincoli).
Modifiche dello schema: Aggiungere nuova tabella, aggiungere/modificare/eliminare colonna, aggiungere indice, aggiungere foreign key, cambiare tipo di dato.
Rischi: Perdita di dati, downtime, degradazione delle prestazioni, incompatibilità all'indietro.
Obiettivo: Applicare le modifiche dello schema in modo sicuro, ripetibile e reversibile.
Strumenti di Migrazione
Flyway: Strumento di migrazione basato su SQL. File di migrazione versionati (V1__create_users.sql). Supporto Java, Node.js, CLI.
Liquibase: Changelog in formato XML/YAML/JSON/SQL. Supporto rollback, generazione diff, confronto database.
Prisma Migrate: Integrato con Prisma ORM. Genera automaticamente la migrazione da schema.prisma.
Knex.js: Strumento di migrazione Node.js. File di migrazione in JavaScript. Funzioni up e down.
Django/ActiveRecord: Strumenti di migrazione integrati nel framework. Crea automaticamente la migrazione dalle modifiche del modello.
Strategie di Migrazione senza Downtime
Expand and Contract (Parallel Change): 1) Aggiungere nuova colonna/tabella (expand), 2) Aggiornare il codice (supportare colonna nuova e vecchia), 3) Rimuovere colonna vecchia (contract).
Modifiche compatibili all'indietro: Aggiungere nuova colonna (nullable), aggiungere nuova tabella, aggiungere nuovo indice. Queste modifiche non richiedono downtime.
Modifiche breaking: Eliminazione colonna, cambio tipo colonna, rename. Queste modifiche devono essere fatte con il pattern expand-contract.
Feature flags: Mettete il nuovo schema dietro un feature flag. Riducete il rischio con rollout graduale.
Blue-green deployment: Testate il nuovo schema in ambiente parallelo. Cambiate il traffico. Tornate all'ambiente vecchio se c'è problema.
Migrazione dei Dati
Backfill: Rendete i dati esistenti compatibili con il nuovo schema. Processate grandi insiemi di dati con batch processing.
Dual write: Scrivete sia nel vecchio che nel nuovo schema. Mantenete la coerenza dei dati durante il periodo di transizione.
Validazione dei dati: Verificate l'integrità dei dati dopo la migrazione. Conteggio righe, checksum, comparazione campione.
Prestazioni: La migrazione su tabelle grandi crea carico di lock e I/O. Eseguite durante le ore di basso traffico. Usate il processing per chunks.
Piano di Rollback
Down migration: Scrivete la down migration corrispondente (rollback) per ogni up migration. Flyway, Liquibase supportano il rollback.
Backup: Fate un backup completo prima della migrazione. Abbiate la capacità di point-in-time recovery (PITR).
Test: Testate la migrazione nell'ambiente di staging. Usate lo stesso volume di dati e schema della produzione.
Monitoraggio: Monitorate le prestazioni delle query e il tasso di errore dopo la migrazione. Rollback in caso di deviazione anormale.
Comunicazione: Condividete il piano di migrazione con il team. Definite la finestra di manutenzione.
Migliori Pratiche
Controllo versione: Tracciate i file di migrazione con Git. Ogni migrazione deve essere atomica (una singola modifica).
Idempotenza: Eseguire la migrazione più volte deve produrre lo stesso risultato. Usate IF NOT EXISTS, IF EXISTS.
Migrazioni piccole: Dividete i grandi cambiamenti in migrazioni piccole. Ogni migrazione deve essere distribuibile indipendentemente.
Code review: Fate passare i file di migrazione per il code review. Le modifiche dello schema sono critiche e difficili da annullare.
Documentazione: Documentate lo scopo e l'impatto di ogni migrazione. Indicate chiaramente i cambiamenti breaking.