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


989

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ:

Я забыл запустить initdbкоманду.

</ FINAL UPDATE>

запустив эту команду

ps auxwww | grep postgres

Я вижу, что Postgres не работает

> ps auxwww | grep postgres
remcat          1789   0.0  0.0  2434892    480 s000  R+   11:28PM   0:00.00 grep postgres

возникает вопрос: как запустить сервер postgresql?

Обновить:

>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

обновление 2:

Касание не было успешным, поэтому я сделал это вместо:

> mkdir /usr/local/var/postgres
> vi /usr/local/var/postgres/server.log
> ls /usr/local/var/postgres/          
server.log

Но когда я пытаюсь запустить сервер rails, я все еще вижу это:

Is the server running on host "localhost" and accepting
TCP/IP connections on port 5432?

обновление 3:

> pg_ctl -D /usr/local/var/postgres status
pg_ctl: no server running

обновление 4:

Я обнаружил, что там не было pg_hba.conf (только pg_hba.conf.sample), поэтому я изменил образец и переименовал его (чтобы удалить .sample). Вот содержимое:

 # IPv4 local connections:
 host    all             all             127.0.0.1/32           trust
 # IPv6 local connections:
 host    all             all             ::1/128                trust

но я не понимаю этого

> pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start     
server starting
> pg_ctl -D /usr/local/var/postgres status                                     
pg_ctl: no server running

также:

sudo find / -name postgresql.conf
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory

обновление 5:

sudo pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
Password:
pg_ctl: cannot be run as root
Please log in (using, e.g., "su") as the (unprivileged) user that will own the server process.

обновление 6:

это кажется странным

> egrep 'listen|port' /usr/local/var/postgres/postgresql.conf
egrep: /usr/local/var/postgres/postgresql.conf: No such file or directory

хотя я сделал это:

>sudo find / -name "*postgresql.conf*"
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
/usr/local/Cellar/postgresql/9.0.4/share/postgresql/postgresql.conf.sample
/usr/share/postgresql/postgresql.conf.sample

поэтому я сделал это:

egrep 'listen|port' /usr/local/Cellar/postgresql/9.0.4/share/postgresql/postgresql.conf.sample 
#listen_addresses = 'localhost'     # what IP address(es) to listen on;
#port = 5432                # (change requires restart)
                # supported by the operating system:
                #   %r = remote host and port

поэтому я попробовал это:

> cp /usr/local/Cellar/postgresql/9.0.4/share/postgresql/postgresql.conf.sample /usr/local/Cellar/postgresql/9.0.4/share/postgresql/postgresql.conf        
> cp /usr/share/postgresql/postgresql.conf.sample /usr/share/postgresql/postgresql.conf 

по-прежнему получает тот же "Сервер работает?" сообщение.


Как вы установили Postgres? Вы использовали менеджер пакетов или ручную установку?
— Джеймс Оллман

1
точно не помню, но он уже был установлен или я запустил "brew install postgres". Я бы склонялся к последнему, но опять же, я не уверен на 100%.
— Рами

Использование sudo, т. sudo pg_ctl...
— Е.

54
Я проголосовал за это только потому, что ФИНАЛЬНОЕ ОБНОВЛЕНИЕ заставило меня смеяться очень сильно! : D
— пкоч

14
Пришлось поднять голос, я прихожу сюда по крайней мере 3 раза в неделю, чтобы скопировать самую первую команду pg_ctl, чтобы перезапустить psql после неожиданного завершения .. хех, я должен выучить это: D Спасибо, чувак!
— lucygenik

Ответы:


1848

Менеджер пакетов Homebrew включает списки launchctl для автоматического запуска. Для получения дополнительной информации запуститеbrew info postgres .

Начать вручную:

pg_ctl -D /usr/local/var/postgres start

Остановить вручную:

pg_ctl -D /usr/local/var/postgres stop

Начать автоматически:

Msgstr "Чтобы запустить, запустите postgresql сейчас и перезапустите при входе в систему:"

brew services start postgresql


Каков результат pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start ?

Каков результат pg_ctl -D /usr/local/var/postgres status ?

Есть ли сообщения об ошибках в server.log?

Убедитесь, что локальные соединения tcp включены в pg_hba.conf:

# IPv4 local connections:
host    all             all             127.0.0.1/32            trust

Проверьте listen_addresses и порт в postgresql.conf:

egrep 'listen|port' /usr/local/var/postgres/postgresql.conf

#listen_addresses = 'localhost'     # what IP address(es) to listen on;
#port = 5432                # (change requires restart)

Убираться

Postgres, скорее всего, был установлен через Homebrew , Fink , MacPorts или EnterpriseDB установщик .

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

brew && brew list|grep postgres
fink && fink list|grep postgres
port && port installed|grep postgres

1
@ Ramy Удалось ли прикосновение? Проверьте наличие и разрешения для / usr / local / var / postgres и server.log . Это должен быть rw для вашего идентификатора пользователя.
— Джеймс Оллман

1
@Ramy: Можете ли вы включить какую-либо информацию в /usr/local/var/postgres/server.log? Ваша установка может быть повреждена, и она может быть быстрее очищена и переустановлена ​​с использованием известного источника, такого как Homebrew.
— Джеймс Оллман

10
Зачем все это нужно? Почему вы не можете просто запустить postgres так, как вы запускаете узел?
— Киннард Хоккенхалл,

32
какая нелепо сложная команда просто запустить и остановить программу
— ahnbizcad

3
Это все еще работает, но немного устарело. Ответ ниже brew services start postgresqlявляется более актуальным и простым ответом.
— mthorley

373

Если вы хотите вручную запустить и остановить postgresql (установлен через homebrew), самый простой способ:

brew services start postgresql

а также

brew services stop postgresql

Если у вас есть конкретная версия, обязательно добавьте суффикс версии, например:

brew services start postgresql@10

7
Хотелось бы, чтобы я знал об этом brew servicesраньше ... это единственное решение, которое работает для меня. <3 спасибо!
— Сеанлинсли

5
brew tap gapple/servicesзаставит команду brew services снова работать
— Фабиан Лойтгеб

4
Похоже, brew tap homebrew/servicesвсе еще работает github.com/Homebrew/homebrew-services
— kangkyu

4
Это работает после того, initdb как был успешно запущен. В противном случае он молча выходит из строя (но , кажется, работает, с показом обслуживания , как начал в brew services list.
— Дмитрий

1
Мне нужно было запустить brew services restart postgresql, так как запуск базы данных с помощью pg_ctl или brew services startсказал «может быть запущен другой сервер» и остановка базы данных с зависшим pg_ctl.
— Том

181

У меня была почти та же проблема, и вы назвали команду initdb исправлением. Это было также решением для меня, но я не видел, чтобы кто-то разместил это здесь, так что для тех, кто ищет это:

initdb /usr/local/var/postgres -E utf8

16
это также работало для меня, initdb сказал мне, что я уже выполнил конфигурацию, поэтому я удалил весь каталог: «rm -rf / usr / local / var / postgres» снова запустил вашу команду, и мой сервер теперь запускается и работает, Большое спасибо, сэр!
— Хорхе Сампайо

5
Да, я должен был бежать, rm -rf /usr/local/var/postgresи тогда это сработало для меня
— Ли Макалли

2
Это то, что сработало и для меня. Перед initdb мне пришлось также преобразить postgres dir ( chown _your username on your comp_ usr/local/var/postgres), затем initdb. После этого сервер запускается автоматически при перезапуске (если вы следовали инструкциям Homebrew для этого) или вручную pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start.
— Septerr

2
После initdb(включая удаление старого каталога при необходимости) brew services start postgresqlработает
— Дмитрий

Если идея использования rm -rfвсего, что в настоящее время находится в вашей базе данных, вас немного пугает, вместо того, чтобы полностью ее удалить, вы можете использовать что-то вроде mv /usr/local/var/postgres /usr/local/var/postgres.backupперемещения ее в новый каталог резервных копий, а затем выполнить команду, чтобы снова запустить базу данных.
— Хартли Броуди

102

Если ваш компьютер был внезапно перезагружен

Сначала вы должны удалить файл. /usr/local/var/postgres/postmaster.pidЗатем вы можете перезапустить сервис, используя один из многих других упомянутых методов, в зависимости от вашей установки.

Вы можете убедиться в этом, просмотрев журналы Postgres, чтобы увидеть, что может происходить: tail -f /usr/local/var/postgres/server.log


2
Вы можете проверить, tail -f /usr/local/var/postgres/server.logследует ли удалить этот файл. исх coderwall.com/p/zf-fww/...
— user1448319

Мой был в / Users / <пользователь> / Библиотека / Приложение \ Support / Postgres / var-9.6 / postmaster.pid
— BatteryAcid

для доморощенного устанавливает путь~/homebrew/var/postgres/postmaster.pid
— blnc

2
Вау ... только это сработало для меня! Можете ли вы дать более подробное объяснение, почему мы должны удалить, postmaster.pidесли компьютер был внезапно перезагружен?
— adkl

1
Это было действительно полезно
— NinComPoop

81

Другой подход заключается в использовании lunchy gem (оболочки для launchctl):

brew install postgresql
initdb /usr/local/var/postgres -E utf8
gem install lunchy

Для запуска postgres:

lunchy start postgres

Чтобы остановить postgres:

lunchy stop postgres

Для получения дополнительной информации обратитесь к: « Как установить PostgreSQL на Mac с Homebrew и Lunchy »


в зависимости от того, как вы настроили postgres, вам может понадобиться использовать postgresql вместо postgres
— Devon Kiss

72

Вот мои 2 цента: я создал псевдоним для postgres pg_ctl и поместил его в .bash_profile (моя версия postgresql - 9.2.4, а путь к базе данных - /Library/PostgreSQL/9.2/data).

alias postgres.server="sudo -u postgres pg_ctl -D /Library/PostgreSQL/9.2/data"

Запустить новый терминал.

А потом? Вы можете запустить / остановить ваш сервер postgresql с помощью этого:

postgres.server start
postgres.server stop


3
Я продолжал получать сообщение «Пожалуйста, войдите в систему (используя, например,« su ») как (непривилегированного) пользователя, который будет владеть процессом сервера». когда работает просто sudo. +1
— pyb

Спасибо. Предложения утилиты postgres использовать su с треском провалились. sudo -u работает великолепно. (на Эль Капитане)
— учуугака

33

Чистейший путь далеко для запуска / остановки / перезапуска Postgres , если вы установили его через brewэто просто выгрузить и / или загрузить файл конфигурации , который поставляется запуск программ с установкой:

launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

Первая строка остановит postgres, а вторая строка запустит его. Нет необходимости указывать какие-либо каталоги данных и т. Д., Поскольку все находится в этом файле.


отлично работает для PostgreSQL 9.5.3, установленного на OS X через Brew !! Спасибо!
— jpswain

это работает как очарование, когда сервер postgres не отключается должным образом и не принимает входящие соединения
— Augusto Samamé Barrientos

5
Сам Homebrew имеет простые оболочки для этих команд, например: brew services start postgres(и остановка). Киньте -vв конец, и вы увидите, что он делает.
— Марк Эдингтон

28

Чтобы запустить сервер postgresql:

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

завершить работу сервера postgresql:

pg_ctl -D /usr/local/var/postgres stop -s -m fast

Вы также можете создать псевдоним через CLI, чтобы упростить его:

alias pg-start='pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start'
alias pg-stop='pg_ctl -D /usr/local/var/postgres stop -s -m fast'

С их помощью вы можете просто набрать «pg-start» для запуска Postgres и «pg-stop» для его выключения.


3
Я получил ошибку, pg_ctl: directory "/usr/local/var/postgres" is not a database cluster directoryкак это исправить?
— Рохман Масихар


9

когда вы устанавливаете postgresql с помощью homebrew:

brew install postgres

в конце вывода вы увидите следующие методы запуска сервера:

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:
    postgres -D /usr/local/var/postgres

Я думаю, что это лучший способ.

Вы можете добавить псевдоним в свой .profile для удобства.


7

Для быстрой одноразовой тестовой базы данных вы можете запустить сервер на переднем плане.

Инициализировать новую базу данных postgres в новом каталоге

mkdir db
initdb db -E utf8
createdb public

Запустите сервер на переднем плане (Ctrl-C, чтобы остановить сервер)

postgres -d db

В другом сеансе оболочки подключитесь к серверу

psql -d public

Это кажется великолепным, но не работает для меня - это был не тот сервер, который уже был запущен для выполнения шага createb. Когда я пытаюсь запустить подачу, он говорит, что ему нужен PGDATA или config-файл, которого еще нет. Что мне не хватает?
— Szeitlin

7

У меня та же проблема, и я выполняю все обновления из первого поста. Но после проверки файла журнала:

/usr/local/var/postgres/server.log

Я вижу истинную причину:

FATAL:  data directory "/usr/local/var/postgres" has group or world access
DETAIL:  Permissions should be u=rwx (0700).

После изменения разрешения на этот каталог

chmod 0700 /usr/local/var/postgres

у сервера postgres есть старт

Каждый раз проверяйте файл журнала.


5

PostgreSQL интегрирован в Server.app доступный через App Store в Mountain Lion. Это означает, что он уже настроен, и вам нужно только запустить его, а затем создать пользователей и базы данных.

Подсказка : не начинайте с определения $ PGDATA и т. Д., Используйте расположение файлов как есть.

У вас будет этот файл: /Library/Server/PostgreSQL/Config/org.postgresql.postgres.plist

Начать:

sudo serveradmin start postgres

Процесс начался с аргументов:

/Applications/Server.app/Contents/ServerRoot/usr/bin/postgres_real -D / Библиотека / Сервер / PostgreSQL / Данные -c listen_addresses = 127.0.0.1, :: 1 -c log_connections = on -c log_directory = / Библиотека / Журналы / PostgreSQL -c log_filename = PostgreSQL.log -c log_line_prefix =% t -c log_lock_waits = on -c log_statement = ddl -c logging_collector = on -c unix_socket_directory = / private / var / pgsql_socket -c unix_socket_g_set_set_c_7_7

Вы можете sudo:

sudo -u _postgres psql template1

Или подключите:

psql -h localhost -U _postgres postgres

Вы можете найти каталог данных, версию, текущее состояние и т. Д. С

sudo serveradmin fullstatus postgres  

Не могу найти много другого, который показал, как использовать встроенный Postgres. Помог мне найти команду serveradmin. Спасибо
— Джейсон С

Запуск службы от имени пользователя root (sudo) определенно не очень хорошая идея, поскольку, как только возникает проблема безопасности, весь компьютер подвергается риску.
— Карлос Барселона

Postgresql работает не как root, а как _postgres.
— bbaassssiiee

5

Вариация этого ответа: https://stackoverflow.com/a/13103603/2394728

initdb `brew --prefix`/var/postgres/data -E utf8`` &&  pg_ctl -D /usr/local/var/postgres/data -l logfile start

Вы должны добавить ссылку на ответ, на который вы ссылаетесь.
— Джеффри Босбом

Это было полезно, так как мой pg работал нормально и вдруг перестал работать и не смог найти папку / var / postgres.
— Shinesecret

Может ли кто-нибудь прокомментировать, почему это лучше, чем связанный ответ? Как я уже видел, я уже проголосовал с прошлого раза, когда у меня была похожая проблема, я собираюсь использовать ее, поскольку здесь нет причин, приведенных здесь.
— MCB

4

Для разработки одним из самых простых способов является установка Postgres.app с официального сайта . Его можно запустить / остановить из папки «Программы» или с помощью следующих команд в терминале:

# start
open -a Postgres

# stop
killall Postgres
killall postgres

18
killallэто, вероятно, не лучший способ остановить базу данных.
— Risadinha

4
   # remove old database files (If there was any)
   $rm -rf /usr/local/var/postgres    # install the binary

    $ brew install postgresql

    # init it
    $ initdb /usr/local/var/postgres

    # start the postgres server
    $ postgres -D /usr/local/var/postgres

    # create your database
    $ createdb mydb


    # Access db.
    $ psql mydb
    psql (9.0.1)
    Type "help" for help.

4

Если вы установили с помощью brew, ниже команды должно быть достаточно.

brew services restart postgresql

И это иногда может не работать, в этом случае ниже две команды должны определенно работать

rm /usr/local/var/postgres/postmaster.pid

pg_ctl -D /usr/local/var/postgres start

1

Ни один из приведенных выше ответов не помог мне решить проблему, несмотря на то, что я получал одинаковые сообщения об ошибках Я смог восстановить и запустить свой экземпляр, удалив существующий файл postmaster.pid, который был заблокирован и не разрешал подключения.


1

Для macports просто используйте команду load / unload и имя порта работающего сервера:

sudo port load postgresql96-server
- or -
sudo port unload postgresql96-server

так что вам не нужно помнить, где находится /Library/LaunchDaemons/org.macports.postgresql96.plistфайл



1

Если вы установили Postgres с помощью установщика EnterpriseDB, то, что предложил @Kenial, это путь.

sudo -u postgres pg_ctl -D /Library/PostgreSQL/{version}/data start
sudo -u postgres pg_ctl -D /Library/PostgreSQL/{version}/data stop

1

у меня это сработало (macOS 10.13) sudo -u postgres /Library/PostgreSQL/9.6/bin/pg_ctl start -D /Library/PostgreSQL/9.6/data

или первый cd /Library/PostgreSQL/9.6/bin/


1

$ brew upgrade postgres

исправил это для меня.

Это, конечно, обновит вашу версию postgres и обновит / установит все зависимости.

ВНИМАНИЕ: Делайте это, зная, что ваша версия postgresql, вероятно, изменится. Для меня это не имело большого значения.


0

Для Mac / OSX мне очень нравится LaunchRocket для этого и других фоновых сервисов, которые я использовал в разработке.

https://github.com/jimbojsb/launchrocket

На этом сайте есть хорошие инструкции по установке: http://macappstore.org/launchrocket/

Это дает вам хороший экран в системных настройках, который позволяет запускать, перезагружать, рутировать, запускать при входе в систему.


0

Это работало для меня каждый раз, вдохновленный Крейгом Рингером:

brew install proctools
sudo pkill -u postgres

proctools включает в себя pkill. Если у вас нет Brew: https://brew.sh/



0

Есть некоторые крайние случаи, которые, возможно, будут полезны для кого-то:

Существует вариант, что у вас будет postgres.pid, заполненный некоторым PID. Но если вы перезагрузите ваш компьютер, и до того, как postgress вернется снова, какой-то другой процесс примет этот PID. Если это произойдет, и pg_ctl status, и служба brew, спросив о статусе postgres, сообщат вам, что это UP. Просто PS AUX | grep и проверь, действительно ли это postgress


0

Доморощенный это путь!

Чтобы запустить сервис:

brew services start postgresql   

Чтобы перечислить это:

brew services list |grep postgres

остановить сервис.

brew services stop postgresql 

0

Если вы не устанавливали его с помощью brew и непосредственно из пакета mac, у меня это сработало для PostgreSQL 12 при использовании всех местоположений по умолчанию, переменных и т. Д.

$ sudo su postgres
bash-3.2$ /Library/PostgreSQL/12/bin/pg_ctl -D /Library/PostgreSQL/12/data/ stop

0

Я столкнулся с той же проблемой. Перепробовал все эти решения, но ни одно из них не сработало.

Наконец-то удалось заставить его работать, изменив postgres HOST в настройках Django с localhostна 127.0.0.1.

Ура, если это поможет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.