1つのテーブルをバックアップするには、 COPY
>
データベース内から:
COPY user_tbl TO '/path/to/file';
または pg_dump
シェルから:
pg_dump -t user_tbl mydb > user_tbl.sql
次に、データベースを削除し、新しいバージョンを復元して、 user_tbl
を空にします。 COPY FROM
を使用します 1つのテーブルを復元するには:
COPY user_tbl FROM '/path/to/file';
または、 を使用して、シェルから1つのテーブルでバックアップを復元します。 psql
:
psql -f user_tbl.sql mydb
依存するテーブルを特定する
速くて汚い
「COPY...CASCADE」のようなものはありません。依存するテーブルを識別する最も簡単な方法は、トランザクションを開始し、 TRUNCATE tbl CASCADE
を呼び出すことです。 受け取った通知を記録します:
BEGIN;
TRUNCATE user_tbl CASCADE;
NOTICE: truncate cascades to table "tbl1"
NOTICE: truncate cascades to table "tbl2"
NOTICE: truncate cascades to table "tbl3"
次に、トランザクションをロールバックします。実際には何も変更されません。
ROLLBACK;
それに注意してください。 COMMIT
の場合 切り捨てが行われます。
ゆっくりと確実
まあ、実際には「遅い」わけではありませんが、コードははるかに複雑です。ただし、これは関連するテーブルを排他的にロックするわけではないため、はるかにクリーンで安全です:
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;
返品:
tbl
------
tbl1
tbl2
tbl3
再帰CTEを使用しています
(PostgreSQL 8.4以降が必要)カタログテーブル pg_constraint
、各テーブルは順番に依存関係を持つことができるためです。
UNION
を使用します 、 UNION ALL
ではありません 複数の外部キーに直接または間接的にリンクされている可能性のあるテーブルの複数の評価を回避するため。