Как проверить статус сервера PostgreSQL в Mac OS X

103

Как я могу узнать, работает ли мой сервер Postgresql или нет?

Я получаю это сообщение:

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

Обновить:

> 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

Обновление 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
Рами
источник
1
Вам также следует обратить внимание на несколько версий postgres для Mac OS / X. Если вы установили postgres через homebrew, вы можете получить указанную выше ошибку, если ваш путь неверно настроен - я просто случайно обманул свой путь, и все началось с системной установки postgres, которая не работала очень хорошо, пока я не скорректировал путь к используйте установку brew
Джейми Кук

Ответы:

95

Самый простой способ проверить запущенные процессы:

ps auxwww | grep postgres

И найдите команду, которая выглядит примерно так (ваша версия может быть не 8.3):

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

Чтобы запустить сервер, выполните что-то вроде этого:

/Library/PostgreSQL/8.3/bin/pg_ctl start -D /Library/PostgreSQL/8.3/data -l postgres.log
Богемный
источник
хорошо, и если я не найду ничего подобного, как мне запустить сервер?
Ramy
4
pgrep postgresтоже работает. Или ps auxwww | grep [p]ostgresчтобы предотвратить grepподхват.
Грегори Нисбет
1
Бу, шипение ре: ps | grepпредположение о злоупотреблении служебным положением. pgrepприемлемо, едва. pg_ctl statusэто здорово . ps auxwww | grep postgresбудет соответствовать grep postgres, и less /var/log/postgres/whatever.
Чарльз Даффи,
Следует отметить, что каталог кластера базы данных /Library/PostgreSQL/8.3/dataпроизвольно создается пользователем с помощью initdbкоманды. вот документ 8.3
GPL
59

Вы можете запустить следующую команду, чтобы определить, запущен ли postgress:

$ pg_ctl status

Вы также захотите установить PGDATA переменную среды.

Вот что у меня в ~/.bashrcфайле для 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'

Чтобы они вступили в силу, не забудьте указать источник следующим образом:

$ . ~/.bashrc

Теперь попробуйте, и у вас должно получиться что-то вроде этого:

$ show-pg-status
pg_ctl: server is running (PID: 11030)
/usr/local/Cellar/postgresql/9.2.4/bin/postgres
l3x
источник
Учитывая ваше сообщение об ошибке, я уверен, что предложение SamGoody запустить вашу команду initdb решит вашу проблему «Соединение отклонено». Как только это будет исправлено, попробуйте мои предложения, чтобы узнать статус вашего сервера postgres db.
l3x 02
26

Вероятно, вы не запускали postgres.

Если вы установили с помощью HomeBrew, init необходимо запустить, прежде чем что-либо еще станет пригодным для использования.

Чтобы увидеть инструкции, запустите 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

После того, как вы его запустите, он должен сказать что-то вроде:

Успех. Теперь вы можете запустить сервер базы данных, используя:

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

Если проблемы по-прежнему возникают, проверьте брандмауэр. Если использовать хороший, например HandsOff! и он был настроен на блокировку трафика, тогда ваша страница не будет видеть базу данных.

Сэм Гуди
источник
21

Начиная с PostgreSQL 9.3, вы можете использовать команду pg_isreadyдля определения статуса подключения сервера PostgreSQL.

Из документов :

pg_isready возвращает оболочке 0, если сервер принимает соединения нормально, 1, если сервер отклоняет соединения (например, во время запуска), 2, если не было ответа на попытку подключения, и 3, если попытка не была сделана (например, из-за к недопустимым параметрам).

Benjwadams
источник
Как проверить то же самое для psql до 9.3?
BRBdot 06
11

Это зависит от того, где установлен ваш сервер postgresql. Вы используете pg_ctl, чтобы вручную запустить сервер, как показано ниже.

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
Nvick
источник
@Ramy Вы заменили bin на var в пути.
Джеймс Оллман
Хммм ладно. Я подумал, что мне нужно проверить, где была моя установка. пожалуйста, смотрите новое обновление.
Ramy
Как вы установили postgres? Вы запускали initdb после установки postgres?
Nvick
5

Команда, pg_ctl statusпредложенная в других ответах, проверяет, существует ли процесс postmaster, и если да, то сообщает, что он запущен. Это не обязательно означает, что он готов принимать соединения или выполнять запросы.

Лучше использовать другой метод, например, использовать psqlдля запуска простого запроса и проверки кода выхода, например psql -c 'SELECT 1', или использовать pg_isready для проверки статуса соединения .

Оуэн Полинг
источник
3
psql -c "SELECT 1" -d {dbname} > /dev/null || postgres -D /usr/local/var/postgres >postgres.log 2>&1 &если вы хотите проверить и запустить postgres за один раз (удобно для сценариев автоматизации).
Кейт