Bagaimana cara membuat pg_dump melewatkan ekstensi?

16

Ini pada 9.3 tapi saya ingat hal-hal serupa terjadi sejak 7.x. Jadi saya membuat database dan menginstal ekstensi plpgsql ke dalamnya. Kemudian saya membuat pg_dump dan sebelum mengembalikannya ke dalam databse saya pastikan juga memiliki ekstensi plpgsql. Kemudian ketika memulihkan ini terjadi:

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

Saya membuat banyak skrip dan cukup penting bagi saya bahwa pg_restore mengembalikan 0, jadi fakta bahwa saya bisa mengabaikan ini tidak ada gunanya. Yang membingungkan saya adalah bahwa IIRC saya perlu membuat ekstensi sebagai pengguna master postgres, jadi saya tidak tahu mengapa semua hal EXTENSION ini berakhir di dump saya. Lagi pula, saya bukan pemilik bahasa / ekstensi?

Lagi pula, saya akan berterima kasih atas saran bagaimana menyingkirkan ini. Harap dicatat, bahwa saya sadar bagaimana switch -l / -L bekerja. Namun ini tampaknya terlalu banyak upaya untuk memperbaiki hanya satu komentar ekstensi sederhana.

Jacek Prucia
sumber
3
FWIW, ini telah dilaporkan tahun lalu dan dibahas sebagai bug # 8695 .
Daniel Vérité

Jawaban:

8

Bagi siapa pun yang mencari solusinya, membatasi pg_restoreskema tertentu telah membantu saya mengatasi bug ini. Lihat /programming//a/11776053/11819

nfelger
sumber
Saya masih memiliki masalah dengan ekstensi ketika saya menggunakan -nbendera
Ligemer
5

Anda dapat melakukan

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

itu yang saya gunakan untuk mengimpor ke google cloud sql dengan postgres.

edit: menambahkan tanda 'mulai dari garis' untuk tidak mengecualikan baris yang berisi teks literal ini.

Ren
sumber
2
yang mungkin menghapus catatan yang berisi teks itu, tidak mungkin terjadi, tetapi Anda akan memiliki skema yang rusak dengan kendala yang hilang (seperti yang ditambahkan di akhir foto). Saya akan mengawali "-" alih-alih menghapus, dan juga mempertimbangkan kasus 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

Gunakan -Lbendera dengan pg_restore setelah mengambil dump dalam format file khusus.

-L --use-list =list-file
list-file

Pulihkan hanya elemen arsip yang didaftar list-file, dan pulihkan sesuai urutan yang muncul di file. Perhatikan bahwa jika memfilter sakelar seperti -natau -tdigunakan dengan -L, sakelar tersebut akan membatasi item yang dipulihkan.

list-filebiasanya dibuat dengan mengedit output dari -loperasi sebelumnya . Garis dapat dipindahkan atau dihapus, dan juga dapat dikomentari dengan menempatkan tanda titik koma ( ;) di awal baris. [...]

Referensi: pg_restore (Dokumentasi 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

Di sini Anda dapat melihat Inverse benar:

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
--
Ligemer
sumber
Selamat datang di DBA.SE. Kami menghargai kontribusi Anda. Pertanyaan aslinya adalah tentang PostgreSQL versi 9.3., Tetapi jawaban asli Anda merujuk pada 9.5. Versi: kapan. Saya telah sedikit memodifikasi jawaban Anda untuk mencerminkan hal itu. Namun, bagian dari output bisa menjadi versi spesifik dan mungkin berbeda dalam versi 9.3.
John aka hot2use
0

Untuk hanya mengekspor skema tanpa objek lain dari database Anda dapat menentukan nama skema menggunakan parameter --schema

pg_dump --schema=<schema_name> --schema-only <db_name> 
Mauricio Sánchez
sumber