如何在导出中排除PL / pgSQL函数?

时间:2012-03-15 07:22:59

标签: postgresql plpgsql pg-dump

我使用以下命令从服务器'数据库转储一些结构,以便能够在我的本地硬盘上创建数据样本。

pg_dump -h myserver.com -U product_user -s -f ./data/base.structure.postgresql.sql -F p -v -T public.* -T first_product.* -T second_product.* -T another_product.locales mydatabase

我需要排除一些模式,否则会出现权限或其他错误。即使我排除了schema public,它也会转储该模式中的所有函数,如下所示:

REVOKE ALL ON FUNCTION gin_extract_trgm(text, internal) FROM PUBLIC;
psql:./data/base.structure.postgresql.sql:8482: ERROR:  function gin_extract_trgm(text, internal) does not exist

我知道这来自PostgreSQL中的全文或相似插件,但我没有使用它,也不需要它在我的机器上,所以我想排除这些功能。

我怎么能这样做?

3 个答案:

答案 0 :(得分:7)

有办法做到这一点。假设您的备份名为backup.dump。你需要做的是:

$ pg_restore -l -f out.txt backup.dump

这将创建一个文件out.txt,其中包含转储中的对象列表。您需要编辑该文件并删除不想要还原的项目。然后你这样做:

$ pg_restore -L out.txt -h your.host.name -U username ....  backup.dump

这将使用文件out.txt(您编辑过的)来选择要恢复的内容。非常方便,特别是在转储很大且无法重新转储数据库的情况下。

答案 1 :(得分:3)

  

我需要排除一些架构

pg_dump切换到排除模式

pg_dump -N schema ...

我引用the manual about pg_dump

  

-N架构
  --exclude-模式=模式

     

不要转储任何与架构模式匹配的架构。根据与-n相同的规则解释模式。 -N可以给出   不止一次排除匹配任何几种模式的模式   ...


使用 PostgreSQL 9.1 或更高版本,您可以选择将扩展程序移动到单独的架构中 - 甚至是预先安装的旧式模块。您可以使用(新式)扩展名注册旧对象,然后使用新工具。使用fulltextsimilarity,您可能需要fuzzystrmatchtsearch2。例如:

为扩展程序fuzzystrmatch注册现有的旧式对象:

CREATE EXTENSION fuzzystrmatch SCHEMA public FROM unpackaged;

删除扩展程序:

DROP EXTENSION fuzzystrmatch;

将其安装到另一个架构:

CREATE EXTENSION fuzzystrmatch SCHEMA my_schema;

当然,如果扩展名正在使用中,则不能删除扩展名 此外,如果您安装到另一个架构,则需要对其正在使用的函数进行架构限定,或者将架构添加到search_path

答案 2 :(得分:0)

除了上述Bartosz的答案外,您还可以使用以下sed命令删除例如在还原之前,请从列表中选择某个功能:

sed -r -i -e '/FUNCTION public plpgsql_call_handler\(\) postgres/d' /var/backup/${DBNAME}.list