我在Fedora 22上从PostgreSQL 9.4.4获得了非常奇怪的行为:
我试图从psql
运行此查询:
su - postgres
psql dbName
COPY sometable FROM '/the/file/location.csv' WITH DELIMITER AS ',' CSV;
它给了我这个错误:
could not open file "/the/file/location.csv" for reading: Permission denied
但是,如果我这样做:
su - postgres
nano /the/file/location.csv
它按预期打开文件,因为整个路径都具有所有用户的读/执行权限。
有谁知道为什么会这样?
编辑:我现在甚至尝试将文件移至/tmp/file.csv
,将文件的所有权更改为postgres
并关闭SELinux的。仍然是同样的错误。
编辑2 :我忘了提到这是一个Master-Slave设置,我从Slave服务器SSH连接到Master。否则设置工作正常。
编辑3 :我收回我原先说的话。关闭SELinux解决了这个问题。我现在需要找出一种方法来使用它来正确地解决这个问题。
答案 0 :(得分:0)
这是一个SELinux
问题。该文件需要postgresql_db_t
标签。
这可以通过对单个文件运行此命令来完成:
chcon --reference /var/lib/pgsql/data/ /the/file/location.csv
或整个目录的此命令
chcon -R --reference /var/lib/pgsql/data/ /the/directory/
这些命令告诉SELinux将PosgresSQL标签/从PostgreSQL的默认目录复制到PosgreSQL被拒绝访问的文件/目录。
可以使用ls -lZ
检查,之后应该看起来像这样:
-rwxrwxrwx. 1 postgres postgres system_u:object_r:postgresql_db_t:s0 0 Jul 26 00:00 fileName.csv