psql: FATAL: a função "postgres" não existe

406

Eu sou um novato no postgres.

Eu instalei o postgres.app para mac. Eu estava brincando com os comandos psql e acidentalmente deixei cair o banco de dados do postgres. Eu não sei o que estava nele.

Atualmente, estou trabalhando em um tutorial: http://www.rosslaird.com/blog/building-a-project-with-mezzanine/

E eu estou preso em sudo -u postgres psql postgres

MENSAGEM DE ERRO: psql: FATAL: role "postgres" does not exist

$ qual psql

/Applications/Postgres.app/Contents/MacOS/bin/psql

É isso que imprime psql -l

                                List of databases
    Name    |   Owner    | Encoding | Collate | Ctype |     Access privileges     
------------+------------+----------+---------+-------+---------------------------
 user       | user       | UTF8     | en_US   | en_US | 
 template0  | user       | UTF8     | en_US   | en_US | =c/user                  +
            |            |          |         |       | user      =CTc/user      
 template1  | user       | UTF8     | en_US   | en_US | =c/user                  +
            |            |          |         |       | user      =CTc/user      
(3 rows)

Então, quais são os passos que devo tomar? Excluir tudo relacionado ao psql e reinstalar tudo?

Obrigado pela ajuda pessoal!

user805981
fonte
11
Reiniciando o computador. Garante que Launchd brew services start postresqlseja executado.
precisa

Respostas:

411

NOTA: Se você instalou o postgres usando homebrew, consulte o comentário em @ user3402754 abaixo.

Observe que a mensagem de erro NÃO fala sobre um banco de dados ausente, mas sobre uma função ausente. Posteriormente no processo de login, ele também pode tropeçar no banco de dados ausente.

Mas o primeiro passo é verificar a função que falta: Qual é a saída dentro psqldo comando \du? No meu sistema Ubuntu, a linha relevante fica assim:

                              List of roles
 Role name |            Attributes             | Member of 
-----------+-----------------------------------+-----------
 postgres  | Superuser, Create role, Create DB | {}        

Se não houver pelo menos uma função superuser, você terá um problema :-)

Se houver um, você pode usá-lo para fazer login. E olhando para a saída do seu \lcomando: As permissões para usernos bancos de dados template0e template1são as mesmas que no meu sistema Ubuntu para o superusuário postgres. Então, acho que sua configuração é simples usercomo superusuário. Então você pode tentar este comando para fazer login:

sudo -u user psql user

Se useré realmente o superusuário do banco de dados, você pode criar outro superusuário do banco de dados e um banco de dados vazio e privado para ele:

CREATE USER postgres SUPERUSER;
CREATE DATABASE postgres WITH OWNER postgres;

Mas como a instalação do postgres.app parece não fazer isso, você também não deve. Simples adapte o tutorial.

AH
fonte
10
Para mim, o usuário não estava sendo criado - funcionou, em vez disso, CREATE USER postgres WITH SUPERUSER PASSWORD 'password'; estou usando o postgres v10.
Arcseldon #
230
Se você instalou o Postgres a partir de homebrewentão você precisa rodar /usr/local/opt/postgres/bin/createuser -s postgresno seu terminal
user3402754 5/18/18
7
Eu tive que executar/usr/local/opt/postgresql/bin/createuser -s postgres
user1807782
11
@ user1807782 Você salvou meu dia; Eu acho que você deveria anunciar isso como uma resposta.
tolga
11
Se você estiver usando uma versão específica do postgres, precisará incluir a versão no caminho -/usr/local/opt/postgresql@11/bin/createuser -s postgres
Digitrance
264

A chave é "Eu instalei o postgres.app para mac". Este aplicativo configura a instalação local do PostgreSQL com um superusuário de banco de dados cujo nome da função é igual ao seu nome (abreviado) de login.

Quando o Postgres.app é iniciado pela primeira vez, ele cria o banco de dados $ USER, que é o banco de dados padrão do psql quando nenhum é especificado. O usuário padrão é $ USER, sem senha.

Alguns scripts (por exemplo, um backup de banco de dados criado com pgdumpum sistema Linux) e tutoriais assumem que o superusuário possui o nome de função tradicional postgres.

Você pode fazer com que sua instalação local pareça um pouco mais tradicional e evitar esses problemas executando uma única vez:

/Applications/Postgres.app/Contents/Versions/9.*/bin/createuser -s postgres

o que fará com que esses FATAL: o papel "postgres" não exista desapareça.

jwd630
fonte
119
Se você estiver usando o postgres do Homebrew, então deseja /usr/local/Cellar/postgresql/9.2.4/bin/createuser -s postgres(para a versão 9.2.4, obviamente).
22414 Roger Rabbitcombe
11
Para o postgres.app 9.3, eles parecem ter reorganizado os diretórios. Tentei: /Applications/Postgres.app/Contents/Versions/9.3/bin/createuser -s postgres, mas isso gerou a mesma mensagem de erro: "createuser: não foi possível conectar-se ao banco de dados postgres: FATAL: a função" postgres "não existe "
Michael Coxon
7
/Applications/Postgres.app/Contents/Versions/9.3/bin/createuser -s postgrescorreu corretamente para mim.
cjspurgeon
9
@RogerLipscombe se você executar brew link postgresqlapós a instalação, não há necessidade de acrescentar todo o caminho para createuser, uma simples createuser -s postgresvai trabalhar muito
AlessioX
2
createuser -s postgrestrabalhou para mim. Eu instalei o postgres com o Homebrew
#
228

Para MAC:

  1. Instalar Homebrew
  2. brew install postgres
  3. initdb /usr/local/var/postgres
  4. /usr/local/Cellar/postgresql/<version>/bin/createuser -s postgresou /usr/local/opt/postgres/bin/createuser -s postgresque usará apenas a versão mais recente.
  5. inicie o servidor postgres manualmente: pg_ctl -D /usr/local/var/postgres start

Para iniciar o servidor na inicialização

  • mkdir -p ~/Library/LaunchAgents
  • ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
  • launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

Agora, ele está configurado, efetue login usando psql -U postgres -h localhostou use o PgAdmin for GUI.

Por padrão, o usuário postgresnão terá nenhuma senha de login.

Verifique este site para obter mais artigos como este: https://medium.com/@Nithanaroy/installing-postgres-on-mac-18f017c5d3f7

Nitin
fonte
3
Com o mais novo Brew instalar você pode fazer brew services start postgresqlpara começar postgres
Automatico
<3 <3 <3 <3 <3 <3
Adeel Ahmad
esta é a melhor resposta
Alejandro Pablo Tkachuk
39
createuser postgres --interactive

ou faça um superusuário postgresl apenas com

createuser postgres -s
SubstanceMX
fonte
Achei essa resposta útil quando meu pgadmin continuou solicitando o usuário do postgres e eu não tenho a função do postgres para começar, esse comando a criou, adicionei o pw gerado automaticamente no meu pgadmin e o problema foi resolvido!
theusual
Isso funciona para mim .. mas desta forma: "criar usuário postgres"
Roberto Rodriguez
31

Isso acontece quando você executa initdbcom um usuário cujo ID não é postgres, sem especificar o postgresnome de usuário com --username=postgresou -U postgres.

O cluster do banco de dados é criado com a conta de usuário do sistema que você usou para executar o initdb e recebe permissões de superusuário.

Para corrigi-lo, basta criar um novo usuário nomeado postgrescom a opção --superuserusando o createuserutilitário que acompanha o Postgres. O utilitário pode ser encontrado no bindiretório do Postgres . por exemplo

createuser --superuser postgres

Se você tiver um nome de host ou porta personalizado, defina as opções apropriadas .

Não se esqueça de excluir a outra conta de usuário criada para você pelo initdb.

isapir
fonte
2
Esta é a resposta mais informativa.
MyWrathAcademia
17

Para mim, esse código funcionou:

/Applications/Postgres.app/Contents/Versions/9.4/bin/createuser -s postgres

veio daqui: http://talk.growstuff.org/t/fatal-role-postgres-does-not-exist/216/4

Kevin Zhao
fonte
Funciona para mim também! Você salvou meu bacon.
Dave Munger
11
Recebo papel "me" não existe
SuperUberDuper
Isso significa que esse novo usuário do posgres não terá uma senha?
Olaoluwa_98 30/11/19
16

Eu precisava desabilitar $PGUSER:

$ unset PGUSER
$ createuser -s postgres
Beau Barker
fonte
11
oh cara, finalmente entendi qual era o problema. Acontece que você está tentando criar postgres de usuários como postgres de usuários
Taras Matsyk
14

Primeiro você precisa criar um usuário:

sudo -u postgres createuser --superuser $USER

Depois de criar um banco de dados:

sudo -u postgres createdb $USER

Mude $USER para o nome de usuário do seu sistema.

Você pode ver a solução completa aqui .

ruzenhack
fonte
8

Executar isso na linha de comando deve corrigi-lo

/Applications/Postgres.app/Contents/Versions/9.4/bin/createdb <Mac OSX Username Here>

Alex Levine
fonte
11
Esta é a única coisa que funcionou para mim. Obrigado!
Herb Meehan
4

Descartar o postgresbanco de dados realmente não importa. Esse banco de dados está inicialmente vazio e seu objetivo é simplesmente que o postgresusuário tenha um tipo de "casa" para se conectar, caso seja necessário.

Ainda assim, você pode recriá-lo com o comando SQL CREATE DATABASE postgres;

Observe que o tutorial mencionado na pergunta não está escrito postgres.appem mente. Ao contrário do PostgreSQL para Unix em geral, postgres.apptenta se parecer com um aplicativo normal, em oposição a um serviço que seria executado por um postgresusuário dedicado com privilégios diferentes do seu usuário normal. postgres.appé executado e gerenciado por sua própria conta.

Então, ao invés deste comando sudo -u postgres psql -U postgres:, seria mais do espírito do postgres.app apenas emitir:, psqlque se conecta automaticamente a um banco de dados que corresponde ao nome do usuário e a uma conta db com o mesmo nome que é superusuário, então ele pode fazer qualquer coisa em termos de permissão.

Daniel Vérité
fonte
OK. Mas por que recebo um erro ERROR: cannot drop the currently open databasequando tento excluir o banco de dados do usuário? Portanto, não é uma boa prática usar este postgres.app?
user805981
Você não pode soltar um banco de dados enquanto estiver conectado a ele. por que você quer excluí-lo, afinal? Está aqui para sua conveniência.
Daniel Vérité
Eu só queria ver se eu podia. Portanto, é como um banco de dados padrão correto quando eu inicializo meu psql e postgres.app? Agora, e os privilégios de acesso? Eu não sou capaz de configurá-los mais? Vejo que template0 e template1 tem privilégios de acesso
user805981
@ user805981 Postgres.appé para fins de teste e desenvolvimento; é um pacote PostgreSQL da Heroku, projetado para tornar mais fácil para os usuários de Mac que desenvolvem com Ruby on Rails testar com PostgreSQL em vez do SQLite padrão. Os usos do Rails costumavam testar com SQLite e implantar no PostgreSQL, o que causava todo tipo de problemas, então o Heroku tentou facilitar também o teste no PostgreSQL. Postgres.appé bom para teste, mas eu não consideraria usá-lo para produção ou dados reais, não é para isso que serve.
Craig Ringer
4

Pelo que vale, tenho o ubuntu e muitos pacotes instalados e entrou em conflito com ele.

Para mim, a resposta certa foi:

sudo -i -u postgres-xc
psql
softwareplay
fonte
2

Este é o único que o corrigiu para mim:

createuser -s -U $USER
Bax
fonte
2
Isso torna o usuário atual um superusuário do sistema, e não apenas um superusuário do postgres. Eu diria que isso geralmente seria uma má idéia, pois contorna as políticas de segurança usuais. Você deve sudoobter privilégios temporários de superusuário.
Sean Dawson
1

No sistema Ubuntu, limpei o PostgreSQL e o reinstalei. Todos os bancos de dados são restaurados. Isso resolveu o problema para mim.

Conselho - Faça o backup dos bancos de dados para estar do lado mais seguro.

Gaurav Neema
fonte
0

Eu não acho que o sudo seja necessário aqui porque o psql -l retorna uma lista de bancos de dados. Isso me diz que o initdb foi executado no usuário atual do usuário, não no usuário do postgres.

Você pode apenas:

psql

E continue o tutorial.

Eu sugeriria os pontos gerais do AH de criar o usuário e o banco de dados do postgres, porque muitos aplicativos podem esperar que isso exista.

Uma breve explicação:

O PostgreSQL não será executado com acesso administrativo ao sistema operacional. Em vez disso, é executado com um usuário comum e, para oferecer suporte à autenticação de mesmo nível (perguntando ao SO que está tentando se conectar), ele cria um usuário e um banco de dados com o usuário que executa o processo de inicialização. Nesse caso, era seu usuário normal.

Chris Travers
fonte
limpa algumas distinções importantes no postgres. Obrigado.
22818 imsrgadich
0

Fiquei preso a esse problema por ter sido executado brew services stop postgresqlno dia anterior.
O dia seguinte: brew services start postgresqlnão funcionaria. Isso ocorre porque, como é mostrado, quando você instala usando o homebrew. O postgresql usa um launchd ... que carrega quando o computador está ligado.

resolução:
brew services start postgresql
reinicie o computador.

Michael Dimmitt
fonte
0

O \ducomando retorna:

Nome da função = postgres@implicit_files

E esse comando postgres=# \password postgresretorna erro:

ERRO: a função "postgres" não existe.

Mas isso postgres=# \password postgres@implicit_filescorre bem.

Também após sudo -u postgres createuser -s postgresa primeira variante também funciona.

Michael
fonte