Я хочу сделать резервную копию всех функций в моей базе данных postgres. Как взять резервную копию функций только в Postgres?
Как сделать резервную копию функций только в Postgres
Ответ 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