Django:在还原(迁移)后尝试访问数据库时权限被拒绝

Posted

技术标签:

【中文标题】Django:在还原(迁移)后尝试访问数据库时权限被拒绝【英文标题】:Django: permission denied when trying to access database after restore (migration) 【发布时间】:2012-08-27 07:35:42 【问题描述】:

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

我错过了什么吗?

【问题讨论】:

【参考方案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;"

请注意,我们可以在 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 提示符并转储。 没有改变,仍然有同样的问题。 FWIW,我在服务器上使用了一个特殊用户(在客户端上不存在),这反映在 setting.py 中,当我在服务器上重新创建数据库时(在还原之前),我使用类似:createdb database -O special_user 然后我恢复。【参考方案3】:

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

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

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

然后这样做:

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

现在喝点酷爱饮料!

【讨论】:

以上是关于Django:在还原(迁移)后尝试访问数据库时权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer 2014 还原数据库时提示:操作系统返回了错误5,,拒绝访问

在 vagrant 的 Django 应用程序中创建迁移文件夹的权限被拒绝

Django 从 2.0 迁移到 2.2(查看权限问题)

ADMT迁移之:在迁移过程中保留对源域资源的访问权限

未授予 Django 管理员访问权限

在测试期间更改 Django 迁移应用程序的顺序