Как проверить статус сервера 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

Учитывая ваше сообщение об ошибке, я уверен, что предложение 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, если попытка не была сделана (например, из-за к недопустимым параметрам).


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

11

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

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

@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 за один раз (удобно для сценариев автоматизации).
— Кейт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.