psql: FATAL: le rôle «postgres» n'existe pas

406

Je suis un novice postgres.

J'ai installé le postgres.app pour mac. Je jouais avec les commandes psql et j'ai accidentellement abandonné la base de données postgres. Je ne sais pas ce qu'il y avait dedans.

Je travaille actuellement sur un tutoriel: http://www.rosslaird.com/blog/building-a-project-with-mezzanine/

Et je suis coincé sudo -u postgres psql postgres

MESSAGE D'ERREUR: psql: FATAL: role "postgres" does not exist

$ quel psql

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

C'est ce qui s'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)

Quelles sont donc les étapes à suivre? Supprimer tout ce qui concerne psql et réinstaller tout?

Merci pour l'aide les gars!

user805981
la source
1
Redémarrage de l'ordinateur. Garantit que Launchd from brew services start postresqlest exécuté.
Michael Dimmitt

Réponses:

411

REMARQUE: Si vous avez installé postgres en utilisant homebrew, consultez le commentaire de @ user3402754 ci-dessous.

Notez que le message d'erreur NE parle PAS d'une base de données manquante, il parle d'un rôle manquant. Plus tard dans le processus de connexion, il pourrait également tomber sur la base de données manquante.

Mais la première étape consiste à vérifier le rôle manquant: quelle est la sortie psqlde la commande \du? Sur mon système Ubuntu, la ligne appropriée ressemble à ceci:

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

S'il n'y a pas au moins un rôle avec superuser, alors vous avez un problème :-)

S'il y en a un, vous pouvez l'utiliser pour vous connecter. Et en regardant la sortie de votre \lcommande: Les autorisations pour userles bases de données template0et template1sont les mêmes que sur mon système Ubuntu pour le superutilisateur postgres. Je pense donc que votre configuration est simple à utiliser en usertant que superutilisateur. Vous pouvez donc essayer cette commande pour vous connecter:

sudo -u user psql user

Si userc'est vraiment le superutilisateur DB, vous pouvez créer un autre superutilisateur DB et une base de données privée et vide pour lui:

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

Mais comme votre configuration postgres.app ne semble pas le faire, vous ne devriez pas non plus. Adaptez simplement le tutoriel.

AH
la source
10
Pour moi, l'utilisateur n'était pas en cours de création - cela a plutôt fonctionné en CREATE USER postgres WITH SUPERUSER PASSWORD 'password'; utilisant postgres v10.
arcseldon
232
Si vous avez installé Postgres depuis, homebrewvous devez exécuter /usr/local/opt/postgres/bin/createuser -s postgresvotre terminal
user3402754
8
J'ai du courir/usr/local/opt/postgresql/bin/createuser -s postgres
user1807782
1
@ user1807782 Vous avez sauvé ma journée; Je pense que vous devriez ajouter ceci comme réponse.
tolga
1
Si vous utilisez une version spécifique de postgres, vous devez inclure la version dans le chemin -/usr/local/opt/postgresql@11/bin/createuser -s postgres
Digitrance
264

La clé est "J'ai installé le postgres.app pour mac." Cette application configure l'installation locale de PostgreSQL avec un superutilisateur de base de données dont le nom de rôle est le même que votre nom de connexion (abrégé).

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.

Certains scripts (par exemple, une sauvegarde de base de données créée avec pgdumpun système Linux) et des didacticiels supposent que le superutilisateur a le nom de rôle traditionnel de postgres.

Vous pouvez rendre votre installation locale un peu plus traditionnelle et éviter ces problèmes en procédant une seule fois:

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

ce qui fera disparaître ces FATAL: le rôle "postgres" n'existe pas .

jwd630
la source
119
Si vous utilisez des postgres de Homebrew, alors vous voulez /usr/local/Cellar/postgresql/9.2.4/bin/createuser -s postgres(pour la version 9.2.4, évidemment).
Roger Lipscombe
1
Pour postgres.app 9.3, ils semblent avoir réorganisé les répertoires. J'ai essayé: /Applications/Postgres.app/Contents/Versions/9.3/bin/createuser -s postgres, mais cela a généré le même message d'erreur: "createuser: n'a pas pu se connecter à la base de données postgres: FATAL: le rôle" postgres "n'existe pas "
Michael Coxon,
7
/Applications/Postgres.app/Contents/Versions/9.3/bin/createuser -s postgrescouru correctement pour moi.
cjspurgeon
9
@RogerLipscombe si vous exécutez brew link postgresqlaprès l'installation, il n'est pas nécessaire d'ajouter le chemin complet à createuser, un simple createuser -s postgresfonctionnera très bien
AlessioX
2
createuser -s postgrestravaillé pour moi. J'ai installé postgres avec Homebrew
biniam
228

Pour Mac:

  1. Installer 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 postgresqui n'utilisera que la dernière version.
  5. démarrer manuellement le serveur postgres: pg_ctl -D /usr/local/var/postgres start

Pour démarrer le serveur au démarrage

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

Maintenant, il est configuré, connectez-vous en utilisant psql -U postgres -h localhostou utilisez PgAdmin pour l'interface graphique.

Par défaut, l'utilisateur postgresn'aura pas de mot de passe de connexion.

Consultez ce site pour plus d'articles comme celui-ci: https://medium.com/@Nithanaroy/installing-postgres-on-mac-18f017c5d3f7

Nitine
la source
3
Avec la dernière installation de brew, vous pouvez faire brew services start postgresqlpour démarrer postgres
Automatico
<3 <3 <3 <3 <3 <3
Adeel Ahmad
c'est la meilleure réponse
Alejandro Pablo Tkachuk
39
createuser postgres --interactive

ou faites un post-gresl de superutilisateur juste avec

createuser postgres -s
SubstanceMX
la source
J'ai trouvé cette réponse utile lorsque mon pgadmin a continué à demander un utilisateur postgres et que je n'ai pas de rôle postgres pour commencer, cette commande l'a créé, j'ai ajouté le pw généré automatiquement dans mon pgadmin et le problème a été résolu!
habituel
Cela fonctionne pour moi .. mais de cette façon: "créer des postgres utilisateur"
Roberto Rodriguez
31

Cela se produit lorsque vous exécutez initdbavec un utilisateur dont l'ID n'est pas postgres, sans spécifier le postgresnom d'utilisateur avec --username=postgresou -U postgres.

Le cluster de base de données est ensuite créé avec le compte d'utilisateur du système que vous avez utilisé pour exécuter initdb et il reçoit les autorisations de superutilisateur.

Pour le corriger, créez simplement un nouvel utilisateur nommé postgresavec l'option en --superuserutilisant l' createuserutilitaire fourni avec Postgres. L'utilitaire se trouve dans le binrépertoire Postgres . par exemple

createuser --superuser postgres

Si vous avez un nom d'hôte ou un port personnalisé, assurez-vous de définir les options appropriées .

N'oubliez pas de supprimer l'autre compte d'utilisateur créé pour vous par initdb.

isapir
la source
2
Ceci est la réponse la plus informative.
MyWrathAcademia
17

Pour moi, ce code a fonctionné:

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

il est venu d'ici: http://talk.growstuff.org/t/fatal-role-postgres-does-not-exist/216/4

Kevin Zhao
la source
Fonctionne aussi pour moi! Tu as sauvé mon bacon.
Dave Munger
1
Je reçois le rôle "moi" n'existe pas
SuperUberDuper
Est-ce à dire que ce nouvel utilisateur posgres n'aura pas de mot de passe?
olaoluwa_98
16

J'avais besoin de désamorcer $PGUSER:

$ unset PGUSER
$ createuser -s postgres
Beau Barker
la source
1
oh mec, j'ai finalement compris quel était le problème. Il se trouve que vous essayez de créer des postgres utilisateur en tant que postgres utilisateur
Taras Matsyk
14

Tout d' abord vous avez besoin de créer un utilisateur:

sudo -u postgres createuser --superuser $USER

Après avoir créé une base de données:

sudo -u postgres createdb $USER

Changement $USER le nom d'utilisateur de votre système.

Vous pouvez voir la solution complète ici .

ruzenhack
la source
8

L'exécuter sur la ligne de commande devrait le corriger

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

Alex Levine
la source
1
C'est la seule chose qui a fonctionné pour moi. Je vous remercie!
Herb Meehan
4

La suppression de la postgresbase de données n'a pas vraiment d'importance. Cette base de données est initialement vide et son objectif est simplementpostgres utilisateur ait une sorte de "maison" à laquelle se connecter, s'il en a besoin.

Vous pouvez toujours le recréer avec la commande SQL CREATE DATABASE postgres;

Notez que le didacticiel mentionné dans la question n'est pas écrit avec postgres.appà l'esprit. Contrairement à PostgreSQL pour Unix en général, postgres.appessaie de ressembler à une application normale par opposition à un service qui serait exécuté par un postgresutilisateur dédié disposant de privilèges différents de votre utilisateur normal.postgres.appest géré et géré par votre propre compte.

Donc, au lieu de cette commande:, sudo -u postgres psql -U postgresil serait plus dans l'esprit de postgres.app de simplement émettre:, psqlqui se connecte automatiquement à une base de données correspondant au nom de vos utilisateurs, et avec un compte db du même nom qui se trouve être superutilisateur, donc il peut tout faire en termes d'autorisations.

Daniel Vérité
la source
D'accord. Mais pourquoi est-ce que j'obtiens une erreur ERROR: cannot drop the currently open databaselorsque j'essaie de supprimer l'utilisateur db? N'est-ce pas une bonne pratique d'utiliser ce postgres.app?
user805981
Vous ne pouvez pas supprimer une base de données lorsque vous y êtes connecté. pourquoi voudriez-vous le supprimer de toute façon? C'est ici pour votre commodité.
Daniel Vérité
Je voulais juste voir si je pouvais. C'est donc comme une base de données par défaut correcte lorsque je démarre mon psql et postgres.app? Qu'en est-il maintenant des privilèges d'accès? Je ne peux plus les régler? Je vois que template0 et template1 ont des privilèges d'accès
user805981
@ user805981 Postgres.appest à des fins de test et de développement; il s'agit d'un package PostgreSQL de Heroku qui est conçu pour permettre aux utilisateurs Mac qui développent avec Ruby on Rails de tester plus facilement avec PostgreSQL au lieu du SQLite par défaut. Les utilisations de Rails avaient tendance à tester avec SQLite et à se déployer sur PostgreSQL, ce qui a causé toutes sortes de problèmes, donc Heroku a essayé de faciliter les tests sur PostgreSQL aussi. Postgres.appest bien pour les tests, mais je n'envisagerais pas de l'utiliser pour la production ou de vraies données, ce n'est tout simplement pas à cela.
Craig Ringer
4

Pour ce que ça vaut, j'ai Ubuntu et de nombreux packages installés et cela est entré en conflit avec lui.

Pour moi, la bonne réponse était:

sudo -i -u postgres-xc
psql
logiciel
la source
2

C'est le seul qui l'a corrigé pour moi:

createuser -s -U $USER
Bax
la source
2
Cela fait de l'utilisateur actuel un superutilisateur système plutôt qu'un simple superutilisateur postgres. Je dirais que ce serait généralement une mauvaise idée car elle contourne les politiques de sécurité habituelles. Vous devez utiliser l'utilisateur sudopour obtenir des privilèges de superutilisateur temporaires.
Sean Dawson
1

Sur le système Ubuntu, j'ai purgé PostgreSQL et l'ai réinstallé. Toutes les bases de données sont restaurées. Cela a résolu le problème pour moi.

Conseil - Prenez la sauvegarde des bases de données pour être du côté le plus sûr.

Gaurav Neema
la source
0

Je ne pense pas que sudo soit nécessaire ici car psql -l renvoie une liste de bases de données. Cela m'indique que initdb a été exécuté sous l'utilisateur actuel de l'utilisateur, pas sous l'utilisateur postgres.

Vous pouvez simplement:

psql

Et continuez le tutoriel.

Je suggérerais les points généraux d'AH de la création de l'utilisateur postgres et de la base de données car de nombreuses applications peuvent s'attendre à ce que cela existe.

Une brève explication:

PostgreSQL ne fonctionnera pas avec un accès administratif au système d'exploitation. Au lieu de cela, il s'exécute avec un utilisateur ordinaire et afin de prendre en charge l'authentification par les pairs (demandant au système d'exploitation qui essaie de se connecter), il crée un utilisateur et une base de données avec l'utilisateur qui exécute le processus d'initialisation. Dans ce cas, c'était votre utilisateur normal.

Chris Travers
la source
efface quelques distinctions importantes dans les postgres. Je vous remercie.
imsrgadich
0

Je suis resté coincé sur ce problème après l'avoir exécuté brew services stop postgresqlla veille.
Le lendemain: brew services start postgresqlne fonctionnerait pas. En effet, comme indiqué lors de l'installation à l'aide de homebrew. postgresql utilise un launchd ... qui se charge lorsque votre ordinateur est allumé.

résolution:
brew services start postgresql
redémarrez votre ordinateur.

Michael Dimmitt
la source
0

La \ducommande retourne:

Nom du rôle = postgres@implicit_files

Et cette postgres=# \password postgreserreur de retour de commande :

ERREUR: le rôle "postgres" n'existe pas.

Mais ça postgres=# \password postgres@implicit_files marche bien.

Aussi après sudo -u postgres createuser -s postgresla première variante fonctionne également.

Michael
la source