Despejei um backup limpo e sem proprietário do banco de dados Postgres com o comando
pg_dump sample_database -O -c -U
Mais tarde, quando restauro o banco de dados com
psql -d sample_database -U app_name
No entanto, encontrei vários erros que me impedem de restaurar os dados:
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
Pesquisei no SQL de texto simples pg_dump
gerado e descobri que contém 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';
Acho que as causas são que o usuário app_name
não tem privilégios para alterar o public
esquema e plpgsql
.
Como posso resolver esse problema?
postgresql
database-backups
rails-postgresql
Steveyang
fonte
fonte
plpgsql
,DROP EXTENSION plpgsql
antes de vocêpg_dump
. Isso é mais seguro do que tornar seu aplicativo um superusuário e é mais conveniente do que ignorar erros (que detonam se você usar--single-transaction
ou-v ON_ERROR_STOP=1
). Este é um problema conhecido, [discutido longamente pelos desenvolvedores do Postgres | postgresql.org/message-id/… mas não corrigido a partir de 9.3.Respostas:
Para resolver o problema, você deve atribuir as permissões de propriedade adequadas. Tente o procedimento abaixo, que deve resolver todos os problemas relacionados à permissão para usuários específicos, mas conforme declarado nos comentários, isso não deve ser usado na produção:
Portanto, conecte-se ao banco de dados com uma conta de superusuário
sudo -u postgres psql
e execute umaALTER ROLE <user-name> Superuser;
instrução.Lembre-se de que esta não é a melhor solução em um servidor de hospedagem de vários sites, então dê uma olhada na atribuição de funções individuais: https://www.postgresql.org/docs/current/static/sql-set-role.html e https : //www.postgresql.org/docs/current/static/sql-alterrole.html .
fonte
app_user
é um superusuário.superuser
Usuários do AWS RDS, se você está entendendo isso, é porque não é um superusuário e, de acordo com a documentação do aws, não pode ser. Descobri que devo ignorar esses erros.
fonte
COMMENT ON EXTENSION
nãoCREATE EXTENSION
. Remova os comentários e você ficará bem.Para quem usa o Google Cloud Platform, qualquer erro interromperá o processo de importação. Pessoalmente, encontrei dois erros diferentes, dependendo do comando pg_dump que emiti:
1-
The input is a PostgreSQL custom-format dump. Use the pg_restore command-line client to restore this dump to a database.
Ocorre quando você tenta despejar seu banco de dados em um formato de texto não simples. Ou seja, quando o comando não tem o parâmetro -Fp ou --format = plain. No entanto, se você adicioná-lo ao seu comando, poderá encontrar o seguinte erro:
2-
SET SET SET SET SET SET CREATE EXTENSION ERROR: must be owner of extension plpgsql
Este é um problema de permissão que não consegui corrigir usando o comando fornecido nos documentos do GCP , as dicas deste tópico atual ou seguindo os conselhos da equipe do Google Postgres aqui . Qual recomendado para emitir o seguinte comando:
pg_dump -Fp --no-acl --no-owner -U myusername myDBName > mydump.sql
A única coisa que funcionou no meu caso foi editar manualmente o arquivo de despejo e comentar todos os comandos relacionados ao plpgsql.
Espero que isso ajude as almas que dependem do GCP.
Atualização:
É mais fácil despejar o arquivo comentando as extensões, especialmente porque alguns despejos podem ser enormes:
pg_dump ... | grep -v -E '(CREATE\ EXTENSION|COMMENT\ ON)' > mydump.sql
Que pode ser reduzido a plpgsql:
pg_dump ... | grep -v -E '(CREATE\ EXTENSION\ IF\ NOT\ EXISTS\ plpgsql|COMMENT\ ON\ EXTENSION\ plpgsql)' > mydump.sql
fonte
pg_dump
comando exato para usar em seus documentos :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
Você provavelmente pode ignorar com segurança as mensagens de erro nesse caso. Deixar de adicionar um comentário ao esquema público e instalar o plpgsql (que já deve estar instalado) não causará problemas reais.
No entanto, se quiser fazer uma reinstalação completa, você precisará de um usuário com as permissões apropriadas. Esse não deve ser o usuário que seu aplicativo executa rotineiramente.
fonte
Resposta mais curta: ignore.
Este módulo é a parte do Postgres que processa a linguagem SQL. O erro frequentemente aparecerá como parte da cópia de um banco de dados remoto, como com um 'heroku pg: pull'. Ele não sobrescreve o processador SQL e avisa sobre isso.
fonte
Tente usar a
-L
sinalização com pg_restore especificando o arquivo obtido depg_dump -Fc
https://www.postgresql.org/docs/9.5/app-pgrestore.html
Aqui você pode ver que o inverso é verdadeiro, gerando apenas o comentário:
fonte
Para pessoas que usam AWS , o
COMMENT ON EXTENSION
é possível apenas como superusuário e, como sabemos pelos documentos, as instâncias RDS são gerenciadas pela Amazon. Dessa forma, para evitar que você interrompa itens como a replicação, seus usuários - mesmo o usuário root que você configurou ao criar a instância - não terão privilégios totais de superusuário:http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Apêndice.PostgreSQL.CommonDBATasks.html
Para corrigir este erro, use
--
para comentar as linhas de SQL que contémCOMMENT ON EXTENSION
fonte
pg_dump --no-comments
.Use o usuário postgres (admin) para descartar o esquema, recriá-lo e conceder privilégios para uso antes de fazer a restauração. Em um comando:
fonte
Para mim, estava configurando um banco de dados com pgAdmin e parece que definir o proprietário durante a criação do banco de dados não foi suficiente. Eu tive que navegar até o esquema 'público' e definir o proprietário lá também (originalmente era 'postgres').
fonte
Para pessoas que limitaram o problema às
COMMENT ON
declarações (conforme várias respostas abaixo) e que têm acesso de superusuário ao banco de dados de origem a partir do qual o arquivo de despejo é criado, a solução mais simples pode ser impedir que os comentários sejam incluídos no despejo em primeiro lugar, removendo-os do banco de dados de origem que está sendo despejado ...Os despejos futuros não incluirão as
COMMENT ON
instruções.fonte
rails db:reset
em uma instância postgresql do AWS RDS sem ter que remover as linhas COMMENT ON do arquivo de despejo sempre que executo um esquema migração.