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


43

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 Heroku .)


2
Facebook ha sviluppato uno strumento per farlo per MySQL.
Nick Chammas,

2
K. Scott Allen ha scritto su un sistema per la gestione delle versioni dello schema qui . Ho creato DbUpdater, uno strumento open source per la distribuzione di schemi in base alla versione. Altro qui - http://www.tewari.info/dbupdater
ash

@NickChammas Grazie per averlo condiviso. Ho molte domande al riguardo. Potresti suggerire un tutorial più dettagliato, preferibilmente un video, che spiega cose come il log di bit, gli indici non cluster e risponde a domande come - 1. In che modo la selezione dei dati dalla tabella di origine in un file di output riduce il carico rispetto alla copia alla destinazione tabella direttamente. 2. Quando terminerà la fase di copia? Queste sono solo alcune domande che ho e ho solo iniziato a leggerlo.
Sandeepan Nath,

@SandeepanNath - Siamo spiacenti, non ho familiarità con lo strumento di Facebook e quindi non posso indicarti più risorse. Ho letto un annuncio a riguardo e pubblicato il mio commento anni fa, ma non l'ho mai usato.
Nick Chammas,

Risposte:


27

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 il passaggio 3 , 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 punti.


Ho alcune domande mentre provo a capire lo scenario per il quale hai proposto questa risposta: 1. Le modifiche al codice verranno distribuite insieme all'inizio delle modifiche del db? 2. Perché sarà necessario scrivere ad entrambe le strutture? 3. Perché non è possibile visualizzare prima la nuova struttura e quindi migrare i dati esistenti e quindi distribuire le modifiche al codice che popoleranno la nuova struttura? 4. Perché è necessario scoprire cosa non c'è (la tua prima query)? Stai proponendo l'inserimento in più tentativi?
Sandeepan Nath,

2
@SandeepanNath, per rispondere alla domanda 3 nel tuo commento: perché se (a) apri una nuova struttura, (b) migra i dati su di essa, (c) cambi il tuo codice per scrivere i dati nella nuova struttura anziché nella vecchia, quindi tutti le modifiche ai dati effettuate tra il passaggio b e il passaggio c esistono solo nella vecchia struttura. La domanda era come apportare modifiche allo schema senza tempi di inattività. Leggi di nuovo questa risposta, attentamente.
Wildcard il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.