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 .)
Už máte téměř odpověď:
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á.