39

我在本地开发服务器中有一个 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,那么一切正常。

我在这里错过了什么吗?

4

3 回答 3

104

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

在客户端:

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 命令,但这种形式很容易嵌入到脚本等中。

于 2012-09-02T14:04:17.860 回答
2

尝试从postgres用户执行此操作:

sudo su - postgres
pg_dump -f dump.sql -Ox database

或者只是传递-U标志:

pg_dump -f dump.sql -Ox database -U postgres
于 2012-09-02T02:48:58.303 回答
0

这是我修复我的方法。通过简单地更改用户以匹配将发生导入的目标服务器的当前登录用户,我为自己省去了很多麻烦。

在我的例子中,导入的 db 有一个用户 x(x 也是运行它的机器的用户名),目标机器的用户名是 y,postgres 用户也是 y。

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

然后这样做:

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

现在喝一些kool-aid!

于 2017-08-07T23:17:21.263 回答