Все, что я пытаюсь сделать, это сделать резервную копию моего существующего кластера базы данных, чтобы обновить 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
вpg_hba.conf
(до того, как вы измените ее в остальной части поста). - целевой пользователь базы данных — postgres через
-U postgres
опцию. - команда вызывает оболочку из вашего собственного пользователя unix
malikarumi
.
После того, как вы успешно изменили схему аутентификации на peer
(последняя часть вашего вопроса), проблема в том, что вы пытаетесь su
вместо этого использовать sudo
, последний метод является рекомендуемым в Ubuntu.
Используйте эту команду в командной строке:
malikarumi@Tetuoan2:~$ sudo -u postgres pg_dumpall >9-4-backup
Он запросит пароль и отобразит что-то вроде:
[sudo] password for malikarumi:
Обратите внимание, что ожидаетсяваш пароль, тот же самый, который вы используете при открытии сеанса под этим malikarumi
именем, в отличие от пароля postgres или пароля базы данных.
sudo -u postgres somepostgrescommand
— это всего лишь вариант того, что sudo someadmincommand
вам разрешено делать, если вы являетесь администратором этой рабочей станции Ubuntu.