Подтвердить что ты не робот

Как сделать резервную копию функций только в Postgres

Я хочу сделать резервную копию всех функций в моей базе данных postgres. Как взять резервную копию функций только в Postgres?

4b9b3361

Ответ 1

использовать 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__

Чтобы запустить вывод в другом БД, используйте что-то вроде:

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

Если вы реплицируете функции между такими DB, рассмотрите возможность хранения авторской копии определений функций как SQL script в системе управления версиями, такой как svn или git, желательно упакованной как расширение PostgreSQL. См. расширения для упаковки.

Ответ 2

Вы не можете сказать 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