如何在Mac OS X上启动PostgreSQL服务器?


989

最后更新:

我忘记了运行initdb命令。

</最终更新>

通过运行此命令

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的?您使用的是软件包管理器还是手动安装?
James Allman

1
记不清了,但是它已经安装好了,或者我运行了“ brew install postgres”。我倾向于后者,但我又不是100%肯定。
拉米

使用sudo,即sudo pg_ctl...
波西米亚风格

54
我之所以投票是因为最终更新让我很难笑!:D
pkoch

14
不得不投票赞成,我每周至少来这里3次,以复制第一个pg_ctl命令,以在意外终止后重新启动psql。.heh我得学习它:D伙计!
lucygenik 2014年

Answers:


1847

自制包管理器包括launchctl的Plist自动启动。有关更多信息,请运行brew info postgres

手动启动:

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

手动停止:

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

自动启动:

“要启动现在就启动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中是否有任何错误消息?

确保在pg_hba.conf中启用了tcp localhost连接:

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

检查postgresql.conf中的listen_addresses和端口:

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很可能是通过HomebrewFinkMacPortsEnterpriseDB安装程序安装的。

检查以下命令的输出,以确定安装了哪个软件包管理器:

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

1
@Ramy触摸成功了吗?检查/ usr / local / var / postgresserver.log的存在和权限。您的用户名应该是rw。
James Allman

1
@Ramy:可以在/usr/local/var/postgres/server.log中包含任何信息吗?您的安装可能已损坏,并且使用Homebrew等已知来源进行清理和重新安装的速度可能更快。
James Allman

10
为什么这一切都是必要的?为什么不能仅以启动节点的方式启动postgres?
Kinnard Hockenhull

32
启动和停止程序真是一个荒谬的复杂命令
ahnbizcad '16

3
这仍然有效,但是有些过时了。下面的答案brew services start postgresql是最新的,直接的答案。
mthorley

372

如果要手动启动和停止postgresql(通过homebrew安装),最简单的方法是:

brew services start postgresql

brew services stop postgresql

如果您具有特定版本,请确保在版本后缀,例如:

brew services start postgresql@10

7
我希望我brew services早点知道...这是唯一对我有用的解决方案。<3谢谢!
seanlinsley14年

5
brew tap gapple/services将使啤酒服务司令部再次发挥作用
Fabian Leutgeb,2015年

4
看起来brew tap homebrew/services仍在工作github.com/Homebrew/homebrew-services
kangkyu 2015年

4
成功运行后, 此工程有效initdb。否则,它静静地失败(但似乎已经奏效,与服务表现为开始brew services list
德米特里

1
我需要运行brew services restart postgresql,因为使用pg_ctl启动数据库或brew services start说“可能正在运行另一台服务器”,并使用挂起pg_ctl停止数据库。
tomf

181

我几乎遇到了完全相同的问题,而您引用了initdb命令作为解决方案。这也是我的解决方案,但是我没有看到有人在这里发布它,因此对于那些正在寻找它的人来说:

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

16
这对我也有效,initdb告诉我我已经完成了配置,所以我删除了整个目录:“ rm -rf / usr / local / var / postgres”再次运行您的命令,我的服务器现在启动并运行,非常感谢先生!
豪尔赫·桑帕约(Jorge Sampayo),

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 2014年

2
之后initdb(如果需要,包括删除旧目录),brew services start postgresql可以运行
Dmitri

如果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 / <用户> / Library / Application \ Support / Postgres / var-9.6 / postmaster.pid
BatteryAcid

自制安装的路径是~/homebrew/var/postgres/postmaster.pid
blnc

2
哇...只有这个对我有用!您能否提供更详细的说明,postmaster.pid如果突然重启计算机,为什么我们应该删除?
adkl

1
这真的很有用
NinComPoop

81

另一种方法是使用午餐宝石(launchctl的包装):

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

要启动postgres:

lunchy start postgres

停止postgres:

lunchy stop postgres

有关更多信息,请参考:“ 如何在带有Homebrew和Lunchy的Mac上安装PostgreSQL


根据您设置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

用-D指定数据目录是这里的关键
olore 2014年

3
我不断收到“请以拥有服务器进程的(非特权)用户身份登录(使用,例如,” su”)。当只运行sudo时。+1
pyb

谢谢。postgres工具使用su的建议失败了。sudo -u表现出色。(在El Capitan上)
uchuugaka

33

到目前为止,启动/停止/重新启动postgres 的最干净的方法brew是简单地卸载和/或加载安装随附的已启动配置文件:

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

第一行将停止postgres,第二行将开始它。由于所有内容都在该文件中,因此无需指定任何数据目录等。


通过Brew通过OS X安装在PostgreSQL 9.5.3上非常有用!谢谢!
jpswain

当postgres服务器未正确关闭并且不接受传入连接时,这就像一个魅力一样工作
AugustoSamaméBarrientos

5
自制程序本身具有这些命令的简单包装,例如:(brew services start postgres和停止)。将a丢到-v最后,您可以看到它在做什么。
Mark Edington'Mar

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该如何解决?
罗曼·马斯哈(Rohman Masyhar)


9

当您使用自制软件安装postgresql时:

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

在另一个Shell会话中,连接到服务器

psql -d public

这似乎很棒,但对我不起作用-并不是服务器已经在运行以便执行createdb步骤。当我尝试启动服务时,它说需要PGDATA或配置文件,但尚不存在。我想念什么?
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中,可通过Mountain Lion的App Store获得。这意味着它已经配置好了,您只需要启动它,然后创建用户和数据库即可。

提示:不要从定义$ PGDATA开始,依此类推。

您将拥有以下文件: /Library/Server/PostgreSQL/Config/org.postgresql.postgres.plist

开始:

sudo serveradmin start postgres

流程以参数开始:

/Applications/Server.app/Contents/ServerRoot/usr/bin/postgres_real -D / Library / Server / PostgreSQL / Data -c listen_addresses = 127.0.0.1,:: 1 -c log_connections = on -c log_directory = / Library / Logs / 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_group = _postgres -c unix_socket_permissions = 0

您可以sudo:

sudo -u _postgres psql template1

或连接:

psql -h localhost -U _postgres postgres

您可以使用以下命令找到数据目录,版本,运行状态等

sudo serveradmin fullstatus postgres  

找不到其他显示如何使用内置Postgres的东西。也帮助我找到了serveradmin命令。谢谢
Jason S

以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

您应该添加指向您所参考答案的链接。
Jeffrey Bosboom,2015年

这很有用,因为我的pg正常工作,突然间它停止工作并且找不到/ var / postgres文件夹。
shinesecret

有人可以评论为什么这比链接的答案更好吗?正如我所看到的,我上次遇到类似问题时已经赞成,因为这里没有给出原因,所以我将使用它。
MCB 2015年

4

出于开发目的,最简单的方法之一是从官方网站安装Postgres.app 。可以从“应用程序”文件夹中启动或停止它,也可以在终端中使用以下命令来启动它:

# start
open -a Postgres

# stop
killall Postgres
killall postgres

18
killall可能不是停止数据库的最佳方法。
Risadinha 2014年

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

如果您使用EnterpriseDB安装程序安装了Postgres,那么建议使用@Kenial。

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


1

$ brew upgrade postgres

为我修复它。

当然,这将升级您的postgres版本并更新/安装任何依赖项。

警告:这样做知道您的PostgreSQL版本可能会更改。对我来说,这没什么大不了的。



0

受Craig Ringer的启发,这每次对我都有效:

brew install proctools
sudo pkill -u postgres

proctools包括pkill。如果您没有Brew:https//brew.sh/



0

有一些极端的情况可能会对某人有所帮助:

有一个选项,您将用一些PID填充postgres.pid。但是,如果您重新启动计算机,并且在回归之前再次返回,则其他进程将采用该PID。如果发生这种情况,则pg_ctl状态和brew服务都询问postgres状态时,都会告诉您它已启动。只是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的设置localhost127.0.0.1

如果有帮助,请加油。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.