如何在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个回答

14
# 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 PostgreSQL server
$ postgres -D /usr/local/var/postgres

# Create your database
$ createdb mydb

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

14
有时候你只是缺少某个版本,却不必要地感到困惑。
如果你正在使用特定版本的 PostgreSQL,例如 PostgreSQL 10,那么只需执行:
brew services start postgresql@10

brew services stop postgresql@10

如果您是从Homebrew安装了特定版本的postgresql,则常规的brew services start postgresql命令将无法正常工作。


10

当您使用Homebrew安装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文件中添加别名,以方便使用。


8

我也遇到了同样的问题,并执行了第一篇帖子中的所有更新。但在检查日志文件后,

/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

PostgreSQL服务器已启动。

每次都要检查日志文件。


7

如果您需要快速使用一次性测试数据库,可以在前台运行服务器。

在新目录中初始化一个新的PostgreSQL数据库:

mkdir db
initdb db -E utf8
createdb public

在前台启动服务器(使用Ctrl + C停止服务器):

postgres -d db

在另一个终端会话中,连接到服务器。
psql -d public

这看起来很不错,但对我没用 - 服务器必须已经运行才能执行createdb步骤。当我尝试启动服务器时,它会提示需要PGDATA或配置文件,但它们还不存在。我错过了什么? - szeitlin

7

你应该在引用的答案中添加一个链接。 - Jeffrey Bosboom
这很有帮助,因为我的pg一直运行得很好,突然间停止了工作,无法找到/var/postgres文件夹。 - shinesecret
有人能否评论一下为什么这比链接的答案更好?我看到我已经在上次遇到类似问题时点赞了,所以我会使用它,因为这里没有给出理由。 - MCB

6
如果您没有使用Homebrew安装,而是直接从Mac软件包中安装,那么在使用所有默认位置、变量等时,这对我适用于PostgreSQL 12。
$ sudo su postgres
bash-3.2$ /Library/PostgreSQL/12/bin/pg_ctl -D /Library/PostgreSQL/12/data/ stop

这对我有用,因为我使用 .dmg 文件安装了 postgreSQL。谢谢 :) - invinciblemuffi

5

PostgreSQL已经集成在Server.app中,可以通过App StoreMac OS X v10.8(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 /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=0770

您可以使用sudo:

sudo -u _postgres psql template1

或者连接:

psql -h localhost -U _postgres postgres

您可以使用以下方式查找数据目录、版本、运行状态等信息:

sudo serveradmin fullstatus postgres

找不到其他关于如何使用内置的Postgres的信息。这帮助我找到了serveradmin命令。谢谢。 - Jason S
以root用户(sudo)身份运行服务绝对不是一个好主意,一旦出现安全问题,整台计算机都会受到威胁。 - Carlos Morales
PostgreSQL并非以root用户身份运行,而是以_postgres用户身份运行。 - bbaassssiiee

5

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

# Start
open -a Postgres

# Stop
killall Postgres
killall postgres

19
killall 可能不是停止数据库的最佳方式。 - Risadinha

5

这对我有用(macOS v10.13(High Sierra)):

sudo -u postgres /Library/PostgreSQL/9.6/bin/pg_ctl start -D /Library/PostgreSQL/9.6/data

或者第一

cd /Library/PostgreSQL/9.6/bin/

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