Para fazer backup apenas de uma tabela, use
COPY
de dentro do banco de dados:COPY user_tbl TO '/path/to/file';
ou
pg_dump
da casca:pg_dump -t user_tbl mydb > user_tbl.sql
Em seguida, solte o banco de dados, restaure sua nova versão, esvazie
user_tbl
e use COPY FROM
para restaurar uma tabela:COPY user_tbl FROM '/path/to/file';
ou restaure o backup com uma tabela do shell com
psql
:psql -f user_tbl.sql mydb
Identifique as tabelas dependentes
Rápido e sujo
Não existe "COPIAR... CASCATA". O método mais simples para identificar tabelas dependentes seria iniciar uma transação, chamar
TRUNCATE tbl CASCADE
e registre os avisos que você recebe:BEGIN;
TRUNCATE user_tbl CASCADE;
NOTICE: truncate cascades to table "tbl1"
NOTICE: truncate cascades to table "tbl2"
NOTICE: truncate cascades to table "tbl3"
Em seguida, reverta a transação - para que nada realmente mude:
ROLLBACK;
Cuidado com isso. Se você
COMMIT
o truncado passa. Lento e seguro
Bem, não realmente "lento", mas o código é muito mais complexo. No entanto, isso não exige um bloqueio exclusivo nas tabelas envolvidas, por isso é muito mais limpo e seguro:
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;
Devoluções:
tbl
------
tbl1
tbl2
tbl3
Eu uso um CTE recursivo (requer PostgreSQL 8.4 ou posterior) na tabela de catálogo
pg_constraint
, porque cada tabela pode ter dependências por sua vez.Use
UNION
, não UNION ALL
para evitar a avaliação múltipla de tabelas que podem estar vinculadas a várias chaves estrangeiras direta ou indiretamente.