psql: FATAL: Datenbank "<Benutzer>" existiert nicht

722

Ich verwende die PostgreSql-App für Mac ( http://postgresapp.com/ ). Ich habe es in der Vergangenheit auf anderen Computern verwendet, aber es bereitet mir Probleme bei der Installation auf meinem MacBook. Ich habe die Anwendung installiert und ausgeführt:

psql -h localhost

Es gibt zurück:

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

Anscheinend kann ich nicht einmal die Konsole ausführen, um die Datenbank zu erstellen, die gesucht werden soll. Das gleiche passiert, wenn ich gerade renne:

psql 

oder wenn ich psql über das Dropdown-Menü der Anwendung starte:

Maschinenstatistik:

  • OSX 10.8.4

  • psql (PostgreSQL) 9.2.4

Jede Hilfe wird geschätzt.

Ich habe auch versucht, PostgreSql über Homebrew zu installieren, und ich bekomme das gleiche Problem. Ich habe auch die Anwendungsdokumentationsseite gelesen, auf der es heißt:

Beim ersten Start von Postgres.app wird die $ USER-Datenbank erstellt. Dies ist die Standarddatenbank für psql, wenn keine angegeben ist. Der Standardbenutzer ist $ USER ohne Kennwort.

Es scheint also, dass die Anwendung $ USER nicht erstellt, aber ich habe jetzt mehrmals installiert-> deinstalliert-neu installiert, also muss es etwas mit meinem Computer sein.

Ich habe die Antwort gefunden, bin mir aber nicht sicher, wie sie genau funktioniert, da der Benutzer, der auf diesen Thread geantwortet hat -> Postgresql unter Mac zum Laufen bringen: Die Datenbank "postgres" existiert nicht, nicht nachverfolgt hat . Ich habe den folgenden Befehl verwendet, um psql zum Öffnen zu bringen:

psql -d template1

Ich werde diese unbeantwortet lassen, bis jemand eine Erklärung dafür liefern kann, warum dies funktioniert.

Ryan Rich
quelle
3
Was psql -d postgres -U postgres -h localhostzeigt? Ohne Flags wird standardmäßig der CLI-Benutzer verwendet, und ich hätte gesagt, dass standardmäßig die Administrator-Datenbank "postgres" verwendet wird, aber ich habe keinen Mac zum Testen.
BMA
@bma Das gibt mir psql: FATAL: Rolle "postgres" existiert nicht, was mich ursprünglich hierher gebracht hat -> stackoverflow.com/questions/15301826/… . Ich habe versucht, diese Antwort zu verwenden, aber ich erhalte das gleiche Ergebnis -> psql: FATAL: Datenbank "Benutzer" existiert nicht
Ryan Rich
Hast du im Datenbankprotokoll nachgesehen? Ich frage mich, ob dort mehr Details ausgegeben würden.
BMA
12
Ich hatte das gleiche Problem. Nur das createdb <user>hat für mich funktioniert.
poshaughnessy
Führen Sie den Befehl als aus psql -U user -d postgres, um sicherzustellen, dass der Benutzer mit der bereits vorhandenen Postgres-Datenbank verbunden ist. Wir müssen also die Datenbank auch beim Anmelden übergeben.
Anil

Antworten:

1172

Es scheint, dass Ihr Paketmanager die Datenbank mit dem Namen $ user nicht für Sie erstellt hat. Der Grund dass

psql -d template1

Für Sie funktioniert, dass template1 eine Datenbank ist, die von postgres selbst erstellt wurde und in allen Installationen vorhanden ist. Sie können sich anscheinend bei template1 anmelden, daher müssen Ihnen einige Rechte von der Datenbank zugewiesen worden sein. Versuchen Sie dies an einer Shell-Eingabeaufforderung:

createdb

und dann sehen Sie, ob Sie sich erneut mit anmelden können

psql -h localhost

Dadurch wird einfach eine Datenbank für Ihren Login-Benutzer erstellt, nach der Sie meiner Meinung nach suchen. Wenn createdb fehlschlägt, haben Sie nicht genügend Rechte, um Ihre eigene Datenbank zu erstellen, und Sie müssen herausfinden, wie Sie das Homebrew-Paket reparieren können.

Kirk Roybal
quelle
38
In meinem Fall habe ich geschrieben $ createdb -h localhost, um den Fehler zu beheben could not connect to database postgres: could not connect to server. Danach kann ich mich über mit der postgresql-Konsole verbinden psql -h localhost.
ExiRe
Ich erhalte immer noch eine Passwortabfrage und habe keine Ahnung, um welches es sich handelt. Welches ist das Standardkennwort für die Postgres-App?
LasagneAndroid
2
Danke @Kirk. Brauchen wir wirklich -d template1in Ihrem ersten Befehl? Ich habe "template1" in Tutorials im ganzen Internet gesehen, aber es dient nur dazu, mich zu verwirren. Ein logischerer Ansatz wäre meiner Meinung nach 1) Erstellen des PostgreSQL-Benutzers, z. B. "usera" 2) Erstellen einer Datenbank mit demselben Namen wie der Benutzer "usera" (Ich denke, das ist verrückt, aber es scheint, dass PostgreSQL es erfordert) 3) Melden Sie sich bei PostgreSQL als Superuser "postgres" an und weisen Sie dem Benutzer "usera" die Berechtigungen der Datenbank "usera" zu (oh mein Gott, ist das wirklich das wirkliche Leben?)
ericn
@eric: Die -d template1 dient nur dazu, zu überprüfen, ob sich das OP überhaupt anmelden kann. Da es zur Zeit von initdb erstellt wird, existiert es immer und war eine einfache Überprüfung. Ab diesem Zeitpunkt ist Ihr Verfahren im Allgemeinen "reales Leben".
Kirk Roybal
@ExiRe Du hast gerade massive Kopfschmerzen geheilt, die ich mit einem einfachen Befehl hatte. Vielen Dank!
Dave Munger
193

Führen Sie vom Terminal aus den Befehl in Ihrem Eingabeaufforderungsfenster aus. (Nicht innerhalb von psql) .

createdb <user>

Und dann versuchen Sie erneut, Postgres auszuführen.

Dhananjay
quelle
3
Wunderschönen! Das hat es geschafft! Nachdem Sie dies ausgeführt haben, funktionieren alle psql-Befehle wie ein Zauber! Danke vielmals!
Thenaturalist
1
Und ich habe versucht, in psql Vorlage. verdammt
user1735921
2
Sie können auch einfach laufencreatedb
Mantisimo
Tipp für Benutzer wie mich;) (Nicht in psql). bedeutet, wenn Sie nur das Terminalfenster öffnen, geben Sie einfach diesen createb als ersten Befehl ein und versuchen Sie dann, sich in psql anzumelden.
Rohan Dodeja
Großartig! Arbeitete für mich unter OSX.
Darkhipo
150

Standardmäßig versucht postgres, eine Verbindung zu einer Datenbank mit demselben Namen wie Ihr Benutzer herzustellen. Um dieses Standardverhalten zu verhindern, geben Sie einfach Benutzer und Datenbank an:

psql -U Username DatabaseName 
Aneer Dev
quelle
14
Vielen Dank, kennen Sie den Grund für ein solches Design - warum in aller Welt sollte ich standardmäßig meine Namensdatenbank verwenden?
Ericic
3
@eric-Datenbanken werden häufig von Diensten verwendet, die als dedizierter Benutzer ausgeführt werden. Daher denke ich, dass die Strategie, den Benutzernamen als Standarddatenbanknamen zu verwenden, wahrscheinlich nützlicher ist als die Verwendung eines festen Standarddatenbanknamens (z. B. "postgres").
user686249
5
Wie führt man ein SQL-Skript aus, das tatsächlich eine Datenbank erstellt? In meinem Fall wird immer versucht, eine Verbindung zur Datenbank <Benutzer> psql -U Username -f create_db.sqldatabase Username doesn't exists
herzustellen,
Fantastische Antwort danke, wirft aber die Frage auf, warum es nicht in der Kommandozeile hilft? psql --help
Shawn Vader
1
psql -U Username postgreswenn Sie noch keine Datenbanken haben
Anatolii Stepaniuk
59
  1. Als Standardbenutzer anmelden: sudo -i -u postgres
  2. Neuen Benutzer erstellen: createuser --interactive
  3. Wenn Sie zur Eingabe des Rollennamens aufgefordert werden, geben Sie den Linux-Benutzernamen ein und wählen Sie Ja zur Superuser-Frage.
  4. Noch als Postgres-Benutzer angemeldet, erstellen Sie eine Datenbank: createdb <username_from_step_3>
  5. Bestätigen Sie, dass die Fehler behoben sind, indem Sie psqlan der Eingabeaufforderung Folgendes eingeben.
  6. Die Ausgabe sollte anzeigen psql (x.x.x) Type "help" for help.
user286539
quelle
Mann, du hast mir viel Zeit gespart.
Jp Reddy
Ich musste dies in Windows tun. Setzen Sie den neuen pg-Benutzernamen auf Linux un. Fest.
RichieRich
Das funktionierte für mich wie ein Zauber
Promise Preston
41

Melden Sie sich mit der Standarddatenbank template1 an:

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

Erstellen Sie eine Datenbank mit Ihrer Benutzer-ID:

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

Beenden Sie und melden Sie sich erneut an

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)
Gogasca
quelle
20

Beim Versuch, postgresql auf einem Mac zu öffnen, trat der gleiche Fehler auf

psql: FATAL:  database "user" does not exist

Ich habe diesen einfachen Befehl gefunden, um ihn zu lösen:

Methode 1

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

und Typ

 psql

Methode 2:

psql -d postgres
Dinesh Pallapa
quelle
5
Methode 2 hat mir das Leben gerettet
tom10271
9

Hatte das gleiche Problem, ein einfaches psql -d postgrestat es (Geben Sie den Befehl in das Terminal ein)

Rost
quelle
6

Dieser Fehler kann auch auftreten, wenn die Umgebungsvariable PGDATABASE auf den Namen einer nicht vorhandenen Datenbank festgelegt ist.

Unter OSX wurde beim Versuch, psql über das Menü Postgress.app zu starten, der folgende Fehler angezeigt:

psql: FATAL: database "otherdb" does not exist

Die Lösung der Fehler war zu entfernen export PGDATABASE=otherdbaus ~/.bash_profile:

Wenn PGUSER auf einen anderen Wert als Ihren Benutzernamen eingestellt ist, tritt der folgende Fehler auf:

psql: FATAL: role "note" does not exist

Die Lösung ist zu entfernen export PGUSER=notmeaus ~/.bash_profile.

sdhca
quelle
5

Nach der Installation von postgres habe ich in meiner Fallversion 12.2 den folgenden Befehl ausgeführt createdb.

$ createdb `whoami`

$ psql

psql (12.2)
Type "help" for help.

macuser=# 
SuperNova
quelle
Prost,
4

Da diese Frage die erste in den Suchergebnissen ist, werde ich hier ohnehin eine andere Lösung für ein anderes Problem finden, um keinen doppelten Titel zu haben.

Dieselbe Fehlermeldung kann auftreten, wenn eine Abfragedatei psqlohne Angabe einer Datenbank ausgeführt wird. Da es usein postgresql keine Anweisung gibt, müssen wir die Datenbank in der Befehlszeile angeben, zum Beispiel:

psql -d db_name -f query_file.sql
Babken Vardanyan
quelle
1
und db template1 immer existiert
jan
4

In der erstellten Dokumentation heißt es:

Die erste Datenbank wird immer vom Befehl initdb erstellt, wenn der Datenspeicherbereich initialisiert wird ... Diese Datenbank heißt postgres.

Wenn also bestimmte OS / postgresql-Distributionen dies anders machen, ist dies sicherlich nicht der Standard / Standard (nur überprüft, dass initdbunter openSUSE 13.1 die DB "postgres" erstellt wird, aber nicht "<user>"). Um es kurz zu machen,psql -d postgres Rede, kurzer Sinn wird voraussichtlich verwendet, wenn ein anderer Benutzer als "postgres" verwendet wird.

Offensichtlich createdbfunktioniert die akzeptierte Antwort, die ausgeführt wird , um eine Datenbank mit dem Namen "Benutzer" zu erstellen, ebenfalls, erstellt jedoch eine überflüssige Datenbank.

user686249
quelle
1

hatte das Problem mit der Verwendung des JDBC-Treibers, so dass man nur die Datenbank (möglicherweise redundant, abhängig vom verwendeten Tool) nach dem Hostnamen in der URL hinzufügen muss, z jdbc:postgres://<host(:port)>/<db-name>

Weitere Details sind hier dokumentiert: http://www.postgresql.org/docs/7.4/static/jdbc-use.html#JDBC-CONNECT

Andreas Dietrich
quelle
Ich weiß, dass es ein wenig vom Thema abweicht, wenn man bedenkt, dass es nur nach psql gefragt wurde, aber Google hat mich mit meinem Problem hierher gebracht, daher denke ich, dass es hier erwähnenswert ist
Andreas Dietrich
1

Stellen Sie über den vorhandenen Superuser eine Verbindung zu Postgres her.

Erstellen Sie eine Datenbank mit dem Namen des Benutzers, über den Sie eine Verbindung zu postgres herstellen.

create database username;

Versuchen Sie nun, eine Verbindung über den Benutzernamen herzustellen

Sameer Kumar Choudhary
quelle
1

Versuchen Sie es mit-

psql -d postgres

Ich hatte auch das gleiche Problem, als ich rannte psql

Hardik Chugh
quelle
0

Zunächst ist es hilfreich, eine Datenbank mit dem gleichen Namen wie Ihre aktuelle Verwendung zu erstellen, um den Fehler zu vermeiden, wenn Sie nur die Standarddatenbank verwenden und neue Tabellen erstellen möchten, ohne den Namen einer Datenbank explizit zu deklarieren.

Ersetzen Sie "skynotify" durch Ihren Benutzernamen:

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

-d gibt explizit an, welche Datenbank als Standard für SQL-Anweisungen verwendet werden soll, die während dieser interaktiven Sitzung nicht explizit einen Datenbanknamen enthalten.

GRUNDLAGEN, UM EIN KLARES BILD ZU ERHALTEN, WAS IHR PostgresQL-SERVER enthält.

Sie müssen eine Verbindung zu einer vorhandenen Datenbank herstellen, um psql interaktiv verwenden zu können. Glücklicherweise können Sie psql nach einer Liste von Datenbanken fragen:

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)

Dadurch wird die interaktive Konsole NICHT gestartet, sondern nur eine textbasierte Tabelle an das Terminal ausgegeben.

Wie in einer anderen Antwort angegeben, wird postgres immer erstellt. Sie sollten es daher als ausfallsichere Datenbank verwenden, wenn Sie nur möchten, dass die Konsole mit anderen Datenbanken funktioniert. Wenn es nicht vorhanden ist, listen Sie die Datenbanken auf und verwenden Sie eine davon.

Wählen Sie auf ähnliche Weise Tabellen aus einer Datenbank aus:

psql -d postgres -c "\dt;"

Meine "postgres" -Datenbank enthält keine Tabellen, aber jede Datenbank, die dies tut, gibt eine textbasierte Tabelle an das Terminal aus (Standardausgang).

Der Vollständigkeit halber können wir auch alle Zeilen aus einer Tabelle auswählen:

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

.

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

Selbst wenn keine Zeilen zurückgegeben werden, erhalten Sie die Feldnamen.

Wenn Ihre Tabellen mehr als ein Dutzend Zeilen enthalten oder Sie sich nicht sicher sind, ist es sinnvoller, mit einer Anzahl von Zeilen zu beginnen, um zu verstehen, wie viele Daten sich in Ihrer Datenbank befinden:

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

.

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

Und nicht, dass "1 Zeile" Sie verwirrt, es gibt nur an, wie viele Zeilen von der Abfrage zurückgegeben werden, aber die 1 Zeile enthält die gewünschte Anzahl, in diesem Beispiel 0.

HINWEIS: Eine Datenbank, die ohne definierten Eigentümer erstellt wurde, gehört dem aktuellen Benutzer.

Sky benachrichtigen
quelle
0

Ich habe einige dieser Lösungen ausprobiert, aber sie haben nicht ganz funktioniert (obwohl sie sehr auf dem richtigen Weg waren!)

Am Ende war mein Fehler:

FATAL: Kennwortauthentifizierung für Benutzer fehlgeschlagen

als ich den folgenden Befehl ausführte: psql

Also habe ich diese beiden Befehle ausgeführt:

dropdb()
createdb()

HINWEIS: Dies wird die db zu entfernen, aber ich habe es nicht brauchen und aus irgendeinem Grunde konnte ich keinen Zugriff mehr PQSL, so dass ich entfernt und neu erstellt es. Dann psqlwieder gearbeitet.

Ben Cartwright
quelle
0

Nicht sicher, ob es bereits in den Antworten hinzugefügt wurde, war Anatolii Stepaniuk Antwort sehr hilfreich, die die folgenden ist.

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

Hatte dieses Problem bei der Installation von postgresql über Homebrew.

Musste den Standard "postgres" Superuser erstellen mit:

createuser - interaktive Postgres-Antwort y für Superuser

createuser - interaktive Benutzerantwort y auf für Superuser

unom
quelle
-3

Ich hatte nach der Installation von postgresql mit homebrew immer noch das oben genannte Problem. Ich habe es behoben, indem ich / usr / local / bin vor / usr / bin in meinen Pfad eingefügt habe

matw50
quelle
-12

In seiner einfachsten Erklärung; Es ist kein Problem. Einfach tippen

pgres

wird zu dieser Antwort führen.

pgres <db_name> 

wird ohne Fehler erfolgreich sein, wenn der Benutzer die Berechtigung hat, auf die Datenbank zuzugreifen.

Man kann auf die Details der exportierten Umgebungsvariablen eingehen, aber das ist unnötig. Dies ist zu grundlegend, um aus einem anderen Grund fehlzuschlagen.

John Doe
quelle
5
Ich mag den "Noob Issue Type of Language" wirklich nicht
Kimmo Hintikka
Außerdem wurde nicht empfohlen, das Problem zu beheben, und die Frage wurde nicht beantwortet.
Deborah
1
noch nie gehört vonpgres
Glenn Plas