Untuk mencadangkan satu tabel saja, gunakan COPY
dari dalam basis data:
COPY user_tbl TO '/path/to/file';
atau pg_dump
dari cangkang:
pg_dump -t user_tbl mydb > user_tbl.sql
Kemudian jatuhkan database, pulihkan versi baru Anda, kosongkan user_tbl
dan gunakan COPY FROM
untuk mengembalikan satu tabel:
COPY user_tbl FROM '/path/to/file';
atau pulihkan cadangan dengan satu tabel dari shell dengan psql
:
psql -f user_tbl.sql mydb
Identifikasi tabel bergantung
Cepat dan kotor
Tidak ada yang namanya "COPY ... CASCADE". Metode paling sederhana untuk mengidentifikasi tabel dependen adalah dengan memulai transaksi, panggil TRUNCATE tbl CASCADE
dan catat pemberitahuan yang Anda dapatkan:
BEGIN;
TRUNCATE user_tbl CASCADE;
NOTICE: truncate cascades to table "tbl1"
NOTICE: truncate cascades to table "tbl2"
NOTICE: truncate cascades to table "tbl3"
Kemudian putar kembali transaksi - jadi tidak ada yang benar-benar berubah:
ROLLBACK;
Hati-hati dengan itu. Jika Anda COMMIT
terpotong melewati.
Lambat dan pasti
Yah, sebenarnya tidak "lambat", tetapi kodenya jauh lebih kompleks. Ini tidak mengambil kunci eksklusif pada tabel yang terlibat, jadi jauh lebih bersih dan lebih aman:
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;
Pengembalian:
tbl
------
tbl1
tbl2
tbl3
Saya menggunakan CTE rekursif
(memerlukan PostgreSQL 8.4 atau yang lebih baru) pada tabel katalog pg_constraint
, karena setiap tabel dapat memiliki ketergantungan secara bergantian.
Gunakan UNION
, bukan UNION ALL
untuk menghindari beberapa evaluasi tabel yang mungkin ditautkan dengan beberapa kunci asing secara langsung atau tidak langsung.