我想做的就是備份現有的資料庫集群,以便從 Postgresql 9.4.8 升級到 9.5。我使用的是 Ubuntu 16.04。
我知道這個帖子:Postgres 密碼驗證失敗。事實上,自從我上次遇到這個問題以來,它就已經被添加了書籤。我不聲稱有任何有意義的 postgres 知識。我並不總是明白什麼應該是 psql 命令,什麼應該是 bash 命令,而且博客和我沒有看到的內容並不總是讓我清楚。 PG 只是我的 Django 專案的後端。我當然不明白我怎麼又遇到這個問題了。
我的 Ubuntu 用戶是 malikarumi。我有兩個 postgres 用戶,maikarumi 和 postgres。 Postgres 是超級用戶。前段時間我也嘗試讓 malikarumi 成為超級用戶,但顯然失敗了,不,我不知道為什麼。
這是我今天的第一次嘗試:
malikarumi@Tetuoan2:~$ pg_dumpall > 9-4-backup
pg_dumpall: query failed: ERROR: permission denied for relation pg_authid
pg_dumpall: query was: SELECT oid, rolname, rolsuper, rolinherit,rolcreaterole, rolcreatedb, rolcanlogin, rolconnlimit, rolpassword, rolvaliduntil, rolreplication, pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, rolname = current_user AS is_current_user FROM pg_authid ORDER BY 2
接下來是:
malikarumi@Tetuoan2:~$ pg_dumpall > 9-4-backup -U postgres
Password:
請注意,沒有任何內容,沒有幫助,沒有任何跡象表明出了什麼問題或該怎麼辦。
Password:
Password:
pg_dump: [archiver (db)] connection to database "esselldb" failed: FATAL: password authentication failed for user "postgres"
pg_dumpall: pg_dump failed on database "esselldb", exiting
然後我用空白密碼和分號再次嘗試
malikarumi@Tetuoan2:~$ pg_dumpall > 9-4-backup -U postgres;
Password:
pg_dumpall: could not connect to database "template1": fe_sendauth: no password supplied
請注意密碼適用於 psql
malikarumi@Tetuoan2:~$ psql -U postgres
Password for user postgres: Note the password works with psql
psql (9.4.8)
Type "help" for help.
但指令沒有,無論有沒有分號
postgres=# pg_dumpall > 9-4-backup
postgres-# pg_dumpall > 9-4-backup;
ERROR: syntax error at or near "pg_dumpall"
LINE 1: pg_dumpall > 9-4-backup
這有效
malikarumi@Tetuoan2:/etc/postgresql/9.4/main$ sudo cat pg_hba.conf
[sudo] password for malikarumi:
顯然,這是unix用戶,而不是資料庫用戶。但它始終是相同的密碼。
我改變了這個
# Database administrative login by Unix domain socket
local all postgres md5
按照上一篇文章中的建議進行對等(同樣 - 它怎麼能變回來?!)
但我無法重新啟動 postgres
malikarumi@Tetuoan2:/etc/postgresql/9.4/main$ pg_ctl stop
pg_ctl: command not found
malikarumi@Tetuoan2:/etc/postgresql/9.4/main$ cd ~
malikarumi@Tetuoan2:~$ pg_ctl stop
pg_ctl: command not found
psql 也不起作用
postgres=# pg_ctl stop
postgres-# pg_ctl stop;
ERROR: syntax error at or near "pg_ctl"
LINE 1: pg_ctl stop
^
postgres=#
但至少 psql 仍然讓我進去...
所以我重新啟動了整個機器並再次嘗試。你知道發生了什麼
malikarumi@Tetuoan2:~$ pg_dumpall > 9-4-backup -U postgres
pg_dumpall: could not connect to database "template1": FATAL: Peer authentication failed for user "postgres"
所以我確實成功地改變了它,但我仍然無法讓它工作。注意:它沒有詢問我的密碼!
然後我嘗試了這個
malikarumi@Tetuoan2:~$ su postgres
Password: the right one
su: Authentication failure
malikarumi@Tetuoan2:~$ su postgres
Password: a blank one
su: Authentication failure
現在您已了解最新情況。順便說一句,我已經看過 postgres 官方文件很多次了,發現它們很晦澀難懂。如果您還知道像我這樣的非資料庫人員的良好基礎教程,那將會很有幫助。謝謝。
答案1
根據上下文,所有提到的故障都預計會發生,但以下情況除外:
malikarumi@Tetuoan2:~$ pg_dumpall > 9-4-backup -U postgres
Password:
這裡報失敗,但還有下面的情況:
malikarumi@Tetuoan2:~$ psql -U postgres
Password for user postgres: Note the password works with psql
您報告成功。
但這並不能說明問題。相同的密碼必須在您提到的精確上下文中同樣有效pg_dumpall
,即:
- 身份驗證模式設定為
md5
inpg_hba.conf
(在文章其餘部分更改它之前)。 - 透過此選項目標資料庫使用者是postgres
-U postgres
。 - 該命令被您自己的 unix 使用者呼叫 shell
malikarumi
。
成功將身份驗證方案更改為peer
(問題的最後一部分)後,出現問題的是您嘗試su
而不是使用sudo
,後者是 Ubuntu 上推薦的方法。
在 shell 提示字元下使用此命令:
malikarumi@Tetuoan2:~$ sudo -u postgres pg_dumpall >9-4-backup
它會要求輸入密碼,顯示類似以下內容:
[sudo] password for malikarumi:
請注意,它期望你的密碼,與您在名稱下開啟會話時使用的相同malikarumi
,而不是 postgres 的密碼或資料庫密碼。
sudo -u postgres somepostgrescommand
sudo someadmincommand
如果您是該 Ubuntu 工作站的管理員,這只是您可以執行的操作的變體。