如何仅在Postgres中备份功能

时间:2012-12-07 06:22:21

标签: sql postgresql postgresql-9.1

我想备份postgres数据库中的所有函数。如何仅在Postgres中备份函数?

2 个答案:

答案 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