Вопрос или проблема
Все, что я пытаюсь сделать, это создать резервную копию моего существующего кластера баз данных, чтобы обновиться с 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: запрос не выполнен: ОШИБКА: отказано в доступе к отношению pg_authid
pg_dumpall: запрос был: 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
Пароль:
Обратите внимание, что ничего нет, нет помощи, нет указания, что не так или что делать с этим.
Пароль:
Пароль:
pg_dump: [архиватор (db)] соединение с базой данных "esselldb" не удалось: ФАТАЛЬНО: ошибка аутентификации пароля для пользователя "postgres"
pg_dumpall: pg_dump завершил работу с ошибкой на базе данных "esselldb", выход
Затем я попробовал снова с пустым паролем и точкой с запятой:
malikarumi@Tetuoan2:~$ pg_dumpall > 9-4-backup -U postgres;
Пароль:
pg_dumpall: не удается подключиться к базе данных "template1": fe_sendauth: не указан пароль
Заметьте, что пароль работает для psql:
malikarumi@Tetuoan2:~$ psql -U postgres
Пароль для пользователя postgres: Обратите внимание, что пароль работает с psql
psql (9.4.8)
Введите "help" для помощи.
Но команда не работает, с или без точки с запятой:
postgres=# pg_dumpall > 9-4-backup
postgres-# pg_dumpall > 9-4-backup;
ОШИБКА: ошибка синтаксиса вблизи "pg_dumpall"
LINE 1: pg_dumpall > 9-4-backup
Это работает:
malikarumi@Tetuoan2:/etc/postgresql/9.4/main$ sudo cat pg_hba.conf
[sudo] пароль для malikarumi:
Явно, это пользователь unix, а не пользователь базы данных. Но это так и всегда было, один и тот же пароль.
Я изменил это:
# Вход в базу данных административного уровня через сокет домена Unix
local all postgres md5
на peer, как было предложено в предыдущем посте (опять же – как это могло измениться обратно?!)
Но я не смог перезапустить postgres:
malikarumi@Tetuoan2:/etc/postgresql/9.4/main$ pg_ctl stop
pg_ctl: команда не найдена
malikarumi@Tetuoan2:/etc/postgresql/9.4/main$ cd ~
malikarumi@Tetuoan2:~$ pg_ctl stop
pg_ctl: команда не найдена
Это не сработало и из psql:
postgres=# pg_ctl stop
postgres-# pg_ctl stop;
ОШИБКА: ошибка синтаксиса вблизи "pg_ctl"
LINE 1: pg_ctl stop
^
postgres=#
Но, по крайней мере, psql все еще пропускает меня…
Итак, я перезагрузил всю машину и попробовал снова. Вы знаете, что случилось:
malikarumi@Tetuoan2:~$ pg_dumpall > 9-4-backup -U postgres
pg_dumpall: не удается подключиться к базе данных "template1": ФАТАЛЬНО: ошибка аутентификации по пиру для пользователя "postgres"
Итак, я успешно его изменил, но все еще не могу заставить его работать. ПРИМЕЧАНИЕ: Он не спросил меня о моем пароле!
Затем я попробовал это:
malikarumi@Tetuoan2:~$ su postgres
Пароль: правильный
su: Ошибка аутентификации
malikarumi@Tetuoan2:~$ su postgres
Пароль: пустой
su: Ошибка аутентификации
И теперь вы в курсе событий. Кстати, я много раз обращался к официальной документации postgres и нахожу их запутанными и едва понимаемыми. Если вы также знаете хороший базовый учебник для человека, не знакомого с базами данных, как я, это было бы полезно. Спасибо.
Все упомянутые неудачи ожидаемы в данном контексте, за исключением одной:
malikarumi@Tetuoan2:~$ pg_dumpall > 9-4-backup -U postgres
Пароль:
Здесь вы сообщаете о неудаче, но в другой ситуации ниже:
malikarumi@Tetuoan2:~$ psql -U postgres
Пароль для пользователя postgres: Обратите внимание, что пароль работает с 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] пароль для malikarumi:
Обратите внимание, что он ожидает ваш пароль, тот же, который вы используете при открытии своей сессии под именем malikarumi
, в отличие от пароля postgres или пароля базы данных.
sudo -u postgres somepostgrescommand
– это всего лишь вариант sudo someadmincommand
, который вам разрешено выполнять, если вы администратор этой рабочей станции Ubuntu.
Ответ или решение
Ваша проблема с получением авторизации для выполнения команды pg_dumpall
является распространенной среди пользователей PostgreSQL, особенно при переходе между разными версиями этой СУБД. Давайте разберем ваши действия и предложим решение.
Понимание проблемы
Сначала рассмотрим ваши действия. Вы пытаетесь выполнить команду pg_dumpall
под учетной записью пользователя malikarumi
, что вызывает сообщение об ошибке: ERROR: permission denied for relation pg_authid
. Это означает, что пользователь, под которым выполняется команда, не имеет достаточно прав для доступа к необходимым системным таблицам PostgreSQL.
При выполнении команды pg_dumpall
необходимо использовать учетную запись с суперпользовательскими правами. Вы упомянули, что у вас есть пользователь postgres
, который является суперадминистратором.
Ошибки выполнения команды
-
Аутентификация: Когда вы пытались выполнить
pg_dumpall -U postgres
, и у вас возникла ошибкаFATAL: password authentication failed for user "postgres"
, это указывает на то, что вы либо неправильно вводите пароль, либо вашpg_hba.conf
не настроен должным образом. -
Ошибка синтаксиса: Когда вы по ошибке пытались выполнить команду
pg_dumpall
из командной строки psql, вы получили сообщение об ошибкеsyntax error
. Эта ошибка возникает потому, что в psql команды не могут использовать оператор перенаправления>
. -
Замена авторизации на peer: Изменение настройки на
peer
вpg_hba.conf
требует, чтобы пользователь системы соответствовал пользователю базы данных. Вы не сможете использоватьpg_dumpall
напрямую от имениpostgres
, если вы переключаетесь на него черезsu
.
Рекомендации по решению проблемы
-
Настройка
pg_hba.conf
: Вероятнее всего, вы хотите использовать метод аутентификацииmd5
. Проверьте ваш файл конфигурации/etc/postgresql/9.4/main/pg_hba.conf
и убедитесь, что строчка для пользователяpostgres
выглядит следующим образом:local all postgres md5
После изменения, не забудьте перезапустить PostgreSQL:
sudo service postgresql restart
-
Выполнение команды с
sudo
: Вместо использования командыsu
, вам следует использовать командуsudo
. Эта команда позволяет выполнять команды от имени суперпользователя. Для резервного копирования базы данных выполните:sudo -u postgres pg_dumpall > 9-4-backup
Здесь
sudo -u postgres
означает, что команда будет выполнена от имени пользователяpostgres
, который имеет все необходимые привилегии. -
Пароль пользователя
postgres
: Если вы уверены в правильности пароля пользователяpostgres
, вы можете проверить его, выполнив команду:psql -U postgres
Если она проходит успешно, то проблема может заключаться в настройках
pg_hba.conf
или в том, что вы пытаетесь переключиться наpostgres
с помощьюsu
.
Заключение
Эта проблема связана с настройками аутентификации PostgreSQL и правами доступа для пользователей. Используя подходящие команды и уверенность в правильности настроек, вы сможете успешно выполнить команду pg_dumpall
. Если вы продолжаете сталкиваться с проблемами, рассмотрите возможность проверки логов PostgreSQL для получения дополнительных подсказок.
Также, если вы ищете более простые источники информации о PostgreSQL, обратите внимание на официальную документацию или видеоуроки, которые могут помочь вам лучше понять структуру и основные команды PostgreSQL.