psql: FATAL: il database "<utente>" non esiste


723

Sto usando l'app PostgreSql per mac ( http://postgresapp.com/ ). L'ho usato in passato su altri computer, ma mi dà qualche problema durante l'installazione sul mio macbook. Ho installato l'applicazione e ho eseguito:

psql -h localhost

Restituisce:

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

Sembra che non riesca nemmeno a eseguire la console per creare il database che sta tentando di trovare. La stessa cosa succede quando corro:

psql 

o se avvio psql dal menu a discesa dell'applicazione:

Statistiche macchina:

  • OSX 10.8.4

  • psql (PostgreSQL) 9.2.4

Qualsiasi aiuto è apprezzato.

Ho anche tentato di installare PostgreSql tramite homebrew e sto riscontrando lo stesso problema. Ho anche letto la pagina di documentazione delle applicazioni che afferma:

Quando Postgres.app si avvia per la prima volta, crea il database $ USER, che è il database predefinito per psql quando non ne viene specificato nessuno. L'utente predefinito è $ USER, senza password.

Quindi sembra che l'applicazione non stia creando $ USER, tuttavia ho installato-> disinstallato-reinstallato diverse volte ora, quindi deve essere qualcosa con la mia macchina.

Ho trovato la risposta ma non sono sicuro di come funzioni come l'utente che ha risposto a questo thread -> Far funzionare Postgresql su Mac: il database "postgres" non esiste non ha dato seguito. Ho usato il seguente comando per aprire psql:

psql -d template1

Lascio questo senza risposta fino a quando qualcuno non può fornire una spiegazione del perché funzioni.


3
Cosa psql -d postgres -U postgres -h localhostmostra? Senza flag per impostazione predefinita è l'utente della CLI e avrei detto di default al db di amministrazione "postgres" ma non ho un mac su cui testare.
bma,

@bma Questo mi dà psql: FATAL: il ruolo "postgres" non esiste, che originariamente mi ha portato qui -> stackoverflow.com/questions/15301826/… . Ho tentato di usare quella risposta ma sto ottenendo lo stesso risultato -> psql: FATAL: il database "user" non esiste
Ryan Rich

Hai guardato nel registro db? Mi chiedo se più dettagli sarebbero emessi lì.
bma,

12
Ho avuto lo stesso problema. Fare semplicemente ha createdb <user>funzionato per me.
poshaughnessy

eseguire il comando come psql -U user -d postgres, questo assicura che l'utente sia connesso al database postgres, che è già presente. Quindi dobbiamo passare il database anche durante il login.
Anil,

Risposte:


1173

Sembra che il tuo gestore pacchetti non sia riuscito a creare il database chiamato $ user per te. Il motivo è quello

psql -d template1

funziona per te è che template1 è un database creato da Postgres stesso ed è presente su tutte le installazioni. Apparentemente sei in grado di accedere a template1, quindi devi avere alcuni diritti assegnati dal database. Prova questo al prompt della shell:

createdb

e poi vedi se riesci ad accedere di nuovo con

psql -h localhost

Questo creerà semplicemente un database per l'utente di accesso, che penso sia quello che stai cercando. Se createb fallisce, allora non hai abbastanza diritti per creare il tuo database e dovrai capire come riparare il pacchetto homebrew.


38
Nel mio caso ho scritto $ createdb -h localhostper risolvere l'errore could not connect to database postgres: could not connect to server. Dopo che io possa connettersi a PostgreSQL console tramite psql -h localhost.
ExiRe

Ricevo ancora una richiesta di password e non ho idea di quale sia, qual è la password dell'app postgres predefinita?
LasagnaAndroid,

2
Grazie @Kirk. Abbiamo davvero bisogno -d template1del tuo primo comando? Ho visto "template1" nei tutorial su Internet, ma serve solo a confondermi. Un approccio più logico sarebbe, a mio avviso, 1) Creare l'utente PostgreSQL ad es. "Usera" 2) Creare un database con lo stesso nome dell'utente "usera" (penso che sia pazzo ma sembra che PostgreSQL lo richieda) 3) Accedi a PostgreSQL come superutente "postgres" e assegna i privilegi del database "usera" all'utente "usera" (oh mio dio, questa è davvero la vita reale?)
ericn

@eric: -d template1 è lì solo per verificare che l'OP possa accedere a tutti. Dal momento che è stato creato al momento di initdb, esiste sempre ed è stato un controllo facile. Da quel momento in poi, la tua procedura è generalmente "vita reale".
Kirk Roybal,

@ExiRe Hai appena curato un forte mal di testa che stavo avendo con un semplice comando. Grazie!
Dave Munger,

193

Dal terminale, basta eseguire il comando nella finestra del prompt dei comandi. (Non all'interno di psql) .

createdb <user>

E poi prova a eseguire di nuovo Postgres.


3
Bellissimo! Questo l'ha fatto! Dopo aver eseguito questo, tutti i comandi psql funzionano in modo incantevole! grazie mille!
naturalista il

1
E stavo provando nel modello psql. accidenti
user1735921 il

2
anche tu puoi semplicemente correrecreatedb
Mantisimo

consiglio per utenti come me;) (Non all'interno di psql). significa che quando apri semplicemente la finestra del terminale inserisci questo creato come primo comando e poi prova ad accedere in psql.
Rohan Dodeja il

Grande! Ha funzionato per me su OSX.
darkhipo,

150

Per impostazione predefinita, postgres tenta di connettersi a un database con lo stesso nome dell'utente. Per impedire questo comportamento predefinito, basta specificare l'utente e il database:

psql -U Username DatabaseName 

14
Grazie, conosci il motivo di tale progettazione - perché nel mondo dovrei voler andare al database dei miei nomi di default?
ericn,

3
I database @eric sono spesso utilizzati dai servizi in esecuzione come utente dedicato. Quindi immagino che la strategia di utilizzare il nome utente come nome predefinito del database sia probabilmente più utile rispetto all'utilizzo di un nome predefinito predefinito del database (ad esempio "postgres").
user686249,

5
come si esegue lo script SQL che crea effettivamente il database? nel mio caso cerca sempre di connettermi al database <utente> quando il mio obiettivo è creare un altro DB: psql -U Username -f create_db.sqlquesto restituirà un errore:database Username doesn't exists
Kostanos

Risposta fantastica grazie, ma pone la domanda perché non è nella guida della riga di comando? psql --help
Shawn Vader

1
psql -U Username postgresquando non hai ancora database
Anatolii Stepaniuk

59
  1. Accedi come utente predefinito: sudo -i -u postgres
  2. Crea nuovo utente: createuser --interactive
  3. Quando viene richiesto il nome del ruolo, immettere il nome utente linux e selezionare Sì per la domanda del superutente.
  4. Ancora effettuato l'accesso come utente postgres, creare un database: createdb <username_from_step_3>
  5. Conferma che gli errori sono scomparsi inserendo: psqlal prompt dei comandi.
  6. L'output dovrebbe mostrare psql (x.x.x) Type "help" for help.

Amico, mi hai risparmiato un sacco di tempo.
Jp Reddy,

Ho dovuto farlo in Windows. Impostare il nuovo nome utente pg su Linux un. Fisso.
RichieRich,

Questo ha funzionato per me come un incantesimo
Promise Preston il

42

Accedi usando il database template1 predefinito:

#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)

Crea un database con il tuo ID utente:

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

Esci e quindi accedi di nuovo

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

Ho riscontrato lo stesso errore quando ho provato ad aprire postgresql su Mac

psql: FATAL:  database "user" does not exist

Ho trovato questo semplice comando per risolverlo:

Method1

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

e digitare

 psql

Metodo 2:

psql -d postgres

5
Il metodo 2 mi ha salvato la vita
tom10271

9

Aveva lo stesso problema, un semplice psql -d postgresfatto (digitare il comando nel terminale)


6

Questo errore può verificarsi anche se la variabile d'ambiente PGDATABASE è impostata sul nome di un database che non esiste.

Su OSX, ho visto il seguente errore durante il tentativo di avviare psql dal menu Postgress.app:

psql: FATAL: database "otherdb" does not exist

La soluzione all'errore era rimuovere export PGDATABASE=otherdbda ~/.bash_profile:

Inoltre, se PGUSER è impostato su qualcosa di diverso dal tuo nome utente, si verificherà il seguente errore:

psql: FATAL: role "note" does not exist

La soluzione è rimuovere export PGUSER=notmeda ~/.bash_profile.


5

Dopo l'installazione di Postgres, nel mio caso la versione è 12.2, ho eseguito il comando seguente createdb.

$ createdb `whoami`

$ psql

psql (12.2)
Type "help" for help.

macuser=# 

applausi questo ha funzionato per me
FaISalBLiNK

4

Poiché questa domanda è la prima nei risultati di ricerca, inserirò comunque una soluzione diversa per un problema diverso, al fine di non avere un titolo duplicato.

Lo stesso messaggio di errore può apparire quando si esegue un file di query psqlsenza specificare un database. Poiché non esiste alcuna useistruzione in postgresql, dobbiamo specificare il database sulla riga di comando, ad esempio:

psql -d db_name -f query_file.sql

1
e db template1 esiste sempre
gennaio

4

Come afferma la documentazione creata :

Il primo database viene sempre creato dal comando initdb quando viene inizializzata l'area di archiviazione dei dati ... Questo database si chiama postgres.

Quindi, se alcune distribuzioni OS / postgresql lo fanno diversamente, non è certamente il default / standard (ho appena verificato che initdbsu openSUSE 13.1 crea il DB "postgres", ma non "<utente>"). Per farla breve, psql -d postgresdovrebbe essere usato quando si utilizza un utente diverso da "Postgres".

Ovviamente anche la risposta accettata, in esecuzione createdbper creare un DB chiamato come l'utente, funziona, ma crea un DB superfluo.


1

ha avuto il problema con l'utilizzo del driver JDBC, quindi è sufficiente aggiungere il database (forse in modo ridondante a seconda dello strumento che è possibile utilizzare) dopo il nome host nell'URL, ad es. jdbc:postgres://<host(:port)>/<db-name>

ulteriori dettagli sono documentati qui: http://www.postgresql.org/docs/7.4/static/jdbc-use.html#JDBC-CONNECT


So che è un po 'fuori tema considerando che è stato chiesto solo per psql, ma Google mi ha portato qui con il mio problema, quindi penso che valga la pena menzionarlo qui
Andreas Dietrich,

1

Connettiti a Postgres tramite il superutente esistente.

Crea un database con il nome dell'utente che stai collegando a Postgres.

create database username;

Ora prova a connetterti tramite nome utente


1

Prova a usare-

psql -d postgres

Stavo anche affrontando lo stesso problema quando correvo psql


0

Prima di tutto, è utile creare un database con lo stesso nome del tuo uso corrente, per evitare l'errore quando vuoi solo usare il database predefinito e creare nuove tabelle senza dichiarare esplicitamente il nome di un db.

Sostituisci "skynotify" con il tuo nome utente:

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

-d dichiara esplicitamente quale database utilizzare come predefinito per le istruzioni SQL che non includono esplicitamente un nome db durante questa sessione interattiva.

FONDAMENTI PER OTTENERE UN'IMMAGINE CHIARA DI QUELLO CHE IL TUO SERVER PostgresQL ha in sé.

È necessario connettersi a un database esistente per utilizzare interattivamente psql. Fortunatamente, puoi chiedere a psql un elenco di database:

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)

Questo NON avvia la console interattiva, ma genera semplicemente una tabella testuale sul terminale.

Come dice un'altra risposta, Postgres viene sempre creato, quindi dovresti usarlo come database di sicurezza quando vuoi solo che la console inizi a funzionare su altri database. Se non è presente, quindi elencare i database e quindi utilizzare uno di essi.

Allo stesso modo, selezionare le tabelle da un database:

psql -d postgres -c "\dt;"

Il mio database "postgres" non ha tabelle, ma qualsiasi database che lo farà genererà una tabella testuale sul terminale (standard out).

E per completezza, possiamo selezionare anche tutte le righe da una tabella:

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

.

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

Anche se vengono restituite zero righe, otterrai i nomi dei campi.

Se le tue tabelle hanno più di una dozzina di righe, o non sei sicuro, sarà più utile iniziare con un conteggio di righe per capire quanti dati ci sono nel tuo database:

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

.

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

E non lasciare che quella "1 riga" ti confonda, rappresenta solo quante righe vengono restituite dalla query, ma la 1 riga contiene il conteggio desiderato, che è 0 in questo esempio.

NOTA: un db creato senza un proprietario definito sarà di proprietà dell'utente corrente.


0

Ho provato alcune di queste soluzioni, ma non hanno funzionato del tutto (anche se erano decisamente sulla buona strada!)

Alla fine il mio errore è stato:

FATAL: autenticazione password non riuscita per l'utente

quando ho eseguito il seguente comando: psql

Quindi ho eseguito questi due comandi:

dropdb()
createdb()

NOTA: questo sarà rimuovere il db, ma non ho bisogno e per qualche ragione ho potuto accedere più pqsl, così ho rimosso e ricreato. Quindi ha psqllavorato di nuovo.


0

Non sono sicuro che sia già stato aggiunto nelle risposte, la risposta di Anatolii Stepaniuk è stata molto utile, che è la seguente.

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

-1

Ha riscontrato questo problema durante l'installazione di postgresql tramite homebrew.

Ho dovuto creare il super user "postgres" predefinito con:

createuser - postgres interattivi rispondono a y per il superutente

createuser: l'utente interattivo risponde y per il superutente


-3

Ho ancora avuto il problema sopra dopo l'installazione di postgresql usando homebrew - l'ho risolto inserendo / usr / local / bin nel mio percorso prima di / usr / bin


-12

Nella sua spiegazione più semplice; è un problema noob. Sto solo scrivendo

pgres

risulterà in questa risposta.

pgres <db_name> 

avrà esito positivo senza errori se l'utente dispone delle autorizzazioni per accedere al database.

Si può andare nei dettagli delle variabili d'ambiente esportate, ma non è necessario .. questo è troppo semplice per fallire per qualsiasi altro motivo.


5
Davvero non mi piace il "tipo di linguaggio noob problem"
Kimmo Hintikka,

Inoltre non ha raccomandato come risolvere il problema, quindi non ha risposto alla domanda.
Deborah,

1
mai sentito parlare dipgres
Glenn Plas il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.