Zrzuciłem czystą kopię zapasową bazy danych Postgres bez właściciela za pomocą polecenia
pg_dump sample_database -O -c -U
Później, kiedy przywracam bazę danych za pomocą
psql -d sample_database -U app_name
Jednak napotkałem kilka błędów, które uniemożliwiają mi przywrócenie danych:
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
Zagłębiłem się w pg_dump
generowane przez zwykły tekst SQL i stwierdziłem, że zawiera 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';
Myślę, że przyczyną jest to, że użytkownik app_name
nie ma uprawnień do zmiany public
schematu i plpgsql
.
Jak mogę rozwiązać ten problem?
postgresql
database-backups
rails-postgresql
steveyang
źródło
źródło
plpgsql
, toDROP EXTENSION plpgsql
przed tobąpg_dump
. Jest to bezpieczniejsze niż uczynienie aplikacji superużytkownikiem i jest wygodniejsze niż ignorowanie błędów (które bombardują, jeśli używasz--single-transaction
lub-v ON_ERROR_STOP=1
). Jest to znany problem, [szczegółowo omówiony przez programistów Postgres | postgresql.org/message-id/ ... ale nie naprawiono od 9.3.Odpowiedzi:
Aby rozwiązać ten problem, musisz przypisać odpowiednie uprawnienia własności. Wypróbuj poniższe rozwiązania, które powinny rozwiązać wszystkie problemy związane z uprawnieniami dla określonych użytkowników, ale jak stwierdzono w komentarzach, nie należy tego używać w produkcji:
Połącz się więc z bazą danych na koncie Superuser
sudo -u postgres psql
i wykonajALTER ROLE <user-name> Superuser;
instrukcję.Pamiętaj, że nie jest to najlepsze rozwiązanie na serwerze obsługującym wiele witryn, więc zamiast tego przyjrzyj się przypisywaniu poszczególnych ról: https://www.postgresql.org/docs/current/static/sql-set-role.html i https : //www.postgresql.org/docs/current/static/sql-alterrole.html .
źródło
app_user
to nie super użytkownika.superuser
Użytkownicy AWS RDS, jeśli otrzymujesz to, to dlatego, że nie jesteś superużytkownikiem i zgodnie z dokumentacją aws nie możesz nim być. Odkryłem, że muszę zignorować te błędy.
źródło
COMMENT ON EXTENSION
nie jestCREATE EXTENSION
. Usuń komentarze i powinno być dobrze.W przypadku osób korzystających z Google Cloud Platform każdy błąd zatrzyma proces importowania. Osobiście napotkałem dwa różne błędy w zależności od wydanego przeze mnie polecenia pg_dump:
1-
The input is a PostgreSQL custom-format dump. Use the pg_restore command-line client to restore this dump to a database.
Występuje, gdy próbujesz zrzucić bazę danych w formacie innym niż zwykły tekst. To znaczy, gdy polecenie nie ma parametru -Fp lub --format = plain. Jeśli jednak dodasz go do polecenia, możesz napotkać następujący błąd:
2-
SET SET SET SET SET SET CREATE EXTENSION ERROR: must be owner of extension plpgsql
Jest to problem z uprawnieniami, którego nie udało mi się naprawić za pomocą polecenia podanego w dokumentacji GCP , porad z tego bieżącego wątku lub zgodnie z poradami zespołu Google Postgres tutaj . Który zalecił wydanie następującego polecenia:
pg_dump -Fp --no-acl --no-owner -U myusername myDBName > mydump.sql
Jedyną rzeczą, która załatwiła sprawę w moim przypadku, była ręczna edycja pliku zrzutu i skomentowanie wszystkich poleceń związanych z plpgsql.
Mam nadzieję, że pomoże to duszom zależnym od GCP.
Aktualizacja :
Łatwiej jest zrzucić plik, komentując rozszerzenia, zwłaszcza, że niektóre zrzuty mogą być ogromne:
pg_dump ... | grep -v -E '(CREATE\ EXTENSION|COMMENT\ ON)' > mydump.sql
Które można zawęzić do plpgsql:
pg_dump ... | grep -v -E '(CREATE\ EXTENSION\ IF\ NOT\ EXISTS\ plpgsql|COMMENT\ ON\ EXTENSION\ plpgsql)' > mydump.sql
źródło
pg_dump
polecenie do użycia w swoich dokumentach :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
W takim przypadku prawdopodobnie możesz bezpiecznie zignorować komunikaty o błędach. Brak komentarza do schematu publicznego i instalacja plpgsql (który powinien być już zainstalowany) nie spowoduje żadnych poważnych problemów.
Jeśli jednak chcesz przeprowadzić pełną ponowną instalację, będziesz potrzebować użytkownika z odpowiednimi uprawnieniami. Oczywiście nie powinien to być użytkownik, który Twoja aplikacja uruchamia rutynowo.
źródło
Krótsza odpowiedź: zignoruj to.
Ten moduł jest częścią Postgres, która przetwarza język SQL. Błąd często pojawia się podczas kopiowania zdalnej bazy danych, na przykład w przypadku „heroku pg: pull”. Nie zastępuje procesora SQL i ostrzega o tym.
źródło
Spróbuj użyć
-L
flagi z pg_restore, określając plik wzięty zpg_dump -Fc
https://www.postgresql.org/docs/9.5/app-pgrestore.html
Tutaj możesz zobaczyć, że odwrotność jest prawdą, wyświetlając tylko komentarz:
źródło
Dla osób korzystających z AWS ,
COMMENT ON EXTENSION
jest możliwe tylko jako administrator , a jak wiemy przez docs, RDS przypadki są zarządzane przez Amazon. W związku z tym, aby zapobiec zepsuciu rzeczy, takich jak replikacja, Twoi użytkownicy - nawet użytkownik root skonfigurowany podczas tworzenia instancji - nie będą mieli pełnych uprawnień superużytkownika:http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html
Aby naprawić ten błąd, po prostu użyj
--
do zakomentowania wierszy kodu SQL, które zawierająCOMMENT ON EXTENSION
źródło
pg_dump --no-comments
.Użyj użytkownika postgres (admin), aby zrzucić schemat, ponownie go utworzyć i przyznać uprawnienia do użycia przed wykonaniem przywracania. Jednym poleceniem:
źródło
Dla mnie konfigurowałem bazę danych za pomocą pgAdmin i wydaje się, że ustawienie właściciela podczas tworzenia bazy danych nie wystarczyło. Musiałem przejść w dół do schematu „publicznego” i ustawić tam również właściciela (pierwotnie był to „postgres”).
źródło
Dla osób, które zawęziły problem do
COMMENT ON
stwierdzeń (zgodnie z różnymi odpowiedziami poniżej) i które mają dostęp superużytkownika do źródłowej bazy danych, z której tworzony jest plik zrzutu, najprostszym rozwiązaniem może być zapobieganie dołączaniu komentarzy do zrzutu plik w pierwszej kolejności, usuwając je z zrzucanej źródłowej bazy danych ...Przyszłe zrzuty nie będą wtedy zawierać
COMMENT ON
instrukcji.źródło
rails db:reset
na wystąpieniu postgresql AWS RDS bez konieczności usuwania linii COMMENT ON z pliku zrzutu za każdym razem, gdy uruchamiam schemat migracja.