it-swarm-eu.dev

Je možné pomocí PostgreSQL rychle vytvořit / obnovit databázové snímky?

Nejprve jsem vývojář, ne DBA nebo sysadmin; prosím buďte v pohodě :)

Pracuji na aplikačním pracovním postupu, kde akce jednoho uživatele vyvolá komplexní změny v databázi - vytváření stovek záznamů v některých tabulkách, aktualizace stovek záznamů v jiných atd. Celkem tedy asi 12 tabulek (z ~ 100 ) jsou touto akcí dotčeny. Kvůli složitosti je pro mě velmi těžké ručně vrátit všechny změny, než budu moci spustit další test. Po většinu svého času vývoje mohu jednoduše vložit prohlášení „ROLLBACK“ na konci pracovního postupu, ale když se dostanu ke splnění svých změn, musím vyzkoušet skutečnou věc.

Mám lokální kopii produkční databáze, se kterou mohu pracovat. V mém případě je ukládání a obnovení mezi testy rychlejší než psaní skriptu pro zrušení všech změn. Je to rychlejší, ale stále mě hodně zpomaluje (obnovení trvá na mém stárnutém notebooku asi 20 minut). Existuje nějaký způsob, jak mohu uložit snímek aktuálního stavu databáze a poté jej rychle obnovit?

Je mi zaručeno, že jsem jediný uživatel v systému, a mám přístup root. Výpis databáze je ~ 100 MB, když je tar'ed a gzip'ed. Verze PostgreSQL je 8,3.

Předem děkujeme za jakékoli užitečné nápady.

54
Zilk

Mohli byste použít snímky na úrovni systému souborů, ale to je často docela těžkopádné, vyžaduje speciální systémy souborů a není vždy k dispozici, zejména na stárnoucích laptopech. ;-)

Co takhle vytvořit svůj základní stav jako databázi a poté z něj vytvořit novou databázi pro svůj testovací běh pomocí CREATE DATABASE ... TEMPLATE funkce. Po testu vyhodíte tuto databázi pryč. Pak je vaše rychlostní omezení v podstatě pouze čas na cp -R adresář databáze. To je asi tak rychlé, jak se dostanete bez magie snímku systému souborů.

36
Peter Eisentraut

Použijte hvězdný , je to jako git pro databáze:

Hvězdné umožňuje rychle obnovit databázi, když jste např. psaní migrací databází, přepínání větví nebo zasílání zpráv s SQL. Podporovány jsou PostgreSQL a MySQL (částečně).

12
David Portabella

Pokud vaše databáze běží v Virtualbox , můžete snadno uložit snímky a obnovit snímky stavu databáze i samotného OS během několika sekund (nebo 1 - 2 minuty, pokud opravdu máte hodně dat v databázi nebo OS nebo velmi málo paměti přidělené virtuálnímu stroji) zdarma.

Ve většině případů by bylo nejlepší nainstalovat odlehčený linux (než server Windows) pro provozování virtuálního počítače, na kterém je databáze hostována, protože v notebooku máte málo zdrojů.


Na produkčním webu používám zálohy snímku MediaTemple , abych dosáhl stejného výsledku (ale je to 20 $ za záložní slot a je specifické pro tuto webhostingovou službu, takže se vám nemusí hodit).

5
wildpeaks

Pravděpodobně ne odpověď, na kterou doufáte, ale uvažovali jste o nižší úrovni snímkování - například LVM?

Tuto otázku našel, když se snažil udělat totéž, a skončil pomocí git v datovém adresáři postgresql. Zrušení změn je stejně snadné jako:

git reset --hard
2
user92843

I když musím říci Stellar a git reset --hard je zajímavé řešení, budu mít problém s většími databázemi a testy, a já používám řešení Virtualbox atd., jakkoli se však ve větších testech stanou trochu „problematičtějšími“, když používáte řešení holého kovu atd.

Proto musím zmínit ZFS jako souborový systém, který je v budoucnu zvážit z následujících důvodů, které @Peter Eisentraut také zmínil:

  1. Snímky - zejména při replikaci z Prod na QA/DR můžete pro testy použít stejný „souborový systém“:
#On a replication node, rather stop, snap, restore for a "consistent" backup ;)
su -l -c "/usr/bin/m2ee stop" acw_qa
pg_ctlcluster ${=QA} stop --force
zfs destroy -R $SNAPSHOT
pg_ctlcluster ${=REPLICATION} stop --force
zfs snapshot $SNAPSHOT
pg_ctlcluster ${=REPLICATION} start

zfs destroy $CLONE
zfs clone -o mountpoint=$CLONEDIR $SNAPSHOT $CLONE
rm $CLONEDIR/$CLUSTER/recovery.conf
pg_ctlcluster ${=QA} start
su -l -c "/usr/bin/m2ee start" acw_qa
  1. udělat test, těsně před testem zastavit postgresql, jak je uvedeno výše, zfs snapshot $SNAPSHOT spusťte postgresql, pak se vrátit zpět, zastavte postgresql a jen zfs rollback $SNAPSHOT

  2. Komprese - Postgresql získá v mých databázích typickou kompresi 3: 1, takže můžete provádět spoustu testování více;)

0
Hvisage

Další možností, která by mohla být experimentována, by bylo skutečně uložit kopii datového adresáře postgresql, a pak ji jednoduše přepsat existující adresář kopií, když ji chcete obnovit. Bude vyžadovat více místa na disku, ale určitě bude rychlejší než obnovení ze zálohy. Nejsem si jistý, jestli by to bylo rychlejší než metoda šablony, takže by bylo dobré nejprve udělat nějaké testy.

0
Haroldo_OK