Подтвердить что ты не робот

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.

Если я запускаю обычный синд без восстановления, все работает хорошо.

Я что-то пропустил?

4b9b3361

Ответ 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 сейчас!