web-dev-qa-db-fra.com

Réparer la base de données corrompue postgresql

J'ai plusieurs erreurs avec ma base de données postgresql, résultant d'une surtension:

Je ne peux pas accéder à la plupart des tables de ma base de données. Quand j'essaie par exemple select * from ac_cash_collection

lorsque j'essaie pg_dump, j'obtiens l'erreur suivante:

 Message d'erreur du serveur: ERREUR: la relation "public.st_stock_item_newlist" n'existe pas 
 Pg_dump: la commande était: LOCK TABLE public.st_stock_item_newlist EN MODE ACCÈS PARTAGÉ.

Je suis allé de l'avant et j'ai essayé de réindexer toute la base de données. En fait, je l'ai laissée en cours d'exécution, je me suis endormie et j'ai constaté qu'elle n'avait rien fait le matin. J'ai donc dû l'annuler.

J'ai besoin d'aide pour résoudre ce problème le plus rapidement possible. Aidez-moi, s'il vous plaît.

13
Jeff Lee Ngotho

Avant de faire rien sinon, http://wiki.postgresql.org/wiki/Corruptionet de suivre les instructions. Ne pas le faire risque d’aggraver le problème.


Il existe deux paramètres de configuration répertoriés dans le manuel Fine Manual qui pourraient être utiles: ignore_system_indexes et zero_damaged_pages. Je ne les ai jamais utilisés, mais je le ferais si j'étais désespéré ...

Je ne sais pas s'ils aident contre les toasts. Dans tous les cas, si leur configuration rend votre (vos) base (s) base (s) utilisable (s) à nouveau, je voudrais {backup + drop + restore} remettre toutes les tables et tous les catalogues à la forme. Succès!

7
wildplasser

Si vous avez des sauvegardes, restaurez-les simplement.

Sinon, vous venez d'apprendre pourquoi vous avez besoin de sauvegardes régulières. PostgreSQL ne peut rien faire si le matériel se comporte mal.

De plus, si vous vous retrouvez de nouveau dans cette situation, arrêtez d'abord PostgreSQL et effectuez une sauvegarde complète au niveau des fichiers de tous les éléments - tous les espaces table, WAL, etc. Ainsi, vous avez un point de départ connu.

Donc, si vous voulez toujours récupérer des données.

  1. Essayez de vider des tables individuelles. Obtenez ce que vous pouvez de cette façon.
  2. Supprimer les index s'ils causent des problèmes
  3. Vider des sections de tables (id = 0..9999, 1000..19999, etc.) - de cette façon, vous pouvez identifier les endroits où certaines lignes peuvent être corrompues et vider des sections toujours plus petites pour récupérer ce qui est encore correct.
  4. Essayez de ne stocker que certaines colonnes: les valeurs de texte volumineuses sont stockées hors ligne (dans les tables de pain grillé), de sorte que leur élimination peut extraire le reste de vos données.
  5. Si vous avez des tables système corrompues, vous vous engagez dans beaucoup de travail.

Cela demande beaucoup de travail et vous devrez ensuite vérifier et vérifier ce que vous avez récupéré, puis essayer de déterminer ce qui manque/est incorrect.

Il y a plus de choses que vous pouvez faire (créer des blocs vides dans certains cas peut vous permettre de vider des données partielles), mais elles sont toutes plus compliquées et fastidieuses et à moins que les données ne soient particulièrement précieuses et ne valent pas la peine.

Message clé à retenir: veillez à effectuer des sauvegardes régulières et à leur bon fonctionnement.

7
Richard Huxton

Avant toute chose, créez une copie complète au niveau du système de fichiers de la base de données endommagée.

http://wiki.postgresql.org/wiki/Corruption

Ne pas le faire détruit les preuves sur la cause de la corruption et signifie que si vos efforts de réparation vont mal et aggravent les choses, vous ne pouvez pas les annuler.

Copiez-le maintenant!

1
Craig Ringer