我正在使用存储在 postgres 数据库中的数据运行自动集成测试。我需要使用相同的数据库内容开始每次测试运行。我不想总是清除数据库并导入转储,而是想将数据库复制到 /tmp 并从那里运行它。如果可行,它会更简单、更快捷。这就是我所做的:
mkdir -p /tmp/postgres/data
chown -R postgres:postgres /tmp/postgres
rsync -vacHAX /var/lib/postgres/data/ /tmp/postgres/data/
并将postgresql.service
文件调整至新位置(包括systemctl daemon-reload
)。
但如果我尝试用这个设置启动 postgres,它会失败,并且systemctl status postgresql.service
显示
“/tmp/postgres/data”缺失或为空。
但事实并非如此。
我再次检查了 postgres 用户是否拥有并有权访问 /tmp/pgsql/data/。/tmp 上的可用空间也足够(超过数据库大小的 2 倍)。
我尝试了不同的位置,但成功了。所以我在postgresql.service
文件的更改足以使用非默认位置。它仅在 /tmp 上失败。
我错过了什么?
答案1
systemd 服务可以有私有的/tmp
出于安全原因,systemd 文档:
PrivateTmp=
接受布尔参数。如果为 true,则为执行的进程设置新的文件系统命名空间,并在其中挂载私有的 /tmp/ 和 /var/tmp/ 目录,这些目录不会被命名空间外的进程共享
当您说它不为/tmp/postgres/data
空或不存在时,那是从您的 shell 的角度来看的,而不是从 postgres 服务的角度来看的PrivateTmp=true
。