如何在第二个已安装的硬盘驱动器上获取 PostgreSQL 表空间?

How do I get a PostgreSQL tablespace on a second, installed hard drive?

我在 Ubuntu 16.04 上安装了 PostgreSQL 9.5。因为它在 SSD 上,而且我不想太频繁地写入它,所以我宁愿将大部分数据保存在我最近安装并分区到 Ext4 文件系统的硬盘上(通过 SATA 连接)。 (Postgres 安装在 SSD 上)

我正在尝试使用以下所有权和位置设置在硬盘驱动器上创建一个表空间:

root@mycomp:/media/me/EXT4_LARGE# ls -la
total 36
drwx------  6 me      root      4096 Nov 30 23:17 .
drwxr-x---+ 5 me      root      4096 Nov 30 23:09 ..
drwx------  2 root     root     16384 Nov 30 21:59 lost+found
drwx------  2 postgres postgres  4096 Nov 30 22:25 pg_data

并从 psql 命令行:

postgres=# CREATE TABLESPACE hdd_ts LOCATION 
'/media/me/EXT4_LARGE/pg_data';
ERROR:  could not set permissions on 
directory "/media/me/EXT4_LARGE/pg_data": Permission denied

我试过在各种配置中修改所有权设置,但 none 成功了。

如何在硬盘上获取表空间?

在Linux中,用户需要父目录的'x'权限才能进入该目录并访问其中的文件和目录。

他们还需要 'w' 权限才能对该目录中的条目进行任何更改。

来自您的打印输出:

drwx------  6 me      root      4096 Nov 30 23:17 .

这告诉我只有用户 me 对目录 /media/me/EXT4_LARGE 具有 xw 权限。所以用户 postgres 将无法更改 /media/me/EXT4_LARGE/pgdata 的权限,甚至看不到它的内部。

一个快速而肮脏的解决方案是:

chmod a+rwx /media/me/EXT4_LARGE

该解决方案的缺点是它会让所有用户 read/write 访问 EXT4_LARGE。更细粒度的方法是创建一个组并分配组权限。

此外,让 postgres 访问整个 EXT4_LARGE 文件系统可能是不明智的,因此根据一些评论,您可能希望在两者之间创建另一个目录级别,例如:

mkdir -p /media/me/EXT4_LARGE/db/pgdata
chown postgres:postgres /media/me/EXT4_LARGE/db
chown postgres:postgres /media/me/EXT4_LARGE/db/pgdata
chmod a+x /media/me/EXT4_LARGE/

请注意,所有父目录都需要 x 权限,因此您可能需要调整 /media/me/media