我有一个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,则一切正常。
我在这里想念什么吗?
事实证明,还原后应将数据库中所有对象的显式所有权授予所有者。所有者不是超级用户。仅在数据库创建时设置所有者是不够的。迁移的最终解决方案是这样的:
在客户端上:
在服务器上:
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命令,但是这种形式很容易嵌入到脚本等中。