如何啟動 PostgreSQL 12.4小號_X這小號XOSX
我不是來自 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,或其他沒有提供太多幫助的作業系統或文件夾結構;所以我希望任何處於類似情況的人都能快速輕鬆地找到這個,以避免我看到很多人經歷的所有麻煩,包括我自己。