web-dev-qa-db-ja.com

Postgresでのみ機能のバックアップを取る方法

Postgresデータベース内のすべての機能のバックアップを取得したいのですが、Postgresのみで機能のバックアップを取得するにはどうすればよいですか?

25
vmb

_pg_getfunctiondef_;を使用します システム情報関数 を参照してください。 _pg_getfunctiondef_はPostgreSQL 8.4で追加されました。

_SELECT pg_get_functiondef('proc_name'::regproc);
_

スキーマ内のすべての関数をダンプするには、_pg_catalog_のシステムテーブルをクエリできます。 publicからすべてのものが必要かどうかを言う:

_SELECT pg_get_functiondef(f.oid)
FROM pg_catalog.pg_proc f
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid)
WHERE n.nspname = 'public';
_

上記を変更して、"_pg__で始まるスキーマを除くすべてのスキーマから"に変更するのは簡単です。

psqlでは、これを次のコマンドでファイルにダンプできます。

_psql -At dbname > /path/to/output/file.sql <<"__END__"
... the above SQL ...
__END__
_

別のDBで出力を実行するには、次のようなものを使用します。

_psql -1 -v ON_ERROR_STOP -f /path/to/output/file.sql target_db_name
_

ただし、このようにDB間で関数を複製する場合は、関数定義の正式なコピーを、できればPostgreSQL拡張機能としてパッケージ化されたsvnやgitなどのリビジョン管理システムにSQLスクリプトとして保存することを検討してください。 パッケージ拡張 を参照してください。

53
Craig Ringer

関数のみをダンプするようにpg_dumpに伝えることはできません。ただし、データなしのダンプ(-s)を作成し、復元時にフィルタリングすることができます。 -Fc部分に注意してください。これにより、pg_restoreに適したファイルが生成されます。

まずダンプを取る:

pg_dump -U username -Fc -s -f dump_test your_database

次に、関数のリストを作成します。

pg_restore -l dump_test | grep FUNCTION > function_list

最後にそれらを復元します(-Lは上記で作成されたリストファイルを指定します):

pg_restore -U username -d your_other_database -L function_list dump_test
26
dezso