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

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

Ramy
источник
Как вы установили 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
malopezcruz
источник
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

rafaelportela
источник
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
Kenial
источник
Здесь
указывается
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как это исправить?
Рохман Масихар
22

В тестовых целях, я думаю, PostgreSQL App - лучший вариант!

Запустите приложение, и сервер будет запущен. Закройте приложение, и сервер отключится.

http://postgresapp.com/

Кристиан Леан
источник
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 для удобства.

jkaluzka
источник
7

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

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

mkdir db
initdb db -E utf8
createdb public

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

postgres -d db

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

psql -d public
K107
источник
Это кажется великолепным, но не работает для меня - это был не тот сервер, который уже был запущен для выполнения шага 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 есть старт

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

Roosh
источник
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  
datasmid
источник
Не могу найти много другого, который показал, как использовать встроенный 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
Melnosta
источник
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, который был заблокирован и не разрешал подключения.

Swedendrift
источник
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
hithacker
источник
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, вероятно, изменится. Для меня это не имело большого значения.

thedanotto
источник
0

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

https://github.com/jimbojsb/launchrocket

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

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

theUtherSide
источник
0

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

brew install proctools
sudo pkill -u postgres

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

Punnerud
источник
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 
Muhammad Dyas Yaskur
источник
0

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

$ sudo su postgres
bash-3.2$ /Library/PostgreSQL/12/bin/pg_ctl -D /Library/PostgreSQL/12/data/ stop
J_F4C
источник
0

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

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

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

Tazeem
источник