Chcete-li zálohovat pouze jednu tabulku, použijte COPY
z databáze:
COPY user_tbl TO '/path/to/file';
nebo pg_dump
ze skořápky:
pg_dump -t user_tbl mydb > user_tbl.sql
Poté databázi zahoďte, obnovte svou novou verzi, vyprázdněte user_tbl
a použijte COPY FROM
pro obnovení jedné tabulky:
COPY user_tbl FROM '/path/to/file';
nebo obnovte zálohu pomocí jedné tabulky z prostředí pomocí psql
:
psql -f user_tbl.sql mydb
Identifikujte závislé tabulky
Rychlé a špinavé
Neexistuje nic takového jako "KOPÍROVAT ... KASKÁD". Nejjednodušší metodou k identifikaci závislých tabulek by bylo zahájení transakce, volání TRUNCATE tbl CASCADE
a zaznamenejte si upozornění, která obdržíte:
BEGIN;
TRUNCATE user_tbl CASCADE;
NOTICE: truncate cascades to table "tbl1"
NOTICE: truncate cascades to table "tbl2"
NOTICE: truncate cascades to table "tbl3"
Poté transakci vraťte zpět – takže se vlastně nic nezmění:
ROLLBACK;
S tím opatrně. Pokud COMMIT
zkrácení prochází.
Pomalu a jistě
No, vlastně ne "pomalý", ale kód je mnohem složitější. To však nevyžaduje exkluzivní zámek na příslušných stolech, takže je to mnohem čistší a bezpečnější:
WITH RECURSIVE x AS (
SELECT conrelid::regclass
FROM pg_constraint
WHERE confrelid = 'user_tbl'::regclass
UNION
SELECT p.conrelid::regclass
FROM x
JOIN pg_constraint p ON p.confrelid = x.conrelid
)
SELECT conrelid::text AS tbl
FROM x;
Vrátí:
tbl
------
tbl1
tbl2
tbl3
Používám rekurzivní CTE
(vyžaduje PostgreSQL 8.4 nebo novější) v tabulce katalogu pg_constraint
, protože každá tabulka může mít postupně závislosti.
Použijte UNION
, nikoli UNION ALL
abyste se vyhnuli vícenásobnému vyhodnocování tabulek, které by mohly být přímo nebo nepřímo spojeny s více cizími klíči.