删除角色PostgreSQL失败-数据库的缓存查找失败



这是我第一次使用PostgreSQL进行生产。

我用用户名blog_production创建了一个数据库blog_production,并从gemfilecapistrano-postgresql中生成了密码。一旦生成,我就尝试用这个命令从终端删除数据库blog_production

$ sudo -u postgres dropdb blog_production

之后,我尝试用以下命令删除用户blog_production

$ sudo -u postgres droprole blog_production

并返回dropuser: removal of role "blog_production" failed: ERROR: cache lookup failed for database 16417

1.)为什么会发生这种情况
2.)我也尝试使用DELETE FROM pg_roles WHERE rolname='blog_production'psql中删除,但它返回了相同的错误(缓存查找失败)
3.)如何解决此问题?

谢谢。

附加信息
PostgreSQL版本PostgreSQL 9.1.15 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit (1 row)

select * from pg_shdepend where dbid = 16417;

dbid  | classid | objid | objsubid | refclassid | refobjid | deptype 
-------+---------+-------+----------+------------+----------+---------
16417 |    1259 | 16419 |        0 |       1260 |    16418 | o
16417 |    1259 | 16426 |        0 |       1260 |    16418 | o
16417 |    1259 | 16428 |        0 |       1260 |    16418 | o
(3 rows)

select * from pg_database where oid = 16417;

datname | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datacl 
---------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+---------------+--------
(0 rows)

select * from pg_authid where rolname = 'blog_production'

rolname     | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcatupdate | rolcanlogin | rolreplication | rolconnlimit |             rolpassword             | rolvaliduntil 
-----------------+----------+------------+---------------+-------------+--------------+-------------+----------------+--------------+-------------------------------------+---------------
blog_production | f        | t          | f             | f           | f            | t           | f              |           -1 | md5d4d2f8789ab11ba2bd019bab8be627e6 | 
(1 row)

不知何故,DROP database;没有正确删除共享依赖项。PostgreSQL仍然认为您的用户在您删除的数据库中拥有三个表。

不用说,这种情况不应该发生;这几乎可以肯定是一个错误,尽管我不知道我们如何开始跟踪它,除非你确切地知道你运行了什么命令等等,从创建数据库开始就可以达到这一点。


如果PostgreSQL安装的数据不是很大,如果你可以共享内容,我能让你停止数据库服务器,对整个数据库目录做一个tarball,然后发给我吗?我想看看我能不能告诉你发生了什么事让你走到这一步。

将下拉框链接发送到craig@2ndquadrant.com。只是:

sudo service postgresql stop
sudo tar cpjf ~abrahamks/abrahamks-postgres.tar.gz 
/var/lib/postgresql/9.1/main 
/etc/postgresql/9.1/main 
/var/log/postgresql/postgresql-9.1-main-*.
/usr/lib/postgresql/9.1
sudo chown abrahamks ~abrahamks/abrahamks-postgres.tar.gz

并从主文件夹上传abrahamks-postgres.tar.gz

在系统上将abrahamks替换为您的用户名。如果我记错了PostgreSQL数据在Debian派生系统中的位置,您可能需要调整上面的路径。

请注意,它包含您的所有数据库,而不仅仅是一个有问题的数据库,它还包含您的PostgreSQL用户帐户。

(如果你要给我发一份副本,请在继续之前发送):


无论如何,由于数据库已删除,手动删除本应由DROP DATABASE:删除的依赖项是安全的

DELETE FROM pg_shdepend WHERE dbid = 16417

然后应该可以DROP USER blog_production;

最新更新