我正在尝试跟随本教程,但一开始它说使用以下命令“本地”运行 postgresql 实例而不是作为守护进程运行。
$ initdb pg
$ postgres -D pg &
$ createdb shouter
因此我安装了新的 12.04(如果重要的话,是 Win7 上的 VMWare),并在我的登录下执行了以下操作:
$ sudo apt-get install postgresql
$ initdb pg
$ postgres -D pg
这给了我一个错误:
LOG: could not bind IPv4 socket: Address already in use
HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
WARNING: could not create listen socket for "localhost"
FATAL: could not create any TCP/IP sockets
我认为这意味着安装服务器会导致它自动运行守护程序。我更喜欢像教程中那样在默认端口上运行,但我还是尝试运行不同的端口:
$ postgres -D pg -p 5555
FATAL: could not create lock file "/var/run/postgresql/.s.PGSQL.5555.lock": Permission denied
我按照其他各种示例尝试了不同的方法来安装 postgresql,但都无济于事。如何解决此错误以便postgres -D pg
成功执行?
*注意我非常愿意创建一个全新的虚拟机,因此如果您有关于如何在全新安装的情况下执行此操作的说明,那就太好了。
答案1
因此,第一件事就是停止服务器。具体操作如下:
sudo /etc/init.d/postgresql stop
这很简单。所以剩下的就是权限,所以显然chmod
下面第 3 步中的解决方案也是如此。(新手可以谷歌 chmod 来获得一些见解)。您必须允许所有用户对“套接字目录”进行写访问。显然这只是 Debian 的问题;他们修改了他们的存储库中的 postgresql 源代码;未修改的 postgres 源中的“套接字目录”是“/tmp”,默认情况下具有自由写入权限。但是 Debian 发行版将其更改为“/var/run/postgresql”,对于非所有者来说是只读的。所以你只需要让它可写。这是来自原始 12.04 Ubuntu VM 的完整预教程安装脚本。
sudo apt-get install postgresql
sudo /etc/init.d/postgresql stop
sudo chmod a+w /var/run/postgresql
echo 'PATH=$PATH:/usr/lib/postgresql/9.1/bin' >> .bashrc
. .bashrc
sudo apt-get install leiningen
mkdir clojure
cd clojure
lein new shouter
cd shouter
gedit project.clj
change to https://devcenter.heroku.com/articles/clojure-web-application
initdb pg
postgres -D pg &
createdb shouter
export DATABASE_URL=postgresql://localhost:5432/shouter
lein repl
为了防止它在端口 5432 上自动启动:编辑文件/etc/postgresql/9.1/main/start.conf
。
答案2
假设您没有计算机的管理员权限,解决方案是使用新配置文件运行 Postgres,并告诉它在您已经具有写权限的目录中创建 unix 套接字。
初始化一个新的数据目录,这里名为db
。
initdb -D db
编辑配置文件db/postgresql.conf
。找到指定行unix_socket_directories
并将其更改为当前目录(即名为 db 的数据目录,而不是运行 postgres 的目录)
unix_socket_directories='.'
现在你可以使用以下命令运行 Postgres
postgres -D db
-h
并创建第一个数据库,在选项中给出 unis 套接字的绝对文件路径
createdb -h `pwd`/. customers
您可能还想更改默认端口,可以在配置中更改,也可以通过运行postgres
以下命令来更改-p 5555
那么程序中的连接描述将是例如
(def psql
{:subprotocol "postgresql"
:subname "//localhost/shouter"})
如果您将端口从默认的 5433 更改,则必须在那里指定它,类似于"//localhost:5555/shouter"
。
顺便说一句,JDBC 驱动程序不支持通过 Unix 套接字连接数据库,仅支持通过 TCP/IP 套接字连接数据库。
来源:http://www.postgresql.org/docs/9.4/static/config-setting.html#CONFIG-SETTING-CONFIGURATION-FILE