如何使pg_dump跳过扩展名?


16

这是在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';

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

无论如何,如果有任何建议可以解决这个问题,我将不胜感激。请注意,我知道-l / -L开关的工作方式。但是,这似乎花费了太多精力来纠正一个简单的扩展注释。


3
FWIW,这已于去年报道,并作为bug#8695进行了讨论。
DanielVérité2014年

Answers:



5

你可以做

pg_dump ... | grep -v -E '^(CREATE\ EXTENSION|COMMENT\ ON)' >out.sql

这就是我使用Postgres导入到Google Cloud sql的方式。

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


2
可能会删除包含该文本的记录,这种情况不太可能发生,但是您将拥有一个损坏的架构,其中缺少约束(因为它们是在快照末尾添加的)。我给前缀加上“-”而不是删除,同时考虑了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'
Elvis Ciotti

2

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

-L list-file
--use-list =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 'plpgsql' > pg_restore.list
pg_restore --use-list pg_restore.list pg.dump

在这里您可以看到Inverse为true:

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

欢迎使用DBA.SE。感谢您的贡献。最初的问题是关于PostgreSQL 9.3版的,但是您的原始答案是在参考9.5版。版。我已经稍微修改了您的答案以反映这一点。但是,输出的某些部分可能是特定于版本的,并且在9.3版本中可能有所不同。
约翰aka hot2use

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.