在 Linux Mint 17.0 Cinnamon Edition 上,我想将其用作所有 postgres 数据库的选项/var/run/postgresql
。unix_socket_directories
每当我运行命令pg_ctl -D postgres-data -o '-F -p 33311' start
来启动本地数据库时,都会收到错误FATAL: could not create lock file "/var/run/postgresql/.s.PGSQL.33311.lock": Permission denied
。
正如 AskUbuntu、StackOverflow 和各种论坛上的许多答案所暗示的那样,我必须运行sudo chmod 777 /var/run/postgresql
或sudo chown -R $USER:$USER /var/run/postgresql
更改目录的权限,以便我可以写入它。然后我就可以启动我的数据库了。然而,每次我重新启动时,权限就会消失;该目录不再是全局可写的,并且用户postgres-xc
收回该目录的用户和组所有权。
两者都没有sudo adduser $USER postgres
或sudo adduser $USER postgres-xc
减轻了权限问题。
我尝试按照描述进行全新安装这里,但我仍然遇到重新启动的问题。
我尝试将(本地数据库配置文件)中的值更改unix_socket_directories
为,这使我可以启动该特定数据库,而无需在每次重新启动时更新权限。但是,我还有一个用于动态设置和启动数据库的脚本。因此,这些数据库使用默认配置文件,因此不可写,并且在运行该脚本时出现权限被拒绝错误。手动/以编程方式即时编辑这些配置以供使用是......不可取的。/tmp
./postgres-data/postgresql.conf
pg_ctl -D $DIR initdb && pg_ctl -D $DIR start
postgresql.conf
unix_socket_directories
/var/run/postgresql
unix_socket_directories = '/tmp'
我知道我可以使用 标志-o
来pg_ctl
覆盖unix_socket_directories
的选项/tmp
,但该脚本由不使用 Ubuntu 的其他开发人员共享,因此我不一定要限制每个人都使用该/tmp
目录,特别是如果他们的配置略有不同。我希望每个人都使用默认位置进行安装。就我个人而言,我也更愿意保留默认目录,以便与其他 Ubuntu 软件包兼容;例如,pgadmin/var/run/postgresql
默认情况下会查找锁定文件。
我还尝试过编辑,/etc/postgresql/9.3/main/pg_ctl.conf
试图在每次使用时自动传递设置这些选项pg_ctl
:
# Automatic pg_ctl configuration
# This configuration file contains cluster specific options to be passed to
# pg_ctl(1).
pg_ctl_options = '-o "-c unix_socket_directories=/tmp -c unix_socket_group=jackson -c unix_socket_permissions=0777"'
但这并没有任何效果。
请告知我如何将/var/run/postgresql
其unix_socket_directories
用作所有 postgres 数据库的选项,而不必sudo chown -R $USER:$USER /var/run/postgresql
每次重新启动系统时都运行。谢谢。
答案1
/var/run/postgresql 的权限取自 /usr/lib/tmpfiles.d/postgresql.conf
答案2
运行以下命令来回收目录(立即以及在后续引导时):
service='reclaim-postgresql'
service_file="/etc/init.d/${service}"
echo "#!/bin/sh
set -e
### BEGIN INIT INFO
# Provides: ${service}
# Required-Start: \$postgres-xc
# Required-Stop: \$postgres-xc
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Reclaim /var/run/postgresql
### END INIT INFO
chown -R ${USER}:${USER} /var/run/postgresql" \
| sudo tee "${service_file}"
sudo chmod +x "${service_file}"
sudo update-rc.d "${service}" defaults
sudo service "${service}" start
请注意,在运行sudo apt-get upgrade
更新 postgres 时,您可能需要暂时执行sudo chown -R postgres:postgres /var/run/postgresql
才能使升级成功。
答案3
根据您的 init 系统,在 PostgreSQL 的相关 init 脚本中添加 chown/chmod 命令,例如/etc/init.d/postgresql
.
答案4
用于pg_ctl -D ... -o "... -k /tmp" start
创建套接字/tmp