Làm thế nào để mở rộng pg_dump?


15

Đây là vào ngày 9.3 nhưng tôi có thể nhớ những thứ simillar xảy ra kể từ 7.x. Vì vậy, tôi tạo cơ sở dữ liệu và cài đặt phần mở rộng plpgsql vào nó. Sau này tôi tạo pg_dump và trước khi khôi phục nó thành cơ sở dữ liệu tôi chắc chắn rằng nó cũng có phần mở rộng plpgsql. Sau đó, khi khôi phục điều này xảy ra:

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

Tôi đang tạo ra một loạt các tập lệnh và điều khá quan trọng đối với tôi là pg_restore trả về 0, vì vậy thực tế là tôi có thể bỏ qua việc này không có tác dụng gì. Điều khiến tôi băn khoăn là IIRC tôi cần tạo tiện ích mở rộng với tư cách là người dùng chính của postgres, vì vậy tôi không biết tại sao tất cả những thứ TUYỆT VỜI này lại kết thúc trong bãi rác của tôi. Rốt cuộc, tôi không phải là chủ sở hữu của ngôn ngữ / phần mở rộng?

Dù sao, tôi rất vui mừng cho bất kỳ đề nghị làm thế nào để thoát khỏi điều này. Xin lưu ý rằng tôi biết cách các công tắc -l / -L hoạt động. Tuy nhiên, điều này dường như là quá nhiều nỗ lực để sửa chỉ một bình luận mở rộng đơn giản.


3
FWIW, điều này đã được báo cáo vào năm ngoái và được thảo luận là lỗi # 8695 .
Daniel Vérité

Câu trả lời:


8

Đối với bất kỳ ai đang tìm kiếm một cách giải quyết, việc giới hạn pg_restoremột lược đồ cụ thể đã giúp tôi khắc phục lỗi này. Xem /programming//a/11776053/11819


Tôi vẫn gặp sự cố với tiện ích mở rộng khi tôi sử dụng -ncờ
Ligemer

5

Bạn có thể làm

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

đó là những gì tôi sử dụng để nhập vào google cloud sql với postgres.

chỉnh sửa: đã thêm 'bắt đầu dòng' dấu mũ để không loại trừ các dòng có chứa văn bản bằng chữ này.


2
có thể xóa bản ghi chứa văn bản đó, không có khả năng xảy ra, nhưng bạn sẽ có một lược đồ bị hỏng với các ràng buộc bị thiếu (vì chúng được thêm vào cuối ảnh chụp nhanh). Tôi muốn tiền tố một "-" thay vì loại bỏ, và cũng có thể xem xét các trường hợp thả 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

Sử dụng -Lcờ với pg_restore sau khi kết xuất ở định dạng tệp tùy chỉnh.

-L - danh sách sử dụng =list-file
list-file

Chỉ khôi phục các thành phần lưu trữ được liệt kê trong list-filevà khôi phục chúng theo thứ tự chúng xuất hiện trong tệp. Lưu ý rằng nếu các công tắc lọc như -nhoặc -tđược sử dụng cùng -L, chúng sẽ tiếp tục hạn chế các mục được khôi phục.

list-filethường được tạo bằng cách chỉnh sửa đầu ra của -lthao tác trước đó . Các dòng có thể được di chuyển hoặc xóa và cũng có thể được nhận xét bằng cách đặt dấu chấm phẩy ( ;) ở đầu dòng. [...]

Tham khảo: pg_restore (Tài liệu 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

Ở đây bạn có thể thấy Nghịch đảo là đúng:

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

Chào mừng đến với DBA.SE. Chúng tôi đánh giá cao sự đóng góp của bạn. Câu hỏi ban đầu là về PostgreSQL phiên bản 9.3., Nhưng câu trả lời ban đầu của bạn là tham khảo phiên bản 9.5. phiên bản. Tôi đã sửa đổi câu trả lời của bạn một chút để phản ánh điều đó. Tuy nhiên, các phần của đầu ra có thể là phiên bản cụ thể và có thể khác trong phiên bản 9.3.
John aka hot2use

0

Để chỉ xuất sơ đồ mà không có bất kỳ đối tượng nào khác của cơ sở dữ liệu, bạn có thể chỉ định tên của lược đồ bằng tham số --schema

pg_dump --schema=<schema_name> --schema-only <db_name> 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.