Jak sprawdzić stan serwera PostgreSQL w systemie Mac OS X

103

Jak mogę sprawdzić, czy mój serwer Postgresql działa, czy nie?

Otrzymuję tę wiadomość:

[~/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?

Aktualizacja:

> 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

Aktualizacja 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
źródło
1
Powinieneś także zwrócić uwagę na wiele wersji postgres na Mac OS / X. Jeśli zainstalowałeś postgres przez homebrew, możesz otrzymać powyższy błąd, gdy twoja ścieżka jest nieprawidłowo skonfigurowana - po prostu przypadkowo sfałszowałem moją ścieżkę i wszystko zaczęło się od systemowej instalacji postgres, która nie działała zbyt dobrze, dopóki nie dostosowałem ścieżki do użyj instalacji naparu
Jamie Cook,

Odpowiedzi:

95

Najprostszy sposób sprawdzenia uruchomionych procesów:

ps auxwww | grep postgres

I poszukaj polecenia, które wygląda mniej więcej tak (twoja wersja może nie być 8.3):

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

Aby uruchomić serwer, wykonaj coś takiego:

/Library/PostgreSQL/8.3/bin/pg_ctl start -D /Library/PostgreSQL/8.3/data -l postgres.log
Czeski
źródło
ok, a jeśli nie znajdę czegoś takiego, jak mam uruchomić serwer?
Ramy
4
pgrep postgresteż działa. Lub ps auxwww | grep [p]ostgresaby zapobiec greppodniesieniu się.
Gregory Nisbet
1
Boo, syk w sprawie: ps | grepsugestia dotycząca błędu w sztuce. pgrepjest do zaakceptowania, ledwo. pg_ctl statusjest super . ps auxwww | grep postgresbędzie pasować grep postgres, i less /var/log/postgres/whatever.
Charles Duffy
należy zauważyć, że katalog klastra bazy danych /Library/PostgreSQL/8.3/datajest arbitralnie tworzony przez użytkownika za pomocą initdbpolecenia. oto dokument 8.3
GPL
59

Możesz uruchomić następujące polecenie, aby określić, czy postgress jest uruchomiony:

$ pg_ctl status

Będziesz także chciał ustawić PGDATAzmienną środowiskową.

Oto, co mam w moim ~/.bashrcpliku dla 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'

Aby odniosły skutek, pamiętaj, aby je pozyskać w następujący sposób:

$ . ~/.bashrc

Teraz spróbuj i powinieneś otrzymać coś takiego:

$ show-pg-status
pg_ctl: server is running (PID: 11030)
/usr/local/Cellar/postgresql/9.2.4/bin/postgres
l3x
źródło
Biorąc pod uwagę twój komunikat o błędzie, założę się, że sugestia SamGoody'ego, aby uruchomić polecenie initdb, naprawi problem „Odmowa połączenia”. Po naprawieniu wypróbuj moje sugestie, aby uzyskać status serwera db postgres.
l3x
26

Prawdopodobnie nie zainicjowałeś postgres.

Jeśli zainstalowałeś przy użyciu HomeBrew, init musi zostać uruchomiony, zanim cokolwiek innego stanie się użyteczne.

Aby zobaczyć instrukcje, uruchom 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

Gdy to uruchomisz, powinien powiedzieć coś takiego:

Sukces. Możesz teraz uruchomić serwer bazy danych za pomocą:

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

Jeśli nadal masz problemy, sprawdź zaporę. Jeśli używasz dobrego, takiego jak HandsOff! i został skonfigurowany do blokowania ruchu, wtedy Twoja strona nie będzie widzieć bazy danych.

SamGoody
źródło
21

Począwszy od PostgreSQL 9.3, możesz użyć polecenia, pg_isreadyaby określić stan połączenia z serwerem PostgreSQL.

Z dokumentów :

pg_isready zwraca 0 do powłoki, jeśli serwer normalnie akceptuje połączenia, 1 jeśli serwer odrzuca połączenia (na przykład podczas uruchamiania), 2 jeśli nie było odpowiedzi na próbę połączenia i 3, jeśli próba nie została podjęta (na przykład z powodu do nieprawidłowych parametrów).

benjwadams
źródło
Jak sprawdzić to samo dla psql przed 9.3?
BRBdot
11

To zależy od tego, gdzie jest zainstalowany twój serwer postgresql. Używasz pg_ctl do ręcznego uruchamiania serwera, jak poniżej.

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
Nvick
źródło
@Ramy Ty podstawionego pojemnika do var w ścieżce.
James Allman
hmmm ... ok. Pomyślałem, że muszę sprawdzić, gdzie jest moja instalacja. zobacz nową aktualizację.
Ramy
Jak zainstalowałeś postgres? Czy uruchomiłeś initdb po zainstalowaniu postgres?
Nvick
5

pg_ctl statusKomenda sugerowane w innych odpowiedzi, że proces kontroli postmaster istnieje, a jeśli tak, raportów, że to działa. Nie musi to oznaczać, że jest gotowy do przyjmowania połączeń lub wykonywania zapytań.

Lepiej jest użyć innej metody, takiej jak użycie psqldo uruchomienia prostego zapytania i sprawdzenia kodu zakończenia, np. psql -c 'SELECT 1'Lub pg_isready do sprawdzenia stanu połączenia .

Owen Pauling
źródło
3
psql -c "SELECT 1" -d {dbname} > /dev/null || postgres -D /usr/local/var/postgres >postgres.log 2>&1 &jeśli chcesz sprawdzić i uruchomić postgres za jednym zamachem (przydatne przy skryptach automatyzacji).
Kate