PostgreSQL Veritabanını geri yüklerken ayrıcalık sorunlarını çözme


105

Postgres Veritabanı için temiz, sahipsiz bir yedeği komutla attım

pg_dump sample_database -O -c -U

Daha sonra veritabanını geri yüklediğimde

psql -d sample_database -U app_name

Ancak, verileri geri yüklememi engelleyen birkaç hatayla karşılaştım:

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

SQL'in pg_dumpürettiği düz metinleri araştırdım ve SQL içerdiğini buldum

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

Sanırım nedenleri, kullanıcının şemayı app_namedeğiştirme ayrıcalıklarına sahip olmaması publicve plpgsql.

Bu sorunu nasıl çözebilirim?


5
İhtiyacın yoksa plpgsql, DROP EXTENSION plpgsqlsenden önce pg_dump. Bu, uygulamanızı süper kullanıcı yapmaktan daha güvenlidir ve hataları ( --single-transactionveya kullanırsanız bombaları) görmezden gelmekten daha kullanışlıdır -v ON_ERROR_STOP=1. Bu bilinen bir sorundur [Postgres geliştiricileri tarafından ayrıntılı olarak tartışılmıştır | postgresql.org/message-id/… ancak 9.3'ten itibaren düzeltilmedi.
Mark E. Haase

Yanıtlar:


63

Sorunu çözmek için uygun sahiplik izinlerini atamalısınız. Belirli kullanıcılar için izinle ilgili tüm sorunları çözmesi gereken aşağıdakileri deneyin, ancak yorumlarda belirtildiği gibi bu, üretimde kullanılmamalıdır:

root@server:/var/log/postgresql# sudo -u postgres psql
psql (8.4.4)
Type "help" for help.

postgres=# \du
               List of roles
    Role name    | Attributes  | Member of
-----------------+-------------+-----------
 <user-name>    | Superuser   | {}
                 : Create DB
 postgres       | Superuser   | {}
                 : Create role
                 : Create DB

postgres=# alter role <user-name> superuser;
ALTER ROLE
postgres=#

Bu nedenle, bir Süper kullanıcı hesabı altındaki veritabanına bağlanın sudo -u postgres psqlve bir ALTER ROLE <user-name> Superuser;açıklama yürütün .

Bunun çok siteli barındırma sunucusunda en iyi çözüm olmadığını unutmayın, bu nedenle bireysel roller atamaya bakın: https://www.postgresql.org/docs/current/static/sql-set-role.html ve https : //www.postgresql.org/docs/current/static/sql-alterrole.html .


28
bunu süper kullanıcı olmadan yapmanın bir yolu var mı?
Travis Webb

17
"uygun sahiplik izinlerini atamalıdır" ve "<kullanıcı adı> süper kullanıcı rolünü değiştir" uyumlu değildir. Uygun sahiplik app_user, bunun süper kullanıcı olmadığı anlamına gelir .
Mark E. Haase

@mehaase lütfen olumsuz oylama yerine yanıtın ifadesini güncelleyin.
Daniel Sokolowski

5
IMHO bu bir çözüm değil, üretimde kaçınılması gereken geçici çözümdür.
Dmytriy Voloshyn

6
Normal bir kullanıcı yapmak kötü bir önerisuperuser
Evren Yurtesen

56

AWS RDS kullanıcıları bunu alıyorsanız bunun nedeni süper kullanıcı olmamanız ve aws belgelerine göre bir süper kullanıcı olamamanızdır. Bu hataları görmezden gelmem gerektiğini fark ettim.


5
Bu hata, geri yüklemenin benim için tamamlanmasını engelliyor (AWS RDS pg_restore). Bu hataları görmezden gelmek için herhangi bir ipucu var mı?
avjaarsveld

PS pg_restore için -e veya --exit-on-error kullanmadım
avjaarsveld

7
Buldum ki, RDS'de sorun COMMENT ON EXTENSIONdeğil CREATE EXTENSION. Yorumları kaldırın ve iyi olmalısınız.
pkoch

@pkoch Google Cloud Storage ile aynı.
UZANTIYLA

25

Google Cloud Platform kullanan kişiler için herhangi bir hata içe aktarma işlemini durdurur. Kişisel olarak, verdiğim pg_dump komutuna bağlı olarak iki farklı hatayla karşılaştım:

1- The input is a PostgreSQL custom-format dump. Use the pg_restore command-line client to restore this dump to a database.

DB'nizi düz olmayan bir metin biçiminde dökmeye çalıştığınızda oluşur. Örneğin, komutta -Fp veya --format = düz parametresi bulunmadığında. Ancak, komutunuza eklerseniz, aşağıdaki hatayla karşılaşabilirsiniz:

2- SET SET SET SET SET SET CREATE EXTENSION ERROR: must be owner of extension plpgsql

Bu, GCP belgelerinde sağlanan komutu , bu mevcut konu başlığındaki ipuçlarını veya buradaki Google Postgres ekibinin tavsiyelerini izleyerek düzeltemediğim bir izin sorunudur . Aşağıdaki komutu vermeniz önerilir:

pg_dump -Fp --no-acl --no-owner -U myusername myDBName > mydump.sql

Benim durumumda hile yapan tek şey döküm dosyasını manuel olarak düzenlemek ve plpgsql ile ilgili tüm komutları yorumlamaktı.

Umarım bu, GCP'ye bağımlı ruhlara yardımcı olur.

Güncelleme :

Özellikle bazı dökümler çok büyük olabileceğinden, dosyayı uzantıların dışında bırakmak daha kolaydır: pg_dump ... | grep -v -E '(CREATE\ EXTENSION|COMMENT\ ON)' > mydump.sql

Plpgsql olarak daraltılabilir: pg_dump ... | grep -v -E '(CREATE\ EXTENSION\ IF\ NOT\ EXISTS\ plpgsql|COMMENT\ ON\ EXTENSION\ plpgsql)' > mydump.sql


1
GCP artık dokümanlarındapg_dump kullanılacak tam komuta sahip :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
Rush

14

Bu durumda büyük olasılıkla hata mesajlarını güvenle yok sayabilirsiniz. Genel şemaya yorum ekleyememek ve plpgsql'yi yüklemek (zaten kurulu olmalıdır) herhangi bir gerçek soruna neden olmayacaktır.

Ancak, tam bir yeniden yükleme yapmak istiyorsanız, uygun izinlere sahip bir kullanıcıya ihtiyacınız olacaktır. Bu, uygulamanızın elbette rutin olarak çalıştırdığı kullanıcı olmamalıdır.


12

Daha kısa cevap: görmezden gelin.

Bu modül, Postgres'in SQL dilini işleyen parçasıdır. Hata, 'heroku pg: pull' gibi bir uzak veritabanının kopyalanmasının bir parçası olarak sıklıkla açılır. SQL işlemcinizin üzerine yazmaz ve sizi bu konuda uyarır.


11

-LBuradan alınan dosyayı belirterek bayrağı pg_restore ile kullanmayı deneyin .pg_dump -Fc

-L liste dosyası --use-list = liste-dosyası

Yalnızca liste dosyasında listelenen arşiv öğelerini geri yükleyin ve bunları dosyada göründükleri sırayla geri yükleyin. -N veya -t gibi filtreleme anahtarları -L ile birlikte kullanılırsa, geri yüklenen öğeleri daha da kısıtlayacaklarını unutmayın.

liste dosyası normalde önceki bir -l işleminin çıktısını düzenleyerek oluşturulur. Satırlar taşınabilir veya kaldırılabilir ve ayrıca satırın başına noktalı virgül (;) yerleştirilerek yorumlanabilir. Örnekler için aşağıya bakın.

https://www.postgresql.org/docs/9.5/app-pgrestore.html

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep -v 'COMMENT - EXTENSION' > pg_restore.list
pg_restore -L pg_restore.list pg.dump

Burada Tersinin doğru olduğunu yalnızca yorumun çıktısını alarak görebilirsiniz:

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep 'COMMENT - EXTENSION' > pg_restore_inverse.list
pg_restore -L pg_restore_inverse.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
--

Yukarıdakilerin doğru olduğunu düşünüyorum, eklentilerle ilgili yorumları hariç tutmak uygulamanızın işlevselliğini etkilemeyecek
Andreas

Bu kesinlikle en iyi cevap, neden basitçe görmezden gelin diyen iki cevabın altında olduğundan emin değilim ...
Dylan

3

AWS kullanan kişiler için COMMENT ON EXTENSIONbu yalnızca süper kullanıcı olarak mümkündür ve belgelerden de bildiğimiz gibi, RDS bulut sunucuları Amazon tarafından yönetilir. Bu nedenle, çoğaltma gibi şeyleri bozmanızı önlemek için, kullanıcılarınız - örneği oluştururken ayarladığınız kök kullanıcı bile - tam süper kullanıcı ayrıcalıklarına sahip olmayacak:

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html

Bir DB örneği oluşturduğunuzda, oluşturduğunuz ana kullanıcı sistem hesabı rds_superuser rolüne atanır. Rds_superuser rolü, PostgreSQL süper kullanıcı rolüne benzer (yerel örneklerde özel olarak postgres olarak adlandırılır), ancak bazı kısıtlamalarla birlikte önceden tanımlanmış bir Amazon RDS rolüdür. PostgreSQL süper kullanıcı rolünde olduğu gibi, rds_superuser rolü DB örneğinizde en fazla ayrıcalığa sahiptir ve bu rolü kullanıcılara DB örneğine en fazla erişime ihtiyaç duymadıkça atamamalısınız.

Bu hatayı düzeltmek --için, şunu içeren SQL satırlarını yorumlamak için kullanın:COMMENT ON EXTENSION


2
Ya omit yorumlar damping zaman: pg_dump --no-comments.
Dmitrii I.

2

Şemayı dökmek, yeniden oluşturmak ve geri yüklemenizi yapmadan önce kullanım için ayrıcalıklar vermek için postgres (admin) kullanıcısını kullanın. Tek komutla:

sudo -u postgres psql -c "DROP SCHEMA public CASCADE;
create SCHEMA public;
grant usage on schema public to public;
grant create on schema public to public;" myDBName

1

Benim için pgAdmin ile bir veritabanı kuruyordum ve veritabanı oluşturulurken sahibini ayarlamak yeterli değildi. 'Genel' şemaya gitmem ve sahibi de oraya ayarlamam gerekiyordu (başlangıçta 'postgres'ti).


0

Sorunu COMMENT ONifadelere indirgeyen (aşağıdaki çeşitli yanıtlara göre) ve döküm dosyasının oluşturulduğu kaynak veritabanına süper kullanıcı erişimi olan kişiler için en basit çözüm, yorumların döküme dahil edilmesini önlemek olabilir. dosya ilk etapta, dökümü yapılan kaynak veritabanından kaldırılarak ...

COMMENT ON EXTENSION postgis IS NULL;
COMMENT ON EXTENSION plpgsql IS NULL;
COMMENT ON SCHEMA public IS NULL;

Gelecekteki dökümler bu durumda COMMENT ONifadeleri içermeyecektir .


1
Rails'de yerel olarak geliştirme (bir şema geçişi çalıştırıldığında otomatik olarak yeni bir döküm dosyası oluşturur), bu çözümler, rails db:resetbir şema çalıştırdığımda her seferinde COMMENT ON satırlarını döküm dosyasından kaldırmak zorunda kalmadan bir AWS RDS postgresql örneğine karşı çalıştırmama olanak tanır göç.
Mark Schneider
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.