2016-09-05 3 views
0

Ich habe eine Datenbank, die aus irgendeinem Grund zu brechen scheint. Es ist eine Entwicklungsdb für Schienen, also habe ich kein Backup, aber ich muss weiter entwickeln. Ich habe versucht, es einfach fallen zu lassen, aber das funktioniert nicht.Wie kann ich eine beschädigte Postgres-Datenbank löschen?

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

Vielen Dank im Voraus für jede Hilfe!

+0

try Rake Entwicklung db auch: fallen – DottedT

+0

'rake Entwicklung db: drop' ist keine Schienen Aufgabe Rake. – HarlemSquirrel

Antwort

1

Hier ist mehr falsch als eine "kaputte" Datenbank. Etwas stimmt nicht mit Ihrem PostgreSQL-Datenverzeichnis.

global/9264 sieht aus wie es pg_catalog.pg_db_role_setting ist, die ALTER DATABASE ... SET ... und ALTER ROLE ... SET ... Einstellungen speichert. Dies ist nicht datenbankspezifisch, es ist eine globale Tabelle.

Wenn in Ihrem Datenverzeichnis Dateien fehlen, ist Ihr gesamtes PostgreSQL-Datenverzeichnis wahrscheinlich beschädigt. Sie sollten sichern, was Sie können, wenn es etwas gibt, das Ihnen wichtig ist, dann umbenennen oder löschen Sie das beschädigte Datenverzeichnis und initdb ein neues leeres.

Sie können DROP diese Datenbank nicht (oder noch viel mehr), weil PostgreSQL die Dateien für die Tabelle pg_db_role_setting nicht laden kann, aber es müssen Einträge löschen, die sich auf die gelöschte Datenbank beziehen.


Was, wie das passiert ist:

  • Haben Sie schon einmal mit fsync = off in postgresql.conf laufen?

  • Haben Sie SSD-Speicher? Wenn ja, hatten Sie in letzter Zeit einen plötzlichen Stromausfall?

  • Haben Sie jemals irgendwelche direkten Änderungen innerhalb des PostgreSQL-Datenverzeichnisses vorgenommen?

  • Ist das PostgreSQL-Datenverzeichnis auf externem Speicher möglicherweise plötzlich entfernt worden?

  • Haben Sie schon mal postmaster.pid gelöscht?

Siehe https://wiki.postgresql.org/wiki/Corruption

+0

OK, ja ich benutze SSD-Speicher und manchmal mein Computer friert ein, so dass die Korruption erklären könnte. Ich habe die Datenbankdateien von '/ var/lib/postgres/data' nach' dat.old' verschoben und versucht, init zu bekommen, habe aber keine Erlaubnis bekommen, also habe ich 'chown postgres: postgres/var/lib/postgres' gemacht und war dann dazu in der Lage drin. Allerdings bekomme ich immer noch den gleichen Fehler. Ich denke, vielleicht ist meine Datenbank an einem anderen Ort. – HarlemSquirrel

+0

Es stellte sich heraus, dass ich den Hintergrunddienst mit 'sudo systemctl restart postgresql' neu starten musste, nachdem ich die alten Dateien entfernt und eine init-Prozedur ausgeführt hatte. Danke für Ihre Hilfe! – HarlemSquirrel

+1

Sie sollten PostgreSQL wirklich stoppen, löschen/umbenennen, init, dann starten Sie es erneut. Lassen Sie es nicht laufen, während Sie alle seine Dateien löschen. Sie wollen nicht, dass der alte Postmaster versucht, in das neue initdb'd-Verzeichnis zu schreiben. Wenn Sie Probleme mit dem Einfrieren/Absturz und einer SSD haben, stellen Sie sicher, dass es sich um eine SSD mit guter Qualität und einem Superkondensator oder einem anderen Schutz vor Stromausfall handelt. Oder halten Sie gute Backups. –

Verwandte Themen