psql: FATAL: o banco de dados "<usuário>" não existe


723

Estou usando o aplicativo PostgreSql para mac ( http://postgresapp.com/ ). Eu usei no passado em outras máquinas, mas está me causando alguns problemas ao instalar no meu macbook. Instalei o aplicativo e executei:

psql -h localhost

Retorna:

psql: FATAL:  database "<user>" does not exist

Parece que nem consigo executar o console para criar o banco de dados que ele está tentando encontrar. O mesmo acontece quando eu apenas corro:

psql 

ou se eu iniciar o psql no menu suspenso do aplicativo:

Estatísticas da máquina:

  • OSX 10.8.4

  • psql (PostgreSQL) 9.2.4

Qualquer ajuda é apreciada.

Também tentei instalar o PostgreSql via homebrew e estou tendo o mesmo problema. Também li a página de documentação dos aplicativos que afirma:

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.

Parece que o aplicativo não está criando $ USER, no entanto eu instalei -> desinstalei - reinstalei várias vezes agora, portanto deve ser algo com minha máquina.

Encontrei a resposta, mas não sei exatamente como ele funciona, pois o usuário que respondeu neste tópico -> Como executar o Postgresql no Mac: O banco de dados "postgres" não existe não seguiu. Eu usei o seguinte comando para abrir o psql:

psql -d template1

Deixarei este sem resposta até que alguém possa fornecer uma explicação para o porquê disso funcionar.


3
O que psql -d postgres -U postgres -h localhostmostra? Sem sinalizadores, o padrão é o usuário da CLI, e eu diria que o padrão é o db admin "postgres", mas não tenho um mac para testar.
BMA

@bma Isso me dá o psql: FATAL: o papel "postgres" não existe, o que originalmente me trouxe aqui -> stackoverflow.com/questions/15301826/… . Eu tenho tentado usar essa resposta, mas eu estou recebendo o mesmo resultado -> psql: FATAL: banco de dados "user" não existe
Ryan Rico

Você já olhou no log do banco de dados? Gostaria de saber se mais detalhes seriam emitidos lá.
BMA

12
Eu tive o mesmo problema. Apenas fazendo createdb <user>funcionou para mim.
precisa saber é o seguinte

execute o comando psql -U user -d postgres, pois isso garante que o usuário esteja conectado ao banco de dados do postgres, que já está presente. Portanto, precisamos passar o banco de dados também durante o login.
Anil

Respostas:


1173

Parece que seu gerenciador de pacotes falhou ao criar o banco de dados chamado $ user para você. A razão que

psql -d template1

funciona para você é que o template1 é um banco de dados criado pelo próprio postgres e está presente em todas as instalações. Aparentemente, você pode fazer login no template1, portanto, você deve ter alguns direitos atribuídos a você pelo banco de dados. Tente isso em um prompt de shell:

createdb

e veja se você pode fazer login novamente com

psql -h localhost

Isso simplesmente criará um banco de dados para seu usuário de login, que eu acho que é o que você está procurando. Se createdb falhar, você não terá direitos suficientes para criar seu próprio banco de dados e precisará descobrir como corrigir o pacote homebrew.


38
No meu caso, escrevi $ createdb -h localhostpara resolver o erro could not connect to database postgres: could not connect to server. Depois disso, posso me conectar ao console do postgresql via psql -h localhost.
ExiRe

Ainda recebo uma senha solicitada e não faço ideia de qual é, qual é a senha padrão do aplicativo postgres?
LasagnaAndroid

2
Obrigado @Kirk. Nós realmente precisamos -d template1no seu primeiro comando? Eu já vi "template1" em tutoriais por toda a Internet, mas serve apenas para me confundir. Uma abordagem mais lógica seria, na minha opinião 1) Criar o usuário do PostgreSQL, por exemplo, "usera" 2) Criar um banco de dados com o mesmo nome que o usuário "usera" (acho que isso é loucura, mas parece que o PostgreSQL exige) 3) log em PostgreSQL como o super usuário "postgres" e atribuir os privilégios de banco de dados "usera" para o usuário "usera" (oh meu deus, isso é realmente a vida real?)
ericn

@eric: O -d template1 está lá apenas para verificar se o OP pode efetuar login. Como ele é criado no momento do initdb, ele sempre existe e foi uma verificação fácil. A partir desse momento, seu procedimento é geralmente "vida real".
21415 Kirk Roybal

@ExiRe Você acabou de curar uma enorme dor de cabeça que eu estava tendo com um comando simples. Obrigado!
Dave Munger

193

No terminal, basta executar o comando na janela do prompt de comando. (Não está dentro do psql) .

createdb <user>

E tente executar o postgres novamente.


3
Bonita! Isso foi feito! Depois de executar isso, todos os comandos do psql funcionam como charme! muito obrigado!
thenaturalist 30/10

1
E eu estava tentando no modelo psql. maldita
user1735921

2
Também você pode simplesmente executarcreatedb
Mantisimo

dica para usuários como eu;) (não dentro do psql). significa que quando você abre a janela do terminal, basta digitar este createdb como primeiro comando e, em seguida, tentar fazer login no psql.
Rohan Dodeja 18/12/19

Ótimo! Trabalhou para mim no OSX.
darkhipo 13/04

150

Por padrão, o postgres tenta se conectar a um banco de dados com o mesmo nome que seu usuário. Para evitar esse comportamento padrão, basta especificar usuário e banco de dados:

psql -U Username DatabaseName 

14
Obrigado, você sabe o motivo desse projeto - por que no mundo eu gostaria de acessar o banco de dados de meu nome por padrão?
22615 ericn

3
Os bancos de dados @eric geralmente são usados ​​por serviços executados como um usuário dedicado. Portanto, acho que a estratégia de usar o nome de usuário como o nome padrão do banco de dados é provavelmente mais útil do que usar algum nome fixo fixo do banco de dados (por exemplo, "postgres").
user686249

5
como você executa o script SQL que realmente cria banco de dados? no meu caso, ele sempre tenta se conectar ao banco de dados <usuário> quando meu objetivo é criar outro banco de dados: psql -U Username -f create_db.sqlisso retornará um erro:database Username doesn't exists
Kostanos 4/17/17

Resposta fantástica, obrigado, mas implora a pergunta por que não está na linha de comando? psql --help
Shawn Vader

1
psql -U Username postgresquando você ainda não possui bancos de dados
Anatolii Stepaniuk

59
  1. Faça o login como usuário padrão: sudo -i -u postgres
  2. Crie um novo usuário: createuser --interactive
  3. Quando o nome da função for solicitado, digite o nome de usuário linux e selecione Sim na pergunta do superusuário.
  4. Ainda conectado como usuário do postgres, crie um banco de dados: createdb <username_from_step_3>
  5. Confirme se os erros desapareceram digitando: psqlno prompt de comando.
  6. A saída deve mostrar psql (x.x.x) Type "help" for help.

Cara, você me salvou muito tempo.
precisa saber é o seguinte

Eu precisava fazer isso no Windows. Defina o novo nome de usuário pg como o Linux un. Fixo.
RichieRich

Isso funcionou para mim como charme
Promise Preston

42

Efetue login usando o banco de dados template1 padrão:

#psql -d template1
#template1=# \l

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

Crie um banco de dados com seu userId:

template1=# CREATE DATABASE gogasca WITH OWNER gogasca ENCODING 'UTF8';
CREATE DATABASE

Saia e entre novamente

template1=# \q
gonzo:~ gogasca$ psql -h localhost
psql (9.4.0)
Type "help" for help.

gogasca=# \l
                                List of databases
   Name    |  Owner  | Encoding |   Collate   |    Ctype    |  Access privileges  
-----------+---------+----------+-------------+-------------+---------------------
 gogasca   | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
 template1 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
(4 rows)

20

Eu enfrentei o mesmo erro ao tentar abrir o postgresql no mac

psql: FATAL:  database "user" does not exist

Eu encontrei este comando simples para resolvê-lo:

Método 1

$ createdb --owner=postgres --encoding=utf8 user

e tipo

 psql

Método 2:

psql -d postgres

5
O método 2 salvou minha vida
tom10271

9

Teve o mesmo problema, foi simples psql -d postgres(digite o comando no terminal)


6

Este erro também pode ocorrer se a variável de ambiente PGDATABASE estiver definida como o nome de um banco de dados que não existe.

No OSX, vi o seguinte erro ao tentar iniciar o psql no menu Postgress.app:

psql: FATAL: database "otherdb" does not exist

A solução para o erro foi remover export PGDATABASE=otherdbde ~/.bash_profile:

Além disso, se PGUSER estiver definido como algo diferente do seu nome de usuário, ocorrerá o seguinte erro:

psql: FATAL: role "note" does not exist

A solução é remover export PGUSER=notmede ~/.bash_profile.


5

Após a instalação do postgres, na minha versão do caso é 12.2, executei o comando abaixo createdb.

$ createdb `whoami`

$ psql

psql (12.2)
Type "help" for help.

macuser=# 

Cheers isso funcionou para mim
FaISalBLiNK

4

Como essa pergunta é a primeira nos resultados da pesquisa, colocarei aqui uma solução diferente para um problema diferente, para não ter um título duplicado.

A mesma mensagem de erro pode aparecer ao executar um arquivo de consulta psqlsem especificar um banco de dados. Como não há nenhuma useinstrução no postgresql, precisamos especificar o banco de dados na linha de comando, por exemplo:

psql -d db_name -f query_file.sql

1
e db template1 sempre existe
janeiro

4

Como a documentação createdb afirma:

O primeiro banco de dados é sempre criado pelo comando initdb quando a área de armazenamento de dados é inicializada ... Esse banco de dados é chamado de postgres.

Portanto, se certas distribuições do OS / postgresql fazem isso de maneira diferente, certamente não é o padrão / padrão (apenas verifiquei que initdbno openSUSE 13.1 cria o banco de dados "postgres", mas não "<usuário>"). Para encurtar a história, psql -d postgresespera-se que seja usado ao usar um usuário que não seja "postgres".

Obviamente, a resposta aceita, executando createdbpara criar um banco de dados nomeado como o usuário, também funciona, mas cria um banco de dados supérfluo.


1

teve o problema de usar o driver JDBC, portanto, basta adicionar o banco de dados (talvez de forma redundante, dependendo da ferramenta que você pode usar) após o nome do host na URL, por exemplo jdbc:postgres://<host(:port)>/<db-name>

detalhes adicionais estão documentados aqui: http://www.postgresql.org/docs/7.4/static/jdbc-use.html#JDBC-CONNECT


Eu sei que é um pouco fora do tópico, considerando que só foi convidado para psql, mas o Google trouxe-me aqui com o meu problema, então eu acho que vale a pena mencionar aqui
Andreas Dietrich

1

Conecte-se ao postgres via superusuário existente.

Crie um banco de dados com o nome do usuário ao qual você está se conectando ao postgres.

create database username;

Agora tente se conectar via nome de usuário


1

Tente usar-

psql -d postgres

Eu também estava enfrentando o mesmo problema quando corri psql


0

Primeiro, é útil criar um banco de dados com o mesmo uso atual, para evitar o erro quando você deseja apenas usar o banco de dados padrão e criar novas tabelas sem declarar explicitamente o nome de um banco de dados.

Substitua "skynotify" pelo seu nome de usuário:

psql -d postgres -c "CREATE DATABASE skynotify ENCODING 'UTF-8';"

-d declara explicitamente qual banco de dados usar como padrão para instruções SQL que não incluem explicitamente um nome de banco de dados durante esta sessão interativa.

BÁSICO PARA OBTER UMA IMAGEM CLARA DO QUE SEU SERVIDOR PostgresQL possui.

Você deve se conectar a um banco de dados existente para usar o psql interativamente. Felizmente, você pode solicitar ao psql uma lista de bancos de dados:

psql -l

.

                                          List of databases
               Name               | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
----------------------------------+-----------+----------+-------------+-------------+-------------------
 skynotify                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 myapp_dev                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres                         | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ruby-getting-started_development | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/skynotify          +
                                  |           |          |             |             | skynotify=CTc/skynotify
 template1                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/skynotify          +
                                  |           |          |             |             | skynotify=CTc/skynotify
(6 rows)

Isso NÃO inicia o console interativo, apenas envia uma tabela baseada em texto para o terminal.

Como outras respostas dizem, o postgres é sempre criado, portanto você deve usá-lo como seu banco de dados à prova de falhas quando quiser que o console comece a funcionar em outros bancos de dados. Se não estiver lá, liste os bancos de dados e use qualquer um deles.

De maneira semelhante, selecione tabelas de um banco de dados:

psql -d postgres -c "\dt;"

Meu banco de dados "postgres" não possui tabelas, mas qualquer banco de dados que faça isso produzirá uma tabela baseada em texto no terminal (saída padrão).

E, para completar, também podemos selecionar todas as linhas de uma tabela:

psql -d ruby-getting-started_development -c "SELECT * FROM widgets;"

.

 id | name | description | stock | created_at | updated_at 
----+------+-------------+-------+------------+------------
(0 rows)

Mesmo se houver zero linhas retornadas, você obterá os nomes dos campos.

Se suas tabelas tiverem mais de uma dúzia de linhas, ou você não tiver certeza, será mais útil começar com uma contagem de linhas para entender a quantidade de dados em seu banco de dados:

 psql -d ruby-getting-started_development -c "SELECT count(*) FROM widgets;"

.

 count 
-------
     0
(1 row)

E não que "1 linha" o confunda, ele representa apenas quantas linhas são retornadas pela consulta, mas a 1 linha contém a contagem desejada, que é 0 neste exemplo.

NOTA: um banco de dados criado sem um proprietário definido será de propriedade do usuário atual.


0

Tentei algumas dessas soluções, mas elas não funcionaram muito bem (apesar de estarem no caminho certo!)

No final, meu erro foi:

FATAL: falha na autenticação da senha do usuário

quando executei o seguinte comando: psql

Então, eu executei esses dois comandos:

dropdb()
createdb()

NOTA: esta irá remover o db, mas eu não precisar dele e por algum motivo eu não podia mais acesso pqsl, então eu removido e recriado-lo. Então psqltrabalhou novamente.


0

Não tenho certeza se já foi adicionado nas respostas, a resposta de Anatolii Stepaniuk foi muito útil, que é a seguinte.

psql -U Username postgres # when you have no databases yet

-1

Teve este problema ao instalar o postgresql via homebrew.

Teve que criar o superusuário "postgres" padrão com:

createuser - postgres interativos respondem y para superusuário

createuser - resposta do usuário interativo y para superusuário


-3

Eu ainda tinha o problema acima depois de instalar o postgresql usando o homebrew - resolvi colocando / usr / local / bin no meu caminho antes de / usr / bin


-12

Na sua explicação mais simples; é problema noob. Apenas digitando

pgres

resultará nessa resposta.

pgres <db_name> 

terá sucesso sem erro se o usuário tiver permissões para acessar o banco de dados.

Pode-se entrar nos detalhes das variáveis ​​de ambiente exportadas, mas isso é desnecessário. Isso é básico demais para falhar por qualquer outro motivo.


5
Realmente não gosto do "tipo de linguagem noob issue"
Kimmo Hintikka

Também não recomendou como resolver o problema, por isso não respondeu à pergunta.
Deborah

1
nunca ouvi falar depgres
Glenn Plas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.