Django: разрешение отклонено при попытке доступа к базе данных после восстановления (миграции)
У меня есть приложение django 1.4 с заполненной базой данных postgres 9.1 на сервере разработки. После успешного развертывания я хотел переместить данные из локальной в онлайн-базу данных, поэтому я использовал:
pg_dump -f dump.sql -Ox database
а затем восстановлен на сервере с помощью:
psql -1 -f dump.sql database
Теперь, пытаясь войти в систему онлайн на веб-сайт, администратор выдает исключение "исключение для отношения django_session". Я попытался сбрасывать данные с/без -Ox-переключателем и всеми его комбинациями, но безуспешно. Я также отбрасываю базу данных и воссоздаю ее с нуля на сервере с правильным владельцем, как установлено в settings.py.
Если я запускаю обычный синд без восстановления, все работает хорошо.
Я что-то пропустил?
Ответы
Ответ 1
Оказывается, вы должны предоставить явное владение всеми объектами в базе данных владельцу после восстановления. Владелец не является суперпользователем. Этого недостаточно, чтобы установить владельца только при создании базы данных. Окончательное решение для миграции происходит следующим образом:
на клиенте:
pg_dump -f dump.sql -Ox database
на сервере:
su postgres
dropdb database
createdb database -O user
psql database -f dump.sql
а затем установить привилегии:
psql database -c "GRANT ALL ON ALL TABLES IN SCHEMA public to user;"
psql database -c "GRANT ALL ON ALL SEQUENCES IN SCHEMA public to user;"
psql database -c "GRANT ALL ON ALL FUNCTIONS IN SCHEMA public to user;"
Обратите внимание, что мы могли бы запустить команду sql в консоли psql, но эта форма легко встраивается в скрипты и т.д.
Ответ 2
Попробуйте сделать это от пользователя postgres
:
sudo su - postgres
pg_dump -f dump.sql -Ox database
Или просто передать флаг -U
:
pg_dump -f dump.sql -Ox database -U postgres
Ответ 3
Вот как я исправил мой. Я избавился от тонны головной боли, просто изменив пользователя, чтобы он соответствовал текущему зарегистрированному пользователю сервера назначения, где будет происходить импорт.
В моем случае импортированный db имел пользователя x (x также было именем пользователя для машины, на которой он работал), а машина назначения имела имя пользователя y и пользователь postgres y.
Поэтому я просто изменил Пользователь базы данных и пароль в настройках Django, чтобы соответствовать деталям пользователя конечного пользователя.
Затем сделал следующее:
$ sudo -u postgres psql
psql > GRANT ALL PRIVILEGES DATABASE ON mydb TO y;
Потягивая немного kool-aid сейчас!