psql: FATAL: la base de données «<user>» n'existe pas

723

J'utilise l'application PostgreSql pour mac ( http://postgresapp.com/ ). Je l'ai utilisé dans le passé sur d'autres machines, mais cela me pose des problèmes lors de l'installation sur mon macbook. J'ai installé l'application et j'ai exécuté:

psql -h localhost

Il renvoie:

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

Il semble que je ne puisse même pas exécuter la console pour créer la base de données qu'elle tente de trouver. La même chose se produit quand je viens de courir:

psql 

ou si je lance psql depuis le menu déroulant de l'application:

Statistiques de la machine:

  • OSX 10.8.4

  • psql (PostgreSQL) 9.2.4

Toute aide est appréciée.

J'ai également essayé d'installer PostgreSql via homebrew et j'obtiens le même problème. J'ai également lu la page de documentation des applications qui indique:

Lorsque Postgres.app démarre pour la première fois, il crée la base de données $ USER, qui est la base de données par défaut pour psql lorsqu'aucune n'est spécifiée. L'utilisateur par défaut est $ USER, sans mot de passe.

Il semblerait donc que l'application ne crée pas $ USER mais j'ai installé-> désinstallé-réinstallé plusieurs fois maintenant, donc cela doit être quelque chose avec ma machine.

J'ai trouvé la réponse, mais je ne sais pas exactement comment cela fonctionne, car l'utilisateur qui a répondu sur ce fil -> Faire fonctionner Postgresql sur Mac: la base de données "postgres" n'existe pas n'a pas suivi. J'ai utilisé la commande suivante pour ouvrir psql:

psql -d template1

Je vais laisser celui-ci sans réponse jusqu'à ce que quelqu'un puisse expliquer pourquoi cela fonctionne.

Ryan Rich
la source
3
Que psql -d postgres -U postgres -h localhostmontre-t-on? Sans drapeaux, il s'agit par défaut de l'utilisateur CLI, et j'aurais dit qu'il s'agissait par défaut de la base de données d'administration "postgres" mais je n'ai pas de mac pour tester.
bma
@bma Cela me donne psql: FATAL: le rôle "postgres" n'existe pas, ce qui m'a amené à l'origine ici -> stackoverflow.com/questions/15301826/… . J'ai essayé d'utiliser cette réponse mais j'obtiens le même résultat -> psql: FATAL: la base de données "utilisateur" n'existe pas
Ryan Rich
Avez-vous regardé dans le journal db? Je me demande si plus de détails y seraient émis.
bma
12
J'ai eu le même problème. Faire juste a createdb <user>fonctionné pour moi.
poshaughnessy
exécutez la commande en tant que psql -U user -d postgres, cela garantit que l'utilisateur est connecté à la base de données postgres, qui est déjà présente. Nous devons donc transmettre la base de données également lors de la connexion.
Anil

Réponses:

1174

Il semble que votre gestionnaire de packages n'ait pas réussi à créer la base de données nommée $ user pour vous. La raison pour laquelle

psql -d template1

fonctionne pour vous est que template1 est une base de données créée par postgres lui-même, et est présente sur toutes les installations. Vous êtes apparemment en mesure de vous connecter à template1, vous devez donc avoir des droits qui vous sont attribués par la base de données. Essayez ceci à l'invite du shell:

createdb

puis voyez si vous pouvez vous reconnecter avec

psql -h localhost

Cela créera simplement une base de données pour votre utilisateur de connexion, ce qui, je pense, est ce que vous recherchez. Si createdb échoue, alors vous n'avez pas suffisamment de droits pour créer votre propre base de données, et vous devrez trouver comment réparer le package homebrew.

Kirk Roybal
la source
38
Dans mon cas, j'ai écrit $ createdb -h localhostpour résoudre l'erreur could not connect to database postgres: could not connect to server. Après cela, je peux me connecter à la console postgresql via psql -h localhost.
ExiRe
Je reçois toujours un mot de passe et je ne sais pas lequel est-ce, lequel est le mot de passe par défaut de l'application postgres?
LasagnaAndroid
2
Merci @Kirk. Avons-nous vraiment besoin -d template1de votre première commande? J'ai vu "template1" dans des tutoriels partout sur Internet mais cela ne sert qu'à me confondre. Une approche plus logique serait, à mon avis 1) Créer l'utilisateur PostgreSQL, par exemple "usera" 2) Créer une base de données avec le même nom que l'utilisateur "usera" (Je pense que c'est fou mais il semble que PostgreSQL l'exige) 3) Connectez-vous à PostgreSQL en tant que super utilisateur "postgres" et attribuez les privilèges de la base de données "usera" à l'utilisateur "usera" (oh mon dieu, est-ce vraiment la vraie vie?)
ericn
@eric: Le -d template1 n'est là que pour vérifier que l'OP peut se connecter. Puisqu'il est créé au moment d'initdb, il existe toujours et était une vérification facile. À partir de ce moment, votre procédure est généralement «réelle».
Kirk Roybal
@ExiRe Vous venez de guérir un énorme mal de tête que j'avais avec une simple commande. Merci!
Dave Munger
194

Depuis le terminal, exécutez simplement la commande dans votre fenêtre d'invite de commande. (Pas à l'intérieur de psql) .

createdb <user>

Et puis essayez à nouveau d'exécuter postgres.

Dhananjay
la source
3
Beau! Ça y est! Après avoir exécuté cela, toutes les commandes psql fonctionnent comme par magie! Merci beaucoup!
naturaliste du
1
Et j'essayais dans le modèle psql. putain
user1735921
2
vous pouvez aussi simplement courircreatedb
Mantisimo
astuce pour les utilisateurs comme moi;) (Pas dans psql). signifie que lorsque vous ouvrez simplement la fenêtre du terminal, entrez simplement cette commande createdb comme première commande, puis essayez de vous connecter dans psql.
Rohan Dodeja
Génial! A travaillé pour moi sur OSX.
darkhipo
150

Par défaut, postgres essaie de se connecter à une base de données portant le même nom que votre utilisateur. Pour éviter ce comportement par défaut, spécifiez simplement l'utilisateur et la base de données:

psql -U Username DatabaseName 
Aneer Dev
la source
14
Merci, connaissez-vous la raison d'une telle conception - pourquoi diable voudrais-je utiliser la base de données de mon nom par défaut?
Eric
3
Les bases de données @eric sont souvent utilisées par les services fonctionnant en tant qu'utilisateur dédié. Je suppose donc que la stratégie consistant à utiliser le nom d'utilisateur comme nom de base de données par défaut est probablement plus utile que d'utiliser un nom de base de données par défaut fixe (par exemple, "postgres").
user686249
5
comment exécutez-vous un script SQL qui crée réellement une base de données? dans mon cas, il essaie toujours de se connecter à la base de données <utilisateur> lorsque mon objectif est de créer une autre base de données: psql -U Username -f create_db.sqlcela renverra une erreur:database Username doesn't exists
Kostanos
Fantastique réponse merci, mais pose la question pourquoi n'est-ce pas dans l'aide en ligne de commande? psql --help
Shawn Vader
1
psql -U Username postgresquand vous n'avez pas encore de bases de données
Anatolii Stepaniuk
59
  1. Connectez-vous en tant qu'utilisateur par défaut: sudo -i -u postgres
  2. Créer un nouvel utilisateur: createuser --interactive
  3. Lorsque vous êtes invité à entrer le nom du rôle, entrez le nom d'utilisateur linux et sélectionnez Oui à la question du superutilisateur.
  4. Toujours connecté en tant qu'utilisateur postgres, créez une base de données: createdb <username_from_step_3>
  5. Confirmez que les erreurs ont disparu en entrant: psqlà l'invite de commande.
  6. La sortie doit montrer psql (x.x.x) Type "help" for help.
user286539
la source
Mec, tu m'as fait gagner beaucoup de temps.
Jp Reddy
J'avais besoin de le faire sous Windows. Définissez le nouveau nom d'utilisateur pg sur Linux. Fixé.
RichieRich
Cela a fonctionné pour moi comme un charme
Promise Preston
42

Connectez-vous en utilisant la base de données template1 par défaut:

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

Créez une base de données avec votre ID utilisateur:

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

Quittez puis reconnectez-vous

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
la source
20

J'ai rencontré la même erreur lorsque j'ai essayé d'ouvrir postgresql sur mac

psql: FATAL:  database "user" does not exist

J'ai trouvé cette commande simple pour le résoudre:

méthode1

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

et tapez

 psql

Méthode 2:

psql -d postgres
Dinesh Pallapa
la source
5
La méthode 2 m'a sauvé la vie
tom10271
9

Eu le même problème, un simple l'a psql -d postgresfait (Tapez la commande dans le terminal)

rouille
la source
6

Cette erreur peut également se produire si la variable d'environnement PGDATABASE est définie sur le nom d'une base de données qui n'existe pas.

Sur OSX, j'ai vu l'erreur suivante en essayant de lancer psql à partir du menu Postgress.app:

psql: FATAL: database "otherdb" does not exist

La solution à l'erreur était de supprimer export PGDATABASE=otherdbde ~/.bash_profile:

En outre, si PGUSER est défini sur autre chose que votre nom d'utilisateur, l'erreur suivante se produit:

psql: FATAL: role "note" does not exist

La solution est de retirer export PGUSER=notmede ~/.bash_profile.

sdhca
la source
5

Après l'installation de postgres, dans ma version de cas est 12.2, j'ai exécuté la commande ci-dessous createdb.

$ createdb `whoami`

$ psql

psql (12.2)
Type "help" for help.

macuser=# 
SuperNova
la source
cheers cela a fonctionné pour moi
FaISalBLiNK
4

Étant donné que cette question est la première dans les résultats de recherche, je mettrai ici une solution différente pour un problème différent, afin de ne pas avoir de titre en double.

Le même message d'erreur peut apparaître lors de l'exécution d'un fichier de requête psqlsans spécifier de base de données. Puisqu'il n'y a aucune useinstruction dans postgresql, nous devons spécifier la base de données sur la ligne de commande, par exemple:

psql -d db_name -f query_file.sql
Babken Vardanyan
la source
1
et db template1 existe toujours
jan
4

Comme l'indique la documentation de createdb :

La première base de données est toujours créée par la commande initdb lorsque la zone de stockage des données est initialisée ... Cette base de données est appelée postgres.

Donc, si certaines distributions OS / postgresql le font différemment, ce n'est certainement pas le standard / standard (juste vérifié que initdbsur openSUSE 13.1 crée la base de données "postgres", mais pas "<user>"). Longue histoire courte,psql -d postgres on s'attend à ce qu'il soit utilisé lors de l'utilisation d'un utilisateur autre que "postgres".

De toute évidence, la réponse acceptée, exécutée createdbpour créer une base de données nommée comme l'utilisateur, fonctionne également, mais crée une base de données superflue.

user686249
la source
1

eu le problème avec l'utilisation du pilote JDBC, il suffit donc d'ajouter la base de données (peut-être de manière redondante selon l'outil que vous pouvez utiliser) après le nom d'hôte dans l'URL, par exemple jdbc:postgres://<host(:port)>/<db-name>

plus de détails sont documentés ici: http://www.postgresql.org/docs/7.4/static/jdbc-use.html#JDBC-CONNECT

Andreas Dietrich
la source
Je sais que c'est un peu hors sujet étant donné qu'il n'a été demandé que psql, mais Google m'a amené ici avec mon problème, donc je pense qu'il vaut la peine de le mentionner ici
Andreas Dietrich
1

Connectez-vous à PostgreSQL via le superutilisateur existant.

Créez une base de données avec le nom de l'utilisateur via lequel vous vous connectez à postgres.

create database username;

Essayez maintenant de vous connecter via le nom d'utilisateur

Sameer Kumar Choudhary
la source
1

Essayez d'utiliser-

psql -d postgres

J'étais également confronté au même problème lorsque j'ai couru psql

hardik chugh
la source
0

Tout d'abord, il est utile de créer une base de données nommée de la même manière que votre utilisation actuelle, pour éviter l'erreur lorsque vous souhaitez simplement utiliser la base de données par défaut et créer de nouvelles tables sans déclarer explicitement le nom d'une base de données.

Remplacez "skynotify" par votre nom d'utilisateur:

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

-d déclare explicitement la base de données à utiliser par défaut pour les instructions SQL qui n'incluent pas explicitement un nom de base de données pendant cette session interactive.

BASES POUR OBTENIR UNE IMAGE CLAIRE DE CE QUE VOTRE SERVEUR PostgresQL contient.

Vous devez vous connecter à une base de données existante pour utiliser psql de manière interactive. Heureusement, vous pouvez demander à psql une liste de bases de données:

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)

Cela ne démarre PAS la console interactive, il génère simplement un tableau basé sur du texte vers le terminal.

Comme le dit une autre réponse, postgres est toujours créé, vous devez donc l'utiliser comme base de données à sécurité intégrée lorsque vous souhaitez simplement que la console démarre pour fonctionner sur d'autres bases de données. Si ce n'est pas le cas, répertoriez les bases de données, puis utilisez l'une d'entre elles.

De la même manière, sélectionnez des tables dans une base de données:

psql -d postgres -c "\dt;"

Ma base de données "postgres" n'a pas de tables, mais n'importe quelle base de données qui en sortira une table texte sur le terminal (sortie standard).

Et pour être complet, nous pouvons également sélectionner toutes les lignes d'une table:

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

.

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

Même si aucune ligne n'est retournée, vous obtiendrez les noms des champs.

Si vos tables ont plus d'une douzaine de lignes, ou si vous n'êtes pas sûr, il sera plus utile de commencer par un nombre de lignes pour comprendre la quantité de données dans votre base de données:

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

.

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

Et ne pensez pas que cette "1 ligne" vous déroute, elle représente simplement le nombre de lignes renvoyées par la requête, mais la 1 ligne contient le nombre souhaité, qui est 0 dans cet exemple.

REMARQUE: un db créé sans propriétaire défini sera la propriété de l'utilisateur actuel.

Sky Notify
la source
0

J'ai essayé certaines de ces solutions, mais elles ne fonctionnaient pas tout à fait (même si elles étaient bien sur la bonne voie!)

Au final, mon erreur a été:

FATAL: l'authentification par mot de passe a échoué pour l'utilisateur

lorsque j'ai exécuté la commande suivante: psql

Alors j'ai couru ces deux commandes:

dropdb()
createdb()

REMARQUE: cela va enlever le db, mais je ne l' ai pas besoin et pour une raison quelconque , je ne pouvais plus PQSL d'accès, donc je l' ai enlevé et recréée. Puis psqltravaillé à nouveau.

Ben Cartwright
la source
0

Je ne sais pas si elle est déjà ajoutée dans les réponses, la réponse d'Anatolii Stepaniuk a été très utile, ce qui est le suivant.

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

J'ai eu ce problème lors de l'installation de postgresql via homebrew.

J'ai dû créer le super utilisateur par défaut "postgres" avec:

createuser - postgres interactif répond y à pour super utilisateur

createuser - utilisateur interactif répond y à pour super utilisateur

unom
la source
-3

J'ai toujours eu le problème ci-dessus après l'installation de postgresql en utilisant homebrew - je l'ai résolu en mettant / usr / local / bin sur mon chemin avant / usr / bin

matw50
la source
-12

Dans son explication la plus simple; c'est un problème de noob. Il suffit de taper

pgres

entraînera cette réponse.

pgres <db_name> 

réussira sans erreur si l'utilisateur dispose des autorisations d'accès à la base de données.

On peut entrer dans les détails des variables d'environnement exportées mais ce n'est pas nécessaire .. c'est trop basique pour échouer pour toute autre raison.

John Doe
la source
5
Je n'aime vraiment pas le "type de langage de problème noob"
Kimmo Hintikka
De plus, il n'a pas recommandé comment résoudre le problème, il n'a donc pas répondu à la question.
Deborah
1
jamais entendu parlerpgres
Glenn Plas