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

1172

最终更新:

我忘记执行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:

触摸(touch)没有成功,因此我做了这个替代方案:

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

但是,当我尝试启动Ruby on Rails服务器时,我仍然看到这个消息:

服务器是否在主机“localhost”上运行,并接受端口5432上的TCP/IP连接?

更新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

我仍然收到相同的“服务器是否正在运行?”消息。


1
我记不清了,但可能是已经安装好了,或者我运行了“brew install postgres”。我倾向于后者,但我不能百分之百确定。 - Ramy
我曾经遇到过同样的问题。如果你的PostgreSQL服务器正在运行(可以使用ps aux | grep postgres命令进行检查),但是psql仍然显示服务器未运行:通过复制postgresql.conf.sample文件创建一个postgresql.conf文件可以解决该问题。 - viper
64
我点赞这个帖子只是因为最后的更新让我非常开心,哈哈! :D - pkoch
20
必须点赞,我每周至少来这里3次,复制第一个pg_ctl命令以在意外终止后重新启动psql。嘿,我得学习它:D感谢你! - lucygenik
1
如果你和我一样,认为需要“启动数据库”,而实际上你只是想要开始使用数据库,那么请启动“pgAdmin”。这就相当于我们微软背景的人所使用的SQL Server Management Studio。 - P.Brian.Mackey
显示剩余7条评论
38个回答

2088

Homebrew软件包管理器包括用于自动启动的launchctl plists。要获取更多信息,请运行brew info postgres

手动启动

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

手动停止

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

自动启动

"要使launchd现在启动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 的结果是什么?

服务器日志中是否有任何错误消息?

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

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

请检查postgresql.conf中的listen_addresses和port:

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

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

清理

PostgreSQL 很可能是通过 HomebrewFinkMacPortsEnterpriseDB 安装的。

检查以下命令的输出以确定它是使用哪个包管理器安装的:

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

1
@Ramy 触摸成功了吗?请检查 /usr/local/var/postgresserver.log 的存在和权限,应该对您的用户ID具有 rw 权限。 - James Allman
1
@Ramy:你能在 /usr/local/var/postgres/server.log 中包含任何信息吗?你的安装可能已经损坏了,使用像 Homebrew 这样的已知来源进行清理和重新安装可能会更快。 - James Allman
12
为什么需要这样做?为什么不能像启动 Node 一样启动 Postgres? - Kinnard Hockenhull
65
启动和停止程序需要使用如此复杂的命令,真是有点荒谬。 - ahnbizcad
8
这仍然可行,但有点过时。下面的答案 brew services start postgresql 更加更新和直接了当。 - mthorley
显示剩余12条评论

503

如果您想手动启动和停止通过Homebrew安装的PostgreSQL,最简单的方法是:

brew services start postgresql

以及

brew services stop postgresql
如果您有特定的版本,请确保在版本号后添加后缀。例如:
brew services start postgresql@10

8
希望我早点知道brew services...这是唯一对我有效的解决方案。 <3 谢谢! - seanlinsley
5
运行brew tap gapple/services后,brew services命令将重新可用。 - Fabian
4
看起来 brew tap homebrew/services 仍在运作中,详情请见 https://github.com/Homebrew/homebrew-services。 - kangkyu
4
这个操作需要在成功运行 initdb 之后才能生效。否则它会悄无声息地失败(但在 brew services list 中服务显示为 已启动)。 - Dmitri
2
我需要运行 brew services restart postgresql,因为使用 pg_ctl 或 brew services start 启动数据库时会显示 "可能正在运行另一个服务器",而使用 pg_ctl 停止数据库时会挂起。 - tomf
显示剩余2条评论

189

我遇到了几乎完全相同的问题,你提到使用 initdb 命令可以解决。这对我也是可行的解决方案,但我没有看到这里有人发布过它,所以对于那些正在寻找解决方法的人:

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

17
这个方法对我也起作用了。initdb告诉我配置已经完成,所以我删除了整个目录:“rm -rf /usr/local/var/postgres”,然后重新运行了您的命令,现在我的服务器已经启动并运行了,非常感谢! - Jorge Sampayo
7
没错,我不得不运行rm -rf /usr/local/var/postgres,然后这个方法对我起了作用。 - Lee McAlilly
2
这也适用于我。在initdb之前,我还需要chown postgres目录(chown _你电脑上的用户名_ 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 可以正常工作。 - Dmitri
如果 rm -rf 删除数据库中的所有内容的想法让你有点害怕,那么你可以使用类似 mv /usr/local/var/postgres /usr/local/var/postgres.backup 的命令将其移动到新的备份目录,然后再运行启动数据库的命令,而不是完全删除它。 - Hartley Brody

126

如果你的电脑突然重启了


你可能想要启动PG服务器,但却无法启动。

首先,你需要删除文件/usr/local/var/postgres/postmaster.pid,然后您可以使用其他方法之一重启服务,具体取决于您的安装方式。

您可以通过查看Postgres日志来验证此问题:tail -f /usr/local/var/postgres/server.log

对于特定版本:

 tail -f /usr/local/var/postgres@[VERSION_NUM]/server.log

Eg:

 tail -f /usr/local/var/postgres@11/server.log

2
你可以检查 tail -f /usr/local/var/postgres/server.log 来确定是否需要删除该文件。参考 https://coderwall.com/p/zf-fww/postgres-on-osx-with-homebrew-not-running-after-osx-crash - user1448319
2
哇...只有这个对我起作用了!您能否给出更详细的解释,为什么如果计算机突然重启,我们应该删除 postmaster.pid - adkl
1
这真的非常有用。 - NinComPoop
1
我的 postmaster.pid 文件位于 "/usr/local/var/postgresql@9.6" 目录下,因为我是使用 brew 安装的 9.6 版本。删除 postmaster.pid 文件后,postgresql 才能正常启动。接下来需要执行命令 "brew services restart postgresql@9.6"。 - Tharindu Jayasuriya
删除 postmaster .pid 会有所帮助。谢谢! - Zernel
显示剩余3条评论

80

另一种方法是使用gem(一个launchctl的包装器):

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

要启动PostgreSQL:

lunchy start postgres

停止PostgreSQL:

lunchy stop postgres

更多信息请参考:"如何使用Homebrew和Lunchy在Mac上安装PostgreSQL"


根据您设置Postgres的方式,您可能需要使用postgresql而不是postgres。 - Devon Kiss

78

以下是我的建议:我为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
3
当我仅仅使用sudo时,一直收到“请使用(例如,“su”)作为拥有服务器进程的(非特权)用户登录”的提示。 - pyb
1
谢谢。postgres工具建议使用su失败了。sudo -u却非常出色。(在El Capitan上) - uchuugaka

33

如果您通过brew安装了PostgreSQL,并且想要最干净的方式来启动/停止/重启它,那么最好的方法就是简单地卸载和/或加载随安装而附带的launchd配置文件:

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

第一行将停止PostgreSQL,第二行将启动它。不需要指定任何数据目录等,因为一切都在那个文件中。


非常适用于通过Brew安装在OS X上的PostgreSQL 9.5.3!谢谢! - jpswain
当Postgres服务器未正确关闭且无法接受传入连接时,此功能非常有效。 - Augusto Samamé Barrientos
6
Homebrew自带简单的包装器,例如:brew services start postgres(和stop)。在结尾加上-v可以看到它正在做什么。 - Mark Edington

29

启动 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”来启动PostgreSQL,并输入“pg-stop”以关闭它。


6
我收到了错误信息 pg_ctl: directory "/usr/local/var/postgres" is not a database cluster directory,该如何修复? - Rohman HM

26

为测试目的,我认为PostgreSQL应用程序是最佳选择!

运行应用程序,服务器就可以启动运行。

关闭应用程序,服务器就会停止运行。

http://postgresapp.com/


14

如果你使用Homebrew安装了,下面的命令应该就足够了。

brew services restart postgresql

有时这可能不起作用。在这种情况下,以下两个命令肯定会起作用:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接