我如何强行删除破碎的Postgres数据库?

时间:2016-09-05 01:06:04

标签: postgresql

我有一个似乎因某种原因而被破坏的数据库。它是rails的开发数据库,​​因此我没有备份,但我确实需要继续开发。我试图放弃它,但那不起作用。

$ dropdb "database-name"
dropdb: database removal failed: ERROR:  could not open file "global/2964": No such file or directory

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

这里的错误比“破损”的数据库更多。你的PostgreSQL数据目录有些严重错误。

global/9264看起来像是pg_catalog.pg_db_role_setting,它存储ALTER DATABASE ... SET ...ALTER ROLE ... SET ...设置。这不是特定于数据库的,它是一个全局表。

如果您的数据目录中缺少文件,则整个PostgreSQL数据目录可能已损坏。你应该备份你可以做的事情,如果你有什么关心的事情,那么重命名或删除损坏的数据目录,initdb新的空白目录。

您将无法DROP此数据库(或执行其他操作),因为PostgreSQL无法加载pg_db_role_setting表的文件,但它需要删除引用丢弃的条目那里的数据库。

至于如何发生这种情况:

  • 您是否曾与fsync = off中的postgresql.conf合作?

  • 你有SSD存储吗?如果是这样,你最近有突然断电吗?

  • 你有没有在PostgreSQL数据目录中做过任何直接修改?

  • 外部存储上的PostgreSQL数据目录是否已被突然删除?

  • 您有没有删除postmaster.pid

另见https://wiki.postgresql.org/wiki/Corruption