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

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


person vmb    schedule 07.12.2012    source источник


Ответы (2)


используйте 1_; см. функции системной информации. 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

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

person Craig Ringer    schedule 07.12.2012
comment
Также я хочу восстановить эти функции на другую базу данных. Как я могу это сделать?. Функции нужно только восстановить - person vmb; 07.12.2012
comment
@vmb На выходе будут определения функций SQL, поэтому направьте их в psql. См. Обновленный ответ. Еще лучше создать расширение и упаковать их в него. - person Craig Ringer; 07.12.2012
comment
Следует отметить, что pg_get_functiondef('proc_name'::regproc) НЕ сбрасывает привилегии функции (операторы GRANT и REVOKE), которые иногда могут рассматриваться как часть определения функции. - person NumberFour; 22.07.2016
comment
Отличный ответ: безусловно, лучший вариант, на который я смотрел. Это помогло нам сбросить почти 400 наших функций в надежный файл резервной копии, а также использовать его для истории изменений. Для этого в конце запроса я добавил заказ: ORDER BY pg_get_functiondef(f.oid) Спасибо! - person nbburn; 02.02.2019

Вы не можете указать pg_dump сбрасывать только функции. Однако вы можете сделать дамп без данных (-s или --schema-only) и отфильтровать его при восстановлении. Обратите внимание на часть --format=c (также -Fc): это создаст файл, подходящий для pg_restore.

Сначала возьмем дамп:

pg_dump -U username --format=c --schema-only -f dump_test your_database

Затем создайте список функций:

pg_restore --list dump_test | grep FUNCTION > function_list

И, наконец, восстановите их (-L или --use-list указывает файл списка, созданный выше):

pg_restore -U username -d your_other_database -L function_list dump_test
person dezso    schedule 07.12.2012
comment
Это лучшая практика! - person Peter Krauss; 23.02.2020