如何使 pg_dump 跳过扩展?

Jac*_*cia 19 postgresql postgresql-9.3 pg-dump

这是在 9.3 上,但我记得自 7.x 以来发生过类似的事情。所以我创建了数据库并在其中安装了 plpgsql 扩展。后来我创建了一个 pg_dump,在将它恢复到数据库之前,我确保它也有 plpgsql 扩展名。然后在恢复时会发生这种情况:

pg_restore: creating EXTENSION plpgsql
pg_restore: creating COMMENT EXTENSION plpgsql
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2053; 0 0 COMMENT EXTENSION plpgsql
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql
Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
Run Code Online (Sandbox Code Playgroud)

我正在创建一堆脚本,pg_restore 返回 0 对我来说非常重要,所以我可以忽略这一点这一事实没有任何好处。让我感到困惑的是 IIRC 我需要以 postgres 主用户的身份创建扩展,所以我不知道为什么所有这些扩展的东西最终都在我的转储中。毕竟,我不是语言/扩展的所有者?

无论如何,对于如何摆脱这种情况的任何建议,我将不胜感激。请注意,我知道 -l/-L 开关是如何工作的。然而,仅仅纠正一个简单的扩展注释似乎需要付出太多努力。

小智 10

对于任何寻找解决方法的人来说,限制pg_restore到特定的模式已经帮助我解决了这个错误。见/sf/answers/824323741/


Ren*_*ene 6

你可以做

pg_dump ... | grep -v -E '^(CREATE\ EXTENSION|COMMENT\ ON)' >out.sql
Run Code Online (Sandbox Code Playgroud)

这是我用来用 postgres 导入到谷歌云 sql 的东西。

编辑:添加了“行首”插入符号以不排除包含此文字文本的行。

  • 这可能会删除包含该文本的记录,这不太可能发生,但是您将拥有一个缺少约束的损坏模式(因为它们是在快照末尾添加的)。我会在前面加上一个“--”而不是删除,并且还考虑了 DROP 情况`pg_dump | sed 's/DROP EXTENSION/-- DROP EXTENSION/g' | sed 's/CREATE EXTENSION/-- CREATE EXTENSION/g' | sed 's/COMMENT ON EXTENSION/-- COMMENT ON EXTENSION/g'` (4认同)

小智 5

-L以自定义文件格式进行转储后,将标志与 pg_restore 一起使用。

-L --使用列表=list-file
list-file

仅还原 中列出的那些存档元素list-file,并按照它们在文件中出现的顺序还原它们。请注意,如果过滤开关(例如-n或 )-t与 一起使用-L,它们将进一步限制恢复的项目。

list-file通常是通过编辑先前操作的输出来创建的-l;可以移动或删除行,也可以通过在行开头放置分号 ( ) 来注释掉行。[...]

参考: pg_restore(PostgreSQL 文档 9.3)

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep -v 'COMMENT - EXTENSION' | \
    grep -v 'plpgsql' > pg_restore.list
pg_restore --use-list pg_restore.list pg.dump
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到相反的情况是正确的:

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep 'COMMENT - EXTENSION' | grep 'plpgsql' > pg_restore.list
pg_restore --use-list pg_restore.list pg.dump
--
-- PostgreSQL database dump
--

-- Dumped from database version 9.4.15
-- Dumped by pg_dump version 9.5.14

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


--
-- PostgreSQL database dump complete
--
Run Code Online (Sandbox Code Playgroud)
  • (编辑以将第二个 -v 添加到 grep 过滤器)