【问题标题】:How to take backup of functions only in Postgres如何仅在 Postgres 中备份功能
【发布时间】:2012-11-25 07:57:03
【问题描述】:

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

【问题讨论】:

    标签: sql postgresql postgresql-9.1


    【解决方案1】:

    使用pg_getfunctiondef;见system information functions。 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 脚本存储在 svn 或 git 等修订控制系统中,最好打包为 PostgreSQL 扩展。见packaging extensions。

    【讨论】:

    • 另外我想将这些功能恢复到另一个数据库。我该怎么做??功能只需要恢复
    • @vmb 输出是 SQL 函数定义,因此将它们通过管道传输到 psql。请参阅更新的答案。更好的是,创建一个扩展并将它们打包在其中。
    • 应该注意的是,pg_get_functiondef('proc_name'::regproc) 不会转储函数的权限(GRANT 和 REVOKE 语句),这有时可能被视为函数的一部分定义。
    • 这个答案很棒:到目前为止我看过的最好的选择。它帮助我们将近 400 个函数转储到可靠的备份文件中,并用于修订历史记录。为此,在查询的末尾,我添加了一个订单:ORDER BY pg_get_functiondef(f.oid) 谢谢!
    • 请注意,这不会转储聚合函数。它将产生一个错误 ("ERROR: X is an aggregate function")。您需要添加 and f.proisagg is false 以排除这些。
    【解决方案2】:

    你不能告诉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
    

    【讨论】:

    • 这是最佳实践!
    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多