Comment vérifier l'état du serveur PostgreSQL Mac OS X

102

Comment puis-je savoir si mon serveur Postgresql fonctionne ou non?

Je reçois ce message:

[~/dev/working/sw] sudo bundle exec rake db:migrate 
rake aborted!
could not connect to server: Connection refused
    Is the server running on host "localhost" and accepting
    TCP/IP connections on port 5432?

Mettre à jour:

> which postgres
/usr/local/bin/postgres
> pg_ctl -D /usr/local/bin/postgres -l /usr/local/bin/postgres/server.log start
pg_ctl: could not open PID file "/usr/local/bin/postgres/postmaster.pid": Not a directory

Mise à jour 2:

>pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
server starting
sh: /usr/local/var/postgres/server.log: No such file or directory
Ramy
la source
1
Vous devriez également rechercher plusieurs versions de postgres sur Mac OS / X. Si vous avez installé postgres via homebrew, vous pouvez obtenir l'erreur ci-dessus lorsque votre chemin est mal configuré - je viens de truquer accidentellement mon chemin et tout a commencé à utiliser l'installation système de postgres qui ne fonctionnait pas très bien jusqu'à ce que j'ai ajusté le chemin vers utiliser l'installation de brassage
Jamie Cook

Réponses:

94

Le moyen le plus simple de vérifier les processus en cours:

ps auxwww | grep postgres

Et recherchez une commande qui ressemble à ceci (votre version n'est peut-être pas la 8.3):

/Library/PostgreSQL/8.3/bin/postgres -D /Library/PostgreSQL/8.3/data

Pour démarrer le serveur, exécutez quelque chose comme ceci:

/Library/PostgreSQL/8.3/bin/pg_ctl start -D /Library/PostgreSQL/8.3/data -l postgres.log
Bohème
la source
ok et si je ne trouve rien de tel, comment démarrer le serveur?
Ramy
4
pgrep postgresfonctionne également. Ou ps auxwww | grep [p]ostgrespour empêcher le grepde se faire ramasser.
Gregory Nisbet
1
Boo, sifflement re: la ps | grepsuggestion de faute professionnelle. pgrepest acceptable, à peine. pg_ctl statusc'est génial . ps auxwww | grep postgresva correspondre grep postgres, et less /var/log/postgres/whatever.
Charles Duffy
il est à noter que le répertoire du cluster de base de données /Library/PostgreSQL/8.3/dataest créé arbitrairement par l'utilisateur via la initdbcommande. voici le document 8.3
GPL
58

Vous pouvez exécuter la commande suivante pour déterminer si postgress est en cours d'exécution:

$ pg_ctl status

Vous voudrez également définir le PGDATA variable d'environnement.

Voici ce que j'ai dans mon ~/.bashrcdossier pour les postgres:

export PGDATA='/usr/local/var/postgres'
export PGHOST=localhost
alias start-pg='pg_ctl -l $PGDATA/server.log start'
alias stop-pg='pg_ctl stop -m fast'
alias show-pg-status='pg_ctl status'
alias restart-pg='pg_ctl reload'

Pour qu'ils prennent effet, n'oubliez pas de le rechercher comme suit:

$ . ~/.bashrc

Maintenant, essayez-le et vous devriez obtenir quelque chose comme ceci:

$ show-pg-status
pg_ctl: server is running (PID: 11030)
/usr/local/Cellar/postgresql/9.2.4/bin/postgres
l3x
la source
Compte tenu de votre message d'erreur, je parie que la suggestion de SamGoody d'exécuter votre commande initdb résoudra votre problème de "Connexion refusée". Une fois que c'est corrigé, essayez mes suggestions pour obtenir l'état de votre serveur postgres db.
l3x
26

Vous n'avez probablement pas initié postgres.

Si vous avez installé HomeBrew, l'initialisation doit être exécutée avant que quoi que ce soit d'autre devienne utilisable.

Pour voir les instructions, exécutez brew info postgres

# Create/Upgrade a Database
If this is your first install, create a database with:
     initdb /usr/local/var/postgres -E utf8

To have launchd start postgresql at login:
   ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents 
Then to load postgresql now:     
   launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist 
Or, if you don't want/need launchctl, you can just run:
    pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

Une fois que vous avez exécuté cela, il devrait dire quelque chose comme:

Succès. Vous pouvez maintenant démarrer le serveur de base de données en utilisant:

postgres -D /usr/local/var/postgres or
pg_ctl -D /usr/local/var/postgres -l logfile start

Si vous rencontrez toujours des problèmes, vérifiez votre pare-feu. Si vous en utilisez un bon comme HandsOff! et il a été configuré pour bloquer le trafic, votre page ne verra pas la base de données.

SamGoody
la source
20

Depuis PostgreSQL 9.3, vous pouvez utiliser la commande pg_isready pour déterminer l'état de connexion d'un serveur PostgreSQL.

À partir de la documentation :

pg_isready renvoie 0 au shell si le serveur accepte les connexions normalement, 1 si le serveur rejette les connexions (par exemple au démarrage), 2 s'il n'y a pas eu de réponse à la tentative de connexion, et 3 si aucune tentative n'a été faite (par exemple due aux paramètres invalides).

benjwadams
la source
Comment vérifier la même chose pour psql avant la version 9.3?
BRBdot
11

Cela dépend de l'endroit où votre serveur postgresql est installé. Vous utilisez pg_ctl pour démarrer manuellement le serveur comme ci-dessous.

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
Nvick
la source
@Ramy Vous avez remplacé bin par var dans le chemin.
James Allman
Hmmm d'accord. Je pensais que j'avais besoin de vérifier où était mon installation. s'il vous plaît voir la nouvelle mise à jour.
Ramy
Comment avez-vous installé postgres? Avez-vous exécuté initdb après l'installation de postgres?
Nvick
5

La pg_ctl statuscommande suggérée dans d'autres réponses vérifie que le processus postmaster existe et, si tel est le cas, signale qu'il est en cours d'exécution. Cela ne signifie pas nécessairement qu'il est prêt à accepter des connexions ou à exécuter des requêtes.

Il est préférable d'utiliser une autre méthode comme utiliser psqlpour exécuter une requête simple et vérifier le code de sortie, par exemple psql -c 'SELECT 1', ou utiliser pg_isready pour vérifier l'état de la connexion .

Owen Pauling
la source
3
psql -c "SELECT 1" -d {dbname} > /dev/null || postgres -D /usr/local/var/postgres >postgres.log 2>&1 &si vous voulez vérifier et démarrer postgres en une seule fois (pratique pour les scripts d'automatisation).
Kate le