如何在Dropbox存储可供多台Mac访问的只读Postgres数据库
多台Mac通过Dropbox访问只读PostgreSQL库可行方案
核心问题答疑
你提到的「是否可以以me:staff而非postgres:postgres权限归属创建数据库」答案是完全可以。PostgreSQL本身不强制要求数据目录必须归属postgres用户/组,只要求数据目录的所有权限仅对启动Postgres进程的用户开放,组和其他用户无任何访问权限。
你之前改完权限启动失败的两个核心原因:
- 系统默认配置的Postgres服务以专用postgres系统用户运行,该用户无权限访问归属me:staff的个人目录下的文件
- 你手动给文件添加的
go=rx权限触发了PostgreSQL的安全校验规则——只要数据目录存在组/其他用户的访问权限,Postgres会直接判定为不安全、拒绝启动,和文件所属组是不是postgres没有关系。
落地操作步骤(适配macOS Monterey 12.3)
所有设备统一执行以下配置,避免跨设备权限、UID不匹配问题:
1. 停掉默认系统级Postgres服务
默认安装的Postgres(不管是Homebrew版还是官网PKG版)都会配置为用专用postgres用户开机自启,跨设备该用户UID不统一,直接停用:
- Homebrew安装版本执行:
brew services stop postgresql - 官网PKG安装版本执行:
sudo launchctl unload -w /Library/LaunchDaemons/org.postgresql.postgres.plist
2. 修正Dropbox内数据目录的权限
你之前已经将目录归属改为me:staff,不需要重复修改归属,只需要把权限调整为Postgres要求的最小权限即可:
# 数据根目录设为仅所有者可读可写可执行 chmod 700 /Users/me/Dropbox/dbs # 目录下所有普通文件设为仅所有者可读可写 find /Users/me/Dropbox/dbs -type f -exec chmod 600 {} \; # 目录下所有子目录设为仅所有者可读可写可执行 find /Users/me/Dropbox/dbs -type d -exec chmod 700 {} \;
3. 配置全局只读防止误写
因为你仅需要只读访问,为了避免误操作写入数据触发Dropbox同步冲突,编辑数据目录下的postgresql.conf文件,添加一行配置:default_transaction_read_only = on
该配置开启后,所有连接到该实例的会话默认处于只读事务状态,无法执行任何写入操作。
4. 以个人用户身份启动实例
不需要sudo、不需要切换到postgres用户,直接用你的日常登录用户启动实例即可,建议用非默认端口避免和本地其他Postgres实例冲突:postgres -D /Users/me/Dropbox/dbs -p 5433 &
跨设备使用注意事项
- 所有设备上的个人用户短名需要统一为
me,macOS默认所有本地用户都属于staff组,不存在GID不匹配问题,Dropbox同步后权限会自动适配,不需要每次重新修改归属 - 同一时间只允许一台设备启动该实例:即使配置了只读,Postgres运行时仍会生成pid文件、临时统计文件,多设备同时启动仍可能产生同步冲突,用完后执行
pg_ctl stop -D /Users/me/Dropbox/dbs -p 5433关闭实例再切换其他设备使用
内容的提问来源于stack exchange,提问作者whdaffer
相关产品推荐
相关产品推荐

