如何使用 /tmp 上的数据目录运行 postgres?

如何使用 /tmp 上的数据目录运行 postgres?

我正在使用存储在 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

相关内容