macOS 安装(Homebrew)
macOS 上安装 PostgreSQL 最便捷的方式是使用 Homebrew,它会把 PostgreSQL 的二进制文件、数据目录与后台服务统一纳入包管理。本节介绍 brew install postgresql@18 的完整流程、服务启停、PATH 配置、数据目录位置,并给出 Postgres.app 这一备选方案。
前置知识
阅读本节前,建议先了解:Linux 安装(APT / YUM)
基础概念
- Homebrew:macOS 上的包管理器,把软件安装到独立的「前缀目录」(Intel Mac 为
/usr/local,Apple Silicon 为/opt/homebrew) - 公式(Formula):Homebrew 中的一个软件包定义,如
postgresql@18 - 服务(Service):通过
brew services管理的后台进程,底层由launchd托管 - 数据目录(Data Directory):Homebrew 默认放在
/opt/homebrew/var/postgresql@18(Apple Silicon)或/usr/local/var/postgresql@18(Intel) - 本地开发 vs 生产:macOS 通常只作为开发环境,生产环境应使用 Linux
| 安装方式 | 版本可控性 | 数据目录 | 适用场景 |
|---|---|---|---|
| Homebrew | 好(可指定 @16/@17/@18) | 前缀目录下的 var/ | 开发、CI |
| Postgres.app | 一般(跟应用版本走) | 应用内 Data 目录 | 图形化偏好者 |
| Docker | 最好 | 由 Volume 控制 | 需要与生产一致 |
| 源码编译 | 最好 | 自定义 | 需特殊编译选项 |
版本说明
Homebrew 的 postgresql@18 公式跟随上游发布。若只想安装最新稳定大版本,也可以直接 brew install postgresql,它会被链接到当前的最新稳定版。
安装与配置
安装 Homebrew
bash
# 检查是否已安装
brew --versiontext
Homebrew 4.5.0bash
# 未安装时执行官方安装脚本(需要网络与管理员密码)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Apple Silicon 上需要把 brew 加入 PATH
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"安装 PostgreSQL 18
bash
# 更新公式索引(不要跳过,否则可能找不到 @18)
brew update
# 查看当前可安装的 PostgreSQL 版本
brew search postgresqltext
==> Formulae
postgresql@14 postgresql@15 postgresql@16 postgresql@17 postgresql@18
postgresql ✔ postgresql@17 ✔bash
# 安装 PostgreSQL 18
brew install postgresql@18
# Homebrew 对 @ 版本公式默认 keg-only,需要手动加入 PATH
echo 'export PATH="/opt/homebrew/opt/postgresql@18/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
# 验证
psql --version
pg_config --bindirtext
psql (PostgreSQL) 18.0 (Homebrew)启动与停止服务
bash
# 启动并设置开机自启(推荐,等价于 brew services start)
brew services start postgresql@18text
==> Successfully started `postgresql@18` (label: homebrew.mxcl.postgresql@18)bash
# 仅本次运行,不设置开机自启(适合临时调试)
brew services run postgresql@18
# 查看所有服务状态
brew services listtext
Name Status User File
postgresql@18 started ch ~/Library/LaunchAgents/homebrew.mxcl.postgresql@18.plistbash
# 停止服务(同时移除开机自启)
brew services stop postgresql@18
# 重启
brew services restart postgresql@18
# 查看为服务生成的 launchd 配置
cat ~/Library/LaunchAgents/homebrew.mxcl.postgresql@18.plist也可以绕过 brew services,直接使用 PostgreSQL 自带的 pg_ctl:
bash
# 前台启动,日志输出到终端(便于观察启动过程)
/opt/homebrew/opt/postgresql@18/bin/postgres -D /opt/homebrew/var/postgresql@18
# 或使用 pg_ctl 后台启动
pg_ctl -D /opt/homebrew/var/postgresql@18 -l /opt/homebrew/var/log/postgresql@18.log start路径与数据目录
| 项目 | Apple Silicon | Intel Mac |
|---|---|---|
| 安装前缀 | /opt/homebrew | /usr/local |
| 二进制目录 | /opt/homebrew/opt/postgresql@18/bin | /usr/local/opt/postgresql@18/bin |
| 数据目录 | /opt/homebrew/var/postgresql@18 | /usr/local/var/postgresql@18 |
| 配置文件 | 数据目录内的 postgresql.conf | 同左 |
| 服务日志 | /opt/homebrew/var/log/postgresql@18.log | /usr/local/var/log/postgresql@18.log |
bash
# 打印 Homebrew 前缀(自动适配 Intel / Apple Silicon)
echo $(brew --prefix)
echo $(brew --prefix)/var/postgresql@18
# 查看数据目录内容
ls -lh $(brew --prefix)/var/postgresql@18详细说明
首次初始化与连接
Homebrew 在 brew install 阶段会自动执行 initdb(若数据目录为空),超级用户为当前登录的 macOS 用户名,而不是 postgres:
bash
# 确认数据目录是否已初始化
ls $(brew --prefix)/var/postgresql@18/PG_VERSIONtext
/opt/homebrew/var/postgresql@18/PG_VERSIONbash
# 直接连接(默认数据库与用户名都等于当前系统用户)
psql postgrestext
psql (18.0 (Homebrew))
Type "help" for help.
ch=# SELECT current_user, current_database();
current_user | current_database
--------------+------------------
ch | postgres
(1 row)如果安装时数据目录已存在但为空,或安装后目录被删除,可手动初始化:
bash
# macOS 下的 Homebrew 初始化(数据目录必须为空)
initdb --locale=C -E UTF-8 $(brew --prefix)/var/postgresql@18
# 初始化完成后新建一个默认数据库(initdb 默认没有与用户同名的库)
createdb端口与配置文件
Homebrew 使用默认端口 5432,配置文件位于数据目录内:
ini
# /opt/homebrew/var/postgresql@18/postgresql.conf
# 默认仅监听回环地址,本机开发足够
listen_addresses = 'localhost'
port = 5432
# 日志相关(Homebrew 安装默认未开启 logging_collector)
logging_collector = offini
# /opt/homebrew/var/postgresql@18/pg_hba.conf
# Homebrew 默认对本机连接使用 trust,本地开发方便但不适合多人共享的机器
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trustbash
# 修改配置后重载(不需要重启)
pg_ctl -D $(brew --prefix)/var/postgresql@18 reload
# 或通过 SQL 重载
psql -c "SELECT pg_reload_conf();"连接方式汇总
bash
# 通过 Unix Socket(最快,不走 TCP)
psql -h $(brew --prefix)/var/run/postgresql -d postgres
# 通过 TCP 回环地址
psql -h 127.0.0.1 -p 5432 -U ch -d postgres
# 连接字符串 URI 形式(驱动中常用)
psql "postgresql://ch@127.0.0.1:5432/postgres?sslmode=disable"多个版本并存
Homebrew 允许同时安装多个大版本,它们各自有独立的二进制目录与数据目录:
bash
# 查看已安装的 PostgreSQL 版本
brew list --versions | grep postgresqltext
postgresql@16 16.6
postgresql@18 18.0bash
# 使用指定版本的客户端
/opt/homebrew/opt/postgresql@16/bin/psql --version
/opt/homebrew/opt/postgresql@18/bin/psql --version
# 端口冲突:为 18 改成 5433,避免与 16 的 5432 冲突
# 修改 /opt/homebrew/var/postgresql@18/postgresql.conf 中的 port = 5433bash
# 手动同时运行两个版本
pg_ctl -D /opt/homebrew/var/postgresql@16 -l /tmp/pg16.log start
pg_ctl -D /opt/homebrew/var/postgresql@18 -l /tmp/pg18.log start
psql -p 5432 -c "SHOW server_version;" # 16.x
psql -p 5433 -c "SHOW server_version;" # 18.xPostgres.app 备选方案
Postgres.app 是 macOS 上流行的原生应用,把 PostgreSQL 打包为 .app,双击即可启动:
bash
# 通过 Homebrew Cask 安装 Postgres.app
brew install --cask postgres-extension-pack
brew install --cask postgres-app
# Postgres.app 自带命令行工具,建议加入 PATH
# 应用内的 bin 目录形如:
# /Applications/Postgres.app/Contents/Versions/18/bin
echo 'export PATH="/Applications/Postgres.app/Contents/Versions/latest/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc| 对比项 | Homebrew | Postgres.app |
|---|---|---|
| 启动方式 | brew services / pg_ctl | 双击应用图标 |
| 数据目录 | $(brew --prefix)/var/postgresql@18 | ~/Library/Application Support/Postgres/var-18 |
| 多版本 | 各版本独立公式 | 应用内切换 |
| 自动初始化 | 安装时完成 | 首次启动完成 |
| 可脚本化 | 强(适合 CI) | 弱(依赖 GUI) |
| 适用人群 | 开发者、CI | 偏好图形界面的本地用户 |
bash
# 通过 Postgres.app 初始化数据目录(无需 GUI)
/Applications/Postgres.app/Contents/Versions/latest/bin/initdb \
-D ~/Library/Application\ Support/Postgres/var-18卸载与清理
bash
# 停止服务
brew services stop postgresql@18
# 卸载公式(不会删除数据目录)
brew uninstall postgresql@18
# 彻底清理数据与配置(危险!请先备份)
# rm -rf $(brew --prefix)/var/postgresql@18
# rm -f ~/Library/LaunchAgents/homebrew.mxcl.postgresql@18.plist
# 清理不再需要的旧版本
brew cleanup postgresql@16实战示例
在 Apple Silicon Mac 上安装 PostgreSQL 18、配置不冲突的端口、创建业务库与用户,并用 URI 连接串验证。
bash
# ---------- 步骤 1:安装与 PATH ----------
brew update
brew install postgresql@18
echo 'export PATH="/opt/homebrew/opt/postgresql@18/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
psql --versiontext
psql (PostgreSQL) 18.0 (Homebrew)bash
# ---------- 步骤 2:确认数据目录已初始化并启动 ----------
PGDATA=$(brew --prefix)/var/postgresql@18
test -f "$PGDATA/PG_VERSION" && echo "已初始化: $(cat $PGDATA/PG_VERSION)"
brew services start postgresql@18
sleep 2
pg_ctl -D "$PGDATA" statustext
已初始化: 18
pg_ctl: server is running (PID: 41207)
/opt/homebrew/opt/postgresql@18/bin/postgres "-D" "/opt/homebrew/var/postgresql@18"bash
# ---------- 步骤 3:创建业务用户与数据库 ----------
psql -d postgres <<'SQL'
-- 创建专用业务用户,避免应用直连超级用户
CREATE ROLE app_rw LOGIN PASSWORD 'Str0ng_P@ssw0rd';
-- 创建业务库并指定属主
CREATE DATABASE demo OWNER app_rw ENCODING 'UTF8';
SQLtext
CREATE ROLE
CREATE DATABASEbash
# ---------- 步骤 4:调整认证方式,从 trust 改为密码认证 ----------
# 本地开发可保留 trust;若机器多人共用应改为 scram-sha-256
# 修改 $(brew --prefix)/var/postgresql@18/pg_hba.conf:
# host all all 127.0.0.1/32 scram-sha-256
PGDATA=$(brew --prefix)/var/postgresql@18
sed -i '' 's|^host all all 127.0.0.1/32 trust|host all all 127.0.0.1/32 scram-sha-256|' \
"$PGDATA/pg_hba.conf"
pg_ctl -D "$PGDATA" reloadtext
server signaledbash
# ---------- 步骤 5:使用连接串验证 ----------
psql "postgresql://app_rw:Str0ng_P%40ssw0rd@127.0.0.1:5432/demo" \
-c "SELECT current_user, current_database(), version();"text
current_user | current_database | version
--------------+------------------+------------------------------------------------
app_rw | demo | PostgreSQL 18.0 (Homebrew) on aarch64-apple-darwin
(1 row)注意事项
postgresql@18是 keg-only 公式,不会自动链接到/opt/homebrew/bin,不配置 PATH 会出现psql: command not found- Homebrew 的超级用户是当前 macOS 用户名,执行
sudo -u postgres psql会失败(系统中没有postgres用户) - Intel Mac 与 Apple Silicon 的安装前缀不同,写脚本时务必用
$(brew --prefix)而非硬编码 brew services start会写入~/Library/LaunchAgents,在公司管控的 Mac 上可能没有权限,此时改用pg_ctl- macOS 睡眠唤醒后偶发连接失败,通常是 launchd 服务被挂起,
brew services restart postgresql@18可恢复 - 不要用系统自带的
sudo安装路径混装 PostgreSQL 与 Homebrew 版本,会导致动态库冲突 - 常见错误
FATAL: role "postgres" does not exist:请使用当前系统用户名连接,或先createuser -s postgres - 升级大版本(如 17 → 18)必须使用
pg_upgrade或逻辑导出导入,不能直接切换二进制指向上旧数据目录
最佳实践
- 统一用
$(brew --prefix)引用路径,保证 Intel / Apple Silicon 双平台脚本通用 - 开发环境可通过
brew services run临时启动,避免长期占用后台资源 - 每个项目使用独立的数据库与角色,避免全项目共用超级用户
- 使用
~/.pgpass(权限0600)或连接串 + 环境变量管理密码,不要把密码写进代码仓库 - 将数据目录排除出 Time Machine 之外或单独备份,避免备份体积失控;生产数据不要依赖本机备份
- 需要与生产环境一致性更高时,优先使用 Docker 方案而非 Homebrew
- 定期
brew upgrade postgresql@18更新小版本,但升级前先备份数据目录
下一节
继续学习:Windows 安装