Не удается получить разрешение на выполнение pg_dumpall

Вопрос или проблема

Все, что я пытаюсь сделать, это создать резервную копию моего существующего кластера баз данных, чтобы обновиться с 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, который является суперадминистратором.

Ошибки выполнения команды

  1. Аутентификация: Когда вы пытались выполнить pg_dumpall -U postgres, и у вас возникла ошибка FATAL: password authentication failed for user "postgres", это указывает на то, что вы либо неправильно вводите пароль, либо ваш pg_hba.conf не настроен должным образом.

  2. Ошибка синтаксиса: Когда вы по ошибке пытались выполнить команду pg_dumpall из командной строки psql, вы получили сообщение об ошибке syntax error. Эта ошибка возникает потому, что в psql команды не могут использовать оператор перенаправления >.

  3. Замена авторизации на peer: Изменение настройки на peer в pg_hba.conf требует, чтобы пользователь системы соответствовал пользователю базы данных. Вы не сможете использовать pg_dumpall напрямую от имени postgres, если вы переключаетесь на него через su.

Рекомендации по решению проблемы

  1. Настройка pg_hba.conf: Вероятнее всего, вы хотите использовать метод аутентификации md5. Проверьте ваш файл конфигурации /etc/postgresql/9.4/main/pg_hba.conf и убедитесь, что строчка для пользователя postgres выглядит следующим образом:

    local   all             postgres                                md5

    После изменения, не забудьте перезапустить PostgreSQL:

    sudo service postgresql restart
  2. Выполнение команды с sudo: Вместо использования команды su, вам следует использовать команду sudo. Эта команда позволяет выполнять команды от имени суперпользователя. Для резервного копирования базы данных выполните:

    sudo -u postgres pg_dumpall > 9-4-backup

    Здесь sudo -u postgres означает, что команда будет выполнена от имени пользователя postgres, который имеет все необходимые привилегии.

  3. Пароль пользователя postgres: Если вы уверены в правильности пароля пользователя postgres, вы можете проверить его, выполнив команду:

    psql -U postgres

    Если она проходит успешно, то проблема может заключаться в настройках pg_hba.conf или в том, что вы пытаетесь переключиться на postgres с помощью su.

Заключение

Эта проблема связана с настройками аутентификации PostgreSQL и правами доступа для пользователей. Используя подходящие команды и уверенность в правильности настроек, вы сможете успешно выполнить команду pg_dumpall. Если вы продолжаете сталкиваться с проблемами, рассмотрите возможность проверки логов PostgreSQL для получения дополнительных подсказок.

Также, если вы ищете более простые источники информации о PostgreSQL, обратите внимание на официальную документацию или видеоуроки, которые могут помочь вам лучше понять структуру и основные команды PostgreSQL.

Оцените материал
Добавить комментарий

Капча загружается...