我尝试启动postgresql:/usr/pgsql-11/bin/pg_ctl -D appli/postgres/data/ -l logfile start
但我不明白为什么我的日志文件中总是出现这个错误:
FATAL: could not create lock file "/var/run/postgresql/.s.PGSQL.5432.lock": Permission denied
我试图更改权限,但总是被拒绝权限:
chown -R postgres:postgres /var/run/postgresql
chmod 755 /var/run/postgresql
编辑postgresql.conf
并将unix_socket_directories
更改回出厂默认值/tmp
。
或者,以操作系统用户postgres
的身份启动PostgreSQL。
我遇到了同样的问题,为我做的是创建目录"postgresql";由于某种奇怪的原因,它以前并不存在,并且运行
sudo chown postgres /var/run/postgresql
之后,pgctl能够毫无问题地创建锁文件。
我遇到了一个alpine
docker
图像。事实证明,他们更改了默认值:
使用/tmp作为套接字可以让每个人欺骗PostgreSQL服务器。
有两个选项:
-
创建
/run/postgresql
目录:mkdir /run/postgresql && chown postgres: /run/postgresql
-
更改
postgresql.conf
中的unix_socket_directories
(unix_socket_directories = '/tmp'
(。
如果从源代码安装,目录可能应该是"/tmp"。如果您是从存储库安装的,则附带的启动脚本应该为您处理权限。为什么不使用它而不是自己运行pg_ctl呢?
对于安装在wsl2上的citus postresql扩展,我创建了.sh文件来手动启动postgres:
#!/usr/bin/env bash
sudo mkdir -p /var/run/postgresql
sudo chown postgres:postgres /var/run/postgresql
sudo chmod 744 /var/run/postgresql
sudo -u nobody bash -c : && RUNAS="sudo -u postgres"
#Runs bash with commands between '_' as nobody if possible
$RUNAS bash<<_
cd ~/
source ~/.bashrc
pg_ctl -D citus -l citus_logfile start
_
实际上,在目录/var/run/postgresql
中,只有根用户具有写入权限,并且您试图用(pg_ctl)
启动服务器的命令试图生成锁定文件,以防止服务器的多个实例同时位于同一端口上。与您一起尝试该命令的用户没有write
权限,因此会出现permission denied
错误。
您也不能以root身份运行此命令,因为它会拒绝这样做,因此唯一可能的解决方案是在postgres.conf
文件中进行更改。
在postgres.conf
文件中,将unix_socket_directories
分配给/tmp
。在/tmp
目录上,其他用户也具有root以外的写入权限。