如何在 Mac OS X 上检查 PostgreSQL 服务器的状态

139

如何判断我的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

2
你还应该注意在Mac OS/X上安装多个版本的Postgres。如果你是通过Homebrew安装的Postgres,那么当你的路径设置不正确时,就会出现上述错误 - 我只是无意中弄乱了我的路径,然后所有东西都开始使用系统安装的Postgres,直到我调整路径以使用Brew安装为止,才能正常工作。 - Jamie Cook
7个回答

136

检查运行进程的最简单方法:

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捕获。 - Greg Nisbet
2
针对“ps | grep”不当建议,人们会发出嘘声和抗议。使用“pgrep”勉强可以接受。而“pg_ctl status”则是非常好的选择。如果使用“ps auxwww | grep postgres”,它将匹配到“grep postgres”,并且还可以使用“less /var/log/postgres/whatever”。 - Charles Duffy
需要注意的是,数据库集群目录/Library/PostgreSQL/8.3/data是由用户通过initdb命令任意创建的。这里是8.3文档 - user3456074

80
您可以运行以下命令来确定PostgreSQL是否正在运行:
$ 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数据库服务器状态。 - l3x

38
自 PostgreSQL 9.3 版本开始,你可以使用命令 pg_isready 判断一个 PostgreSQL 服务器的连接状态。
根据文档的介绍:
如果服务器正常接收连接,pg_isready 返回 0;如果服务器拒绝连接(例如在启动过程中),返回 1;如果连接尝试没有响应,则返回2;如果没有进行任何连接尝试(例如由于参数无效),则返回 3。

你如何在9.3之前的psql中进行相同的检查? - BRBdot

32

您可能没有初始化PostgreSQL。

如果您使用HomeBrew安装,则必须在任何其他可用之前运行初始化操作。

要查看说明,请运行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

一旦你运行了这个,它应该会显示类似于:

Success. You can now start the database server using:

postgres -D /usr/local/var/postgres or
pg_ctl -D /usr/local/var/postgres -l logfile start

如果您仍然遇到问题,请检查您的防火墙。如果您使用像HandsOff!这样的好防火墙,并且它被配置为阻止流量,则您的页面将无法访问数据库。


1
这几天,查询一下 brew info postgresql - tgf

13

这取决于您的postgresql服务器安装在何处。您可以使用pg_ctl手动启动服务器,如下所示。

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

@Ramy,你在路径中用 bin 替换了 var - James Allman
嗯...好的。我以为我需要检查我的安装位置。请看新更新。 - Ramy
你是如何安装PostgreSQL的?在安装完PostgreSQL后,你是否运行了initdb命令? - Nvick

13

你可以使用brew来启动/停止pgsql。我在~/.bashrc文件中添加了以下快捷方式:

alias start-pg='brew services start postgresql'
alias stop-pg='brew services stop postgresql'
alias restart-pg='brew services restart postgresql'

12
关于“如何检查状态”的问题,不涉及启动/停止pgsql! - moskito-x
2
你可以尝试运行以下命令: brew services list | grep postgres - Raghuram
喜欢那些别名! - Trapper Davis
1
brew services info postgresql 将提供信息。 - kartheek

6
pg_ctl status命令只检查postmaster进程是否存在,并报告它正在运行。这并不一定意味着它已准备好接受连接或执行查询。
更好的方法是使用另一种方法,比如使用psql运行一个简单的查询并检查退出代码,例如psql -c 'SELECT 1',或者使用pg_isready检查连接状态

3
如果您想要一步完成检查并启动Postgres(用于自动化脚本很方便),可以使用以下命令:psql -c "SELECT 1" -d {dbname} > /dev/null || postgres -D /usr/local/var/postgres >postgres.log 2>&1 &。如果数据库不存在,则会创建一个新的并启动它,否则将直接启动现有的Postgres数据库。 - Kate

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