Saya telah membuang cadangan pemilik yang bersih dan tidak ada untuk Postgres Database dengan perintah
pg_dump sample_database -O -c -U
Nanti saat saya restore database dengan
psql -d sample_database -U app_name
Namun, saya mengalami beberapa kesalahan yang membuat saya tidak dapat memulihkan data:
ERROR: must be owner of extension plpgsql
ERROR: must be owner of schema public
ERROR: schema "public" already exists
ERROR: must be owner of schema public
CREATE EXTENSION
ERROR: must be owner of extension plpgsql
Saya menggali ke dalam pg_dump
menghasilkan SQL teks biasa dan saya menemukan itu berisi SQL
CREATE SCHEMA public;
COMMENT ON SCHEMA public IS 'standard public schema';
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
Saya pikir penyebabnya adalah pengguna app_name
tidak memiliki hak istimewa untuk mengubah public
skema dan plpgsql
.
Bagaimana saya bisa mengatasi masalah ini?
postgresql
database-backups
rails-postgresql
steveyang.dll
sumber
sumber
plpgsql
, makaDROP EXTENSION plpgsql
sebelum Andapg_dump
. Ini lebih aman daripada menjadikan aplikasi Anda pengguna super, dan lebih nyaman daripada mengabaikan kesalahan (yang gagal jika Anda menggunakan--single-transaction
atau-v ON_ERROR_STOP=1
). Ini adalah masalah yang diketahui, [dibahas panjang lebar oleh para pengembang Postgres | postgresql.org/message-id/… tetapi tidak diperbaiki pada 9.3.Jawaban:
Untuk mengatasi masalah ini, Anda harus menetapkan izin kepemilikan yang sesuai. Coba di bawah ini yang seharusnya menyelesaikan semua masalah terkait izin untuk pengguna tertentu tetapi seperti yang dinyatakan dalam komentar ini tidak boleh digunakan dalam produksi:
Jadi hubungkan ke database di bawah akun Superuser
sudo -u postgres psql
dan jalankanALTER ROLE <user-name> Superuser;
pernyataan.Perlu diingat bahwa ini bukan solusi terbaik di server hosting multi-situs, jadi lihatlah menetapkan peran individu sebagai gantinya: https://www.postgresql.org/docs/current/static/sql-set-role.html dan https : //www.postgresql.org/docs/current/static/sql-alterrole.html .
sumber
app_user
adalah tidak super user.superuser
Pengguna AWS RDS jika Anda mendapatkan ini, itu karena Anda bukan pengguna super dan menurut dokumentasi aws Anda tidak bisa menjadi salah satunya. Saya menemukan bahwa saya harus mengabaikan kesalahan ini.
sumber
COMMENT ON EXTENSION
bukanCREATE EXTENSION
. Hapus komentar dan Anda akan baik-baik saja.Bagi orang yang menggunakan Google Cloud Platform, kesalahan apa pun akan menghentikan proses impor. Secara pribadi saya mengalami dua kesalahan berbeda tergantung pada perintah pg_dump yang saya keluarkan:
1-
The input is a PostgreSQL custom-format dump. Use the pg_restore command-line client to restore this dump to a database.
Terjadi ketika Anda mencoba membuang DB Anda dalam format teks non-biasa. Yaitu ketika perintah tidak memiliki parameter -Fp atau --format = plain. Namun, jika Anda menambahkannya ke perintah Anda, Anda mungkin mengalami kesalahan berikut:
2-
SET SET SET SET SET SET CREATE EXTENSION ERROR: must be owner of extension plpgsql
Ini adalah masalah izin yang tidak dapat saya perbaiki menggunakan perintah yang disediakan di dokumen GCP , tips dari utas saat ini, atau mengikuti saran dari tim Google Postgres di sini . Yang merekomendasikan untuk mengeluarkan perintah berikut:
pg_dump -Fp --no-acl --no-owner -U myusername myDBName > mydump.sql
Satu-satunya hal yang melakukan trik dalam kasus saya adalah mengedit file dump secara manual dan mengomentari semua perintah yang berkaitan dengan plpgsql.
Saya harap ini membantu jiwa-jiwa yang bergantung pada GCP.
Pembaruan:
Lebih mudah untuk membuang file yang mengomentari ekstensi, terutama karena beberapa dump bisa sangat besar:
pg_dump ... | grep -v -E '(CREATE\ EXTENSION|COMMENT\ ON)' > mydump.sql
Yang dapat dipersempit menjadi plpgsql:
pg_dump ... | grep -v -E '(CREATE\ EXTENSION\ IF\ NOT\ EXISTS\ plpgsql|COMMENT\ ON\ EXTENSION\ plpgsql)' > mydump.sql
sumber
pg_dump
perintah yang tepat untuk digunakan di dokumen mereka :pg_dump -U [USERNAME] --format=plain --no-owner --no-acl [DATABASE_NAME] \ | sed -E 's/(DROP|CREATE|COMMENT ON) EXTENSION/-- \1 EXTENSION/g' > [SQL_FILE].sql
Anda mungkin dapat dengan aman mengabaikan pesan kesalahan dalam kasus ini. Gagal menambahkan komentar ke skema publik dan menginstal plpgsql (yang seharusnya sudah diinstal) tidak akan menyebabkan masalah nyata.
Namun, jika Anda ingin melakukan penginstalan ulang lengkap, Anda memerlukan pengguna dengan izin yang sesuai. Tentu saja itu seharusnya bukan pengguna yang menjalankan aplikasi Anda secara rutin.
sumber
Jawaban yang lebih singkat: abaikan saja.
Modul ini adalah bagian dari Postgres yang memproses bahasa SQL. Kesalahan akan sering muncul sebagai bagian dari menyalin database jarak jauh, seperti dengan 'heroku pg: pull'. Itu tidak menimpa prosesor SQL Anda dan memperingatkan Anda tentang itu.
sumber
Coba gunakan
-L
bendera dengan pg_restore dengan menentukan file yang diambil daripg_dump -Fc
https://www.postgresql.org/docs/9.5/app-pgrestore.html
Di sini Anda dapat melihat Inverse benar dengan hanya mengeluarkan komentar:
sumber
Untuk orang yang menggunakan AWS ,
COMMENT ON EXTENSION
ini hanya mungkin sebagai pengguna super , dan seperti yang kita ketahui oleh dokumen, instans RDS dikelola oleh Amazon. Dengan demikian, untuk mencegah Anda merusak hal-hal seperti replikasi, pengguna Anda - bahkan pengguna root yang Anda siapkan saat membuat instance - tidak akan memiliki hak superuser penuh:http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html
Untuk memperbaiki kesalahan ini, cukup gunakan
--
untuk mengomentari baris SQL yang berisiCOMMENT ON EXTENSION
sumber
pg_dump --no-comments
.Gunakan pengguna postgres (admin) untuk membuang skema, membuatnya kembali dan memberikan hak istimewa untuk digunakan sebelum Anda melakukan pemulihan. Dalam satu perintah:
sumber
Bagi saya, saya sedang menyiapkan database dengan pgAdmin dan tampaknya pengaturan pemilik selama pembuatan database tidak cukup. Saya harus menavigasi ke skema 'publik' dan mengatur pemilik di sana juga (awalnya 'postgres').
sumber
Untuk orang-orang yang telah mempersempit masalah ke
COMMENT ON
pernyataan (sesuai dengan berbagai jawaban di bawah) dan yang memiliki akses superuser ke database sumber dari mana file dump dibuat, solusi paling sederhana mungkin untuk mencegah komentar dimasukkan ke dump file di tempat pertama, dengan menghapusnya dari database sumber yang dibuang ...Pembuangan masa depan tidak akan menyertakan
COMMENT ON
pernyataan.sumber
rails db:reset
pada instans postgresql AWS RDS tanpa harus menghapus baris KOMENTAR ON dari file dump setiap kali saya menjalankan skema migrasi.