it-swarm-eu.dev

Doporučené postupy pro změny schématu a migraci dat do živé databáze bez prostojů?

Jak provedete změny schématu v živé databázi bez prostojů?

Například řekněme, že mám databázi PostgreSQL s tabulkou obsahující různá uživatelská data, jako jsou e-mailové adresy atd., Vše spojené s konkrétními uživateli. Pokud bych chtěl přesunout e-mailové adresy do nové vyhrazené tabulky, musel bych změnit schéma a poté migrovat e-mailová data do nové tabulky. Jak by to bylo možné udělat bez zastavení zápisů do původní tabulky? Jistě, když se data přepisují ze staré tabulky do nové, nová data by se i nadále zapisovala do staré tabulky a byla by chybět, že?

Myslím, že tento problém se objevuje docela často, ale nemůžu najít žádné standardní řešení pro jeho řešení.

Tento článek se zabývá tímto problémem, ale krok 3 jsem opravdu nerozuměl. Říká, že má psát do obou tabulek a poté migrovat stará data z první tabulky do nové. Jak zajistíte, že migrujete pouze stará data?

(Používám PostgreSQL na Herok .)

44
Dan Leary

Už máte téměř odpověď:

  1. Vytvořte novou strukturu paralelně
  2. Začněte psát do obou struktur
  3. Migrujte stará data do nové struktury
  4. Pouze psát a číst novou strukturu
  5. Odstraňte staré sloupce

Pokud jde o krok, použijte něco podobného (v jedné transakci):

Vložte, co ještě neexistuje:

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);

Aktualizujte, co se mezitím změnilo:

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;

Nová data se nedotknou, protože jsou na obou místech stejná.

27