it-swarm.it

Le migliori pratiche per le modifiche dello schema e le migrazioni dei dati in un database live senza tempi di inattività?

Come si apportano modifiche allo schema in un database live senza tempi di inattività?

Ad esempio, supponiamo che io abbia un database PostgreSQL con una tabella che include vari dati utente come indirizzi e-mail ecc., Tutti associati a utenti specifici. Se volessi spostare gli indirizzi e-mail in una nuova tabella dedicata, dovrei cambiare lo schema e quindi migrare i dati e-mail nella nuova tabella. Come è possibile farlo senza interrompere le scritture nella tabella originale? Sicuramente mentre i dati vengono sovrascritti dalla vecchia tabella a quella nuova, i nuovi dati continuerebbero a essere scritti nella vecchia tabella e verrebbero persi, giusto?

Immagino che questo problema si presenti abbastanza frequentemente, ma non riesco a trovare alcuna soluzione standard per affrontarlo.

Questo articolo affronta il problema ma non ho capito bene il passaggio 3. Dice di scrivere su entrambe le tabelle, quindi di migrare i vecchi dati dalla prima tabella a quella nuova. Come ti assicuri di migrare solo i vecchi dati?

(Uso PostgreSQL su Herok .)

44
Dan Leary

Hai quasi già la tua risposta:

  1. Crea la nuova struttura in parallelo
  2. Inizia a scrivere su entrambe le strutture
  3. Migrare i vecchi dati nella nuova struttura
  4. Scrivi e leggi solo una nuova struttura
  5. Elimina vecchie colonne

Per quanto riguarda passaggio, utilizzare qualcosa del genere (in una transazione):

Inserisci ciò che non c'è ancora:

INSERT INTO new_tbl (old_id, data)
SELECT old_id, data
FROM   old_tbl
WHERE  NOT EXISTS (SELECT * FROM new_tbl WHERE new_tbl.old_id = old_tbl.old_id);

Aggiorna ciò che è cambiato nel frattempo:

UPDATE new_tbl
SET    data  = old.data
USING  old_tbl
WHERE  new_tbl.old_id = old_tbl.old_id
AND    new_tbl.data IS DISTINCT FROM old_tbl.data;

I nuovi dati non verranno toccati, poiché sono identici in entrambi i luoghi.

27