วิธีทำ pg_dump ข้ามส่วนขยาย


16

นี่คือ 9.3 แต่ฉันสามารถจำสิ่งที่ simillar เกิดขึ้นตั้งแต่ 7.x ดังนั้นฉันสร้างฐานข้อมูลและติดตั้งส่วนขยาย plpgsql ลงไป ต่อมาฉันสร้าง pg_dump และก่อนที่จะกู้คืนเป็น databse ฉันแน่ใจว่ามันมีส่วนขยาย 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 ดังนั้นความจริงที่ว่าฉันสามารถเพิกเฉยต่อสิ่งนี้ไม่ได้ผล สิ่งที่เป็นปริศนาของฉันคือ IIRC ที่ฉันต้องการสร้างส่วนขยายในฐานะผู้ใช้ระดับสูงกว่า postgres ดังนั้นฉันจึงไม่ทราบเลยว่าทำไมส่วนขยายทั้งหมดนี้สิ้นสุดลงในการถ่ายโอนข้อมูลของฉัน ท้ายที่สุดฉันไม่ได้เป็นเจ้าของภาษา / ส่วนขยายใช่ไหม

อย่างไรก็ตามฉันจะขอบคุณมากสำหรับคำแนะนำใด ๆ ในการกำจัดสิ่งนี้ โปรดทราบว่าฉันทราบว่าสวิตช์ -l / -L ทำงานอย่างไร อย่างไรก็ตามนี่ดูเหมือนจะเป็นวิธีที่พยายามมากเกินไปที่จะแก้ไขความคิดเห็นส่วนขยายแบบง่าย ๆ เพียงครั้งเดียว


3
FWIW นี้ได้รับการรายงานปีที่ผ่านมาและพูดคุยกันเป็นข้อผิดพลาด #
Daniel Vérité

คำตอบ:


8

สำหรับใครก็ตามที่กำลังมองหาวิธีแก้ปัญหาการ จำกัดpg_restoreสคีมาเฉพาะช่วยให้ฉันแก้ไขข้อผิดพลาดนี้ได้ ดู/programming//a/11776053/11819


ฉันยังคงมีปัญหาเกี่ยวกับส่วนขยายเมื่อฉันใช้-nธง
Ligemer

5

คุณทำได้

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

มันเป็นสิ่งที่ฉันใช้เพื่อนำเข้าสู่ google cloud sql พร้อม postgres

แก้ไข: เพิ่มเครื่องหมายจุดเริ่มต้นของบรรทัดเพื่อไม่รวมบรรทัดที่มีข้อความตัวอักษรนี้


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นั้นเป็นจริง:

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
John aka hot2use

0

ในการเอ็กซ์พอร์ตสกีมาเท่านั้นโดยไม่มีอ็อบเจ็กต์อื่นของฐานข้อมูลคุณสามารถระบุชื่อของสกีมาโดยใช้พารามิเตอร์ --schema

pg_dump --schema=<schema_name> --schema-only <db_name> 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.