Django:恢复(迁移)后访问数据库时出现权限被拒绝的错误

38

我有一个Django 1.4应用程序,在本地开发服务器上拥有一个已填充的Postgres 9.1数据库。部署成功后,我想将数据从本地移动到在线数据库,所以我使用了:

pg_dump -f dump.sql -Ox database

然后在服务器上使用以下代码进行恢复:

psql -1 -f dump.sql database

现在尝试在线登录网站管理员会抛出“permission denied for relation django_session”的异常。我尝试使用/不使用-Ox开关以及它的所有组合来转储数据,但没有成功。我还从头开始删除并重新创建具有在settings.py中设置的正确所有者的服务器上的数据库。

如果我运行普通的syndb而不进行恢复,则一切正常。

这里我漏掉了什么吗?

3个回答

108

事实证明,在恢复后,您应该显式地将数据库中的所有对象授予所有者。所有者不是超级用户。仅在创建数据库时设置所有者是不够的。迁移的最终解决方案如下:

在客户端上执行以下操作:

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;"

请注意,我们可以在psql控制台中运行SQL命令,但是此形式更容易嵌入到脚本等中。


2
尝试从“postgres”用户执行此操作:
sudo su - postgres
pg_dump -f dump.sql -Ox database

或者只需传递-U标志:

pg_dump -f dump.sql -Ox database -U postgres

我忘了提到,我的客户端操作系统是Windows 7,没有postgres su。我只需打开DOS提示符并转储即可。 - Rabih Kodeih
没什么变化,问题仍然存在。顺便提一下,我在服务器上使用了一个特殊的用户(客户端上不存在),并且在 setting.py 中有所体现。当我在服务器上重新创建数据库(还原之前),我使用类似于 createdb database -O special_user 然后再进行还原。 - Rabih Kodeih

0

这是我如何解决的。我通过将用户更改为与导入目标服务器上当前登录的用户匹配,从而避免了很多麻烦。

在我的情况下,导入的数据库具有用户x(x也是运行它的计算机的用户名),目标计算机具有用户名y和一个名为y的postgres用户。

因此,我只需在Django设置中更改数据库用户和密码以匹配目标计算机的y用户详细信息。

然后执行以下操作:

$ sudo -u postgres psql psql > GRANT ALL PRIVILEGES DATABASE ON mydb TO y;

现在可以放心地使用了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接