我想备份postgres数据库中的所有函数。如何仅在Postgres中备份函数?
答案 0 :(得分:51)
使用pg_getfunctiondef
;见system information functions。 PostgreSQL 8.4中添加了pg_getfunctiondef
。
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';
如果这就是你想要的那样,那么将上面的内容更改为从所有模式中除<{1}} 之外的所有模式都是微不足道的。
在pg_
中,您可以将其转储到包含以下内容的文件:
psql
要在另一个数据库中运行输出,请使用以下内容:
psql -At dbname > /path/to/output/file.sql <<"__END__"
... the above SQL ...
__END__
如果您正在这样的DB之间复制函数,请考虑将函数定义的authorative副本存储为修订控制系统(如svn或git)中的SQL脚本,最好打包为PostgreSQL扩展。请参阅packaging extensions。
答案 1 :(得分:23)
您无法告诉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