2 votes

Exécution de VACUUM FULL sur une base de données postgresql qui est arrêtée/arrêtée.

J'essaie de redémarrer une base de données postgresql qui s'est arrêtée/est en panne et qui nécessite une réparation. VACUUM .

http://suwala.eu/blog/2010/10/09/how-to-vacuum-postgresql/

En suivant la séquence de commandes ci-dessus, je ne parviens pas à exécuter correctement la dernière ligne.

$ postgres -D /var/lib/pgsql/data YOUR_DATABASE_NAME < /tmp/fix.sql  

Cela me donne une erreur qui dit

postgres: invalid argument: "YOUR_DATABASE_NAME"
Try "postgres --help" for more information.

Vous savez pourquoi ?

CLARIFICATION

Le nom 'YOUR_DATABASE_NAME' et le répertoire de données que j'ai utilisé sur mon serveur sont les bons.

7voto

kgrittn Points 6058

La page "how-to-vacuum-postgresql" référencée dans la question donne de très mauvais conseils lorsqu'elle recommande VACUUM FULL . Tout ce qui est nécessaire est un vide de la base de données complète, qui est simplement un VACUUM s'exécute en tant que superutilisateur de la base de données sur l'ensemble de la base de données (c'est-à-dire que vous ne spécifiez aucun nom de table).

A VACUUM FULL fonctionne différemment selon la version, mais il élimine tout l'espace dans les fichiers du tas qui est conservé par la base de données pour une réutilisation rapide, et le libère pour le système d'exploitation. Cela peut être beaucoup plus lent que le minimum nécessaire pour revenir à une base de données utilisable, par ordre de grandeur. Et puisque toutes les insertions ou mises à jour après la VACUUM FULL nécessitent des appels au système d'exploitation pour réallouer de l'espace à la base de données, cela peut entraîner un ralentissement de l'exécution par la suite, à moins que votre base de données ne soit très gonflée. (Bien que, si vous avez désactivé l'autovacuum, elle pourrait être dans un état horrible, mais vous voulez probablement vous remettre sur pied d'abord, et régler cela plus tard).

Un autre problème avec VACUUM FULL avant la version 9.0 est que, bien qu'elle élimine le gonflement des fichiers de tas d'une table, elle tend à augmentation de dans ses fichiers d'index, parfois de façon spectaculaire. Si vous émettez un VACUUM FULL vous devez normalement le faire suivre d'un REINDEX pour remettre les index en bon état.

La page mentionnée dans la question ne tient pas compte non plus des conseils donnés dans la documentation de PostgreSQL à l'adresse suivante http://www.postgresql.org/docs/8.3/interactive/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND pour utiliser le mode mono-utilisateur :

puisque le système n'exécutera pas de commandes une fois qu'il sera passé dans le mode mode d'arrêt de sécurité, la seule façon d'y parvenir est d'arrêter le serveur et d'utiliser un backend mono-utilisateur pour exécuter VACUUM. Le mode d'arrêt n'est n'est pas appliqué par un backend mono-utilisateur. Consultez la page de référence postgres pour plus de détails sur l'utilisation d'un backend mono-utilisateur.

Comme d'autres l'ont mentionné, il n'y a pratiquement aucun cas d'utilisation où la désactivation de l'autovacuum est bénéfique. Il peut être utile de supplément l'activité d'autovacuum avec des aspirateurs explicites sur les grandes tables, ou vous pouvez vouloir ajuster la configuration d'autovacuum, mais vraiment -- ne le désactivez pas ou vous verrez un gonflement qui sape les performances et vous rencontrerez périodiquement des problèmes d'enveloppement d'ID de transaction. Les personnes qui remarquent une baisse de performance lorsque autovacuum effectue la maintenance ont parfois l'instinct de le rendre moins agressif dans son déclenchement, mais cela est généralement contre-productif. Il est généralement préférable d'ajuster les paramètres de limitation des coûts d'autovacuum pour rythmer le travail, plutôt que de le laisser négliger les tables qui ont besoin de maintenance.

6voto

BluesRockAddict Points 7537

Il semble que ce soit un problème dans PostgreSQL, car selon la documentation de l'application 9.0 y 8.3 il devrait fonctionner avec ces versions mais ne le fait pas.

Cependant, l'utilisation du commutateur --single permet de le faire fonctionner :

postgres --single -D [path-to-data-dir] [db-name] < /tmp/fix.sql

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X