我不是来自 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
嗯...再次使用当前目录权限...