我有一个django 1.4应用程序,在本地开发服务器中有一个填充的postgres 9.1数据库。成功部署后,我想将数据从本地数据库移动到在线数据库,所以我使用了:
pg_dump -f dump.sql -Ox database
然后在服务器上恢复:
psql -1 -f dump.sql database
现在尝试在线登录网站管理员会抛出“关系django_session拒绝权限”异常。我试图使用/不使用-Ox开关及其所有组合转储数据,但没有成功。我也放弃数据库并在服务器上从头开始重新创建数据库,并在settings.py中设置了正确的所有者。
如果我在没有恢复的情况下运行正常的syndb,那么一切都运行良好。
我在这里错过了什么吗?
答案 0 :(得分:95)
事实证明,您应该在还原后将数据库中所有对象的显式所有权授予所有者。所有者不是超级用户。仅在数据库创建时设置所有者是不够的。迁移的最终解决方案如下:
在客户端:
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命令,但是这个表单很容易嵌入到脚本等中。
答案 1 :(得分:2)
尝试从postgres
用户执行此操作:
sudo su - postgres
pg_dump -f dump.sql -Ox database
或者只是传递-U
标志:
pg_dump -f dump.sql -Ox database -U postgres
答案 2 :(得分:0)
这是我如何修理我的。通过简单地更改用户以匹配导入将发生的目标服务器的当前登录用户,我为自己省去了大量的麻烦。
在我的情况下,导入的数据库的用户为x(x也是运行它的机器的用户名),目标机器的用户名为y,postgres用户也是y。
因此,我只是在Django设置中更改了数据库用户和密码,以匹配目标计算机的y用户详细信息。
然后做了这个:
$ sudo -u postgres psql
psql > GRANT ALL PRIVILEGES DATABASE ON mydb TO y;
现在喝一些kool-aid!