Postgresql

如何啟動 PostgreSQL 12.4小號_X這小號XOSX

  • August 27, 2020

我不是來自 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

嗯…再次使用目前目錄權限…

經過所有這些嘗試,如何簡單地start使用 PostgreSQL 伺服器?


回答

問題是sudo -u postgres.

您的 shell 以您的身份執行,但您以 postgres 使用者身份執行命令。它無權查看該文件,甚至無權查看目前目錄。

$$ … $$ cd到 postgres 使用者可以所在的目錄。

因此,為了啟動數據庫,您需要執行以下操作:

$ cd /Library/PostgreSQL/12/

(或您的進度所在的任何目錄)

然後

$ sudo -u postgres pg_ctl -D /Library/PostgreSQL/12/data/ start
waiting for server to start....
done
server started

最後!


解決方案!

當我寫我的問題時,我想確保我已經涵蓋了所有基礎,以最好地傳達我所嘗試的內容,並為所有閱讀此內容的人描繪出最好的畫面。所有那些關於 root 和 postgres 使用者對目錄一無所知的消息開始讓我發瘋!

神奇的 sudo 怎麼能不處理這個?!這是什麼意思呢?這些“無法辨識目前目錄:權限被拒絕”消息到底是什麼?

不知何故,我什至不記得是如何做到的,但可能在自動駕駛儀上我搜尋了“無法辨識目前目錄:權限被拒絕”,因為我已經沒有關於這個問題的查詢並且遇到了這個。(我所有關於 postgres 的搜尋都讓搜尋引擎知道這正是我正在尋找的東西,否則誰知道還會出現什麼)。

在啟動數據庫的漫長而痛苦的探索之後,我找到了這顆寶石。

https://stackoverflow.com/a/50993745/2483927

唔…

在嘗試並執行上面我的答案中的命令之後,我能夠啟動數據庫並且一切都按需要工作!


幾天來,我一直無法找到有關此問題的清晰簡潔的資訊。從我的 OP 中的嘗試中可以看出,我的大多數搜尋結果都讓我找到了沒有太大幫助的文件。其他人使用 Homebrew,或其他沒有提供太多幫助的作業系統或文件夾結構;所以我希望任何處於類似情況的人都能快速輕鬆地找到這個,以避免我看到很多人經歷的所有麻煩,包括我自己。

引用自:https://dba.stackexchange.com/questions/274334