我不是来自 PostgreSQL 背景,我想将它用于我目前正在从事的项目,因为它是我正在使用的推荐数据库。
我使用 PgAdmin 4 来可视化数据库,我对该应用程序上“关闭服务器”的字面理解是它关闭了数据库,但事实并非如此。所以我想学习如何在项目开始时启动/停止/重新启动服务器,这样我就可以更好地在以后管理它。
tl;dr:在 OSX 上,不使用自制软件并使用默认设置/目录结构,启动 DB 的正确方法/命令是什么?
我的尝试和错误的开始......
在许多网站上大量阅读之后,我找到了停止服务器的方法,一种对我个人有用的方法——不使用 Homebrew 和 OSX
停止数据库
$ sudo -u postgres pg_ctl -D /Library/PostgreSQL/12/data/ stop
could not identify current directory: Permission denied
waiting for server to shut down.... done
server stopped
极好的!
数据库停止了。该网站无法正常工作,但除外。
正在尝试开始...
现在,自然地尝试重新启动它
$ sudo -u postgres pg_ctl -D /Library/PostgreSQL/12/data/ start
产量...
could not identify current directory: Permission denied
could not identify current directory: Permission denied
could not identify current directory: Permission denied
The program "postgres" is needed by pg_ctl but was not found in the
same directory as "pg_ctl".
Check your installation.
哦哦...
所以pg_ctl
不在同一个目录中......也许我需要在命令中指定它的路径
$ sudo -u postgres /Library/PostgreSQL/12/bin/pg_ctl -D /Library/PostgreSQL/12/data/ start
could not identify current directory: Permission denied
could not identify current directory: Permission denied
could not identify current directory: Permission denied
The program "postgres" is needed by pg_ctl but was not found in the
same directory as "pg_ctl".
Check your installation.
尝试#1
尝试别的东西,省略-D
因为我可能过于复杂的事情......
$ sudo -u postgres pg_ctl start
could not identify current directory: Permission denied
pg_ctl: no database directory specified and environment variable PGDATA unset
PGDATA
没有设置...我在我的用户上设置了它,所以我猜它不是为postgres
用户设置的。那就试试吧
$ sudo -u postgres export PGDATA="/Library/PostgreSQL/12/data/"
sudo: export: command not found
好吧,不是那样的。那么然后呢?!
进一步阅读,我看到一些使用initdb
(归功于此 Q 中的最终更新),而不是start
我想我会试一试。似乎没有其他任何工作,所以让我们尝试一下
$ sudo -u postgres /Library/PostgreSQL/12/bin/pg_ctl -D /Library/PostgreSQL/12/data/ initdb
could not identify current directory: Permission denied
could not identify current directory: Permission denied
could not identify current directory: Permission denied
The program "initdb" is needed by pg_ctl but was not found in the
same directory as "pg_ctl".
Check your installation.
尝试#2
也许重新排列命令一点点......
$ sudo su postgres pg_ctl initdb -D /Library/PostgreSQL/12/data/
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
/Library/PostgreSQL/12/bin/pg_ctl: /Library/PostgreSQL/12/bin/pg_ctl: cannot execute binary file
反复出现的主题,这一切是什么“无法访问目录”?我正在运行 sudo 和 postgres 用户,就像我读过的所有内容中的其他人一样!为什么它在我的情况下不起作用?...
尝试#3
$ ls -la /Library/PostgreSQL/12/data/
ls: : Permission denied
有道理...我记得以前尝试访问该 /data 目录,但仅限于 postgres 用户。
所以让我尝试做我迄今为止尝试过的事情并尝试ls
作为 postgres
$ sudo -u postgres ls -la /Library/PostgreSQL/12/data/
total 112
[...]
这是什么疯子?!它有效,我可以访问,但我无法运行启动数据库所需的任何命令!sudo 可以访问所有内容;postgres 可以访问该目录...
尝试#4
让我们检查一些其他的东西。
sudo -u postgres which pg_ctl
/Library/PostgreSQL/12/bin/pg_ctl
所以 postgres 有pg_ctl
,但不能运行它。
也许让我们尝试作为我的用户帐户,忘记 postgres 用户
$ pg_ctl initdb --pgdata=/Library/PostgreSQL/12/data/
The files belonging to this database system will be owned by user "Freemium".
**This user must also own the server process.**
The database cluster will be initialized with locale "en_GB.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
initdb: error: could not access directory "/Library/PostgreSQL/12/data": Permission denied
pg_ctl: database system initialization failed
所以它不能是我的用户帐户,我什至不想拥有该进程,这就是 postgres 用户的用途。
尝试#5
让我们尝试使用 root - 在这一点上,为什么不呢。
$ sudo pg_ctl initdb --pgdata=/Library/PostgreSQL/12/data/
pg_ctl: cannot be run as root
Please log in (using, e.g., "su") as the (unprivileged) user that will
own the server process.
不,即使是root也不想要它。在这两种情况下,它都暗示它必须是 postgres 用户。那么为什么 tf 不起作用???
尝试#6
此时我只是想知道如果我运行原始stop
命令会发生什么
$ sudo -u postgres pg_ctl -D /Library/PostgreSQL/12/data/ stop
could not identify current directory: Permission denied
嗯...再次使用当前目录权限...
回答
因此,为了启动数据库,您需要执行以下操作:
$ cd /Library/PostgreSQL/12/
(或您的进度所在的任何目录)
然后
最后!
解决方案!
当我写我的问题时,我想确保我已经涵盖了所有基础,以最好地传达我所尝试的内容,并为所有阅读此内容的人描绘出最好的画面。所有那些关于 root 和 postgres 用户对目录一无所知的消息开始让我发疯!
神奇的 sudo 怎么能不处理这个?!这是什么意思呢?这些“无法识别当前目录:权限被拒绝”消息到底是什么?
不知何故,我什至不记得是如何做到的,但可能在自动驾驶仪上我搜索了“无法识别当前目录:权限被拒绝”,因为我已经没有关于这个问题的查询并且遇到了这个。(我所有关于 postgres 的搜索都让搜索引擎知道这正是我正在寻找的东西,否则谁知道还会出现什么)。
在启动数据库的漫长而痛苦的探索之后,我找到了这颗宝石。
https://stackoverflow.com/a/50993745/2483927
唔...
在尝试并运行上面我的答案中的命令之后,我能够启动数据库并且一切都按需要工作!
几天来,我一直无法找到有关此问题的清晰简洁的信息。从我的 OP 中的尝试中可以看出,我的大多数搜索结果都让我找到了没有太大帮助的文档。其他人使用 Homebrew,或其他没有提供太多帮助的操作系统或文件夹结构;所以我希望任何处于类似情况的人都能快速轻松地找到这个,以避免我看到很多人经历的所有麻烦,包括我自己。