2009-09-04 24 views
0

J'ai un "petit" problème. Il y a une semaine, ma base de données atteignait sa capacité maximale. J'ai supprimé plusieurs lignes dans différentes tables en essayant de libérer de l'espace disque. Après quoi j'ai essayé de faire un vide complet qui ne s'est pas terminé.Fichiers temp de postgreSQL?

Ce que je veux savoir est. Quand j'ai arrêté le vide de complètement compliant laisse-t-il des dossiers de temp sur le disque que je dois supprimer manuellement? J'ai maintenant une base de données qui est à 100% de la capacité du disque, ce qui, inutilement, est un gros problème.

Des conseils pour libérer de l'espace disque? J'utilise SUSE avec une base de données postgres 8.1.4.

Répondre

4

d'abord:

UPGRADE

Même si vous ne pouvez pas à 8,2, 8,3 ou 8,4 - au moins une mise à niveau au plus récent 8.1 (qui est 8.1.17 au moment, mais 8,1 .18 en 1-2 jours).

Deuxièmement: diagnostiquer quel est le problème.

Utilisez l'outil du pour diagnostiquer l'emplacement exact de l'espace. Quel répertoire occupe trop d'espace?

Vérifiez avec df quel est l'espace total utilisé, puis vérifiez le nombre de répertoires PostgreSQL.

La meilleure option est de:

cd YOUR_PGDATA_DIR 
du -sk * 
cd base 
du -sk * 
cd LARGEST DIR FROM PREVIOUS COMMAND 
du -sk * | sort -nr | head 

Maintenant que vous savez quel répertoire PGDATA utilise l'espace que vous pouvez faire quelque chose à ce sujet. Si c'est logs ou pg_temp - redémarrez pg ou supprimez les logs (pg_clog et pg_xlog ne sont pas des logs dans le sens commun du mot, ne supprimez jamais rien à partir de là!).

Si c'est quelque chose dans votre répertoire de base, puis:

répertoires numériques dans le répertoire de base se rapportent à des bases de données. Vous pouvez le vérifier avec:

select oid, datname from pg_database; 

Lorsque vous connaissez la base de données qui utilise la plupart de l'espace, connectez-vous, et vérifier quels fichiers utilisent la plupart de l'espace.

Les noms de fichiers seront suffixe numérique avec option « .digits » - ce suffixe est (pour l'instant) hors de propos, et vous pouvez vérifier exactement ce que le fichier représente par l'émission:

select relname from pg_class where relfilenode = <NUMBER_FROM_FILE_NAME>; 

Une fois que vous savez quels tableaux/indexes utilisent la plupart de l'espace - vous pouvez VACUUM FULL, ou (beaucoup mieux) émettre la commande CLUSTER sur eux.

+0

Merci pour la réponse! Mon problème est que le disque est plein à 100%. Vide et cluster ont besoin d'espace disque libre pour fonctionner. Est-il possible de supprimer complètement les données de la base de données sans exécuter le vide/cluster? – jorgen

+0

Trouvez une table que vous pouvez sacrifier et TRUNCATE. Il va libérer de l'espace immédiatement. –

+0

Merci pour votre aide! – jorgen

1

Sur la nouvelle tangente à votre problème, vous pouvez trouver ce que dans la base de données utilise beaucoup d'espace en utilisant un query. Cela peut vous aider à trouver des candidats à TRUNCATE pour récupérer suffisamment d'espace de travail pour nettoyer ceux avec des informations supprimées.

Notez que supprimer beaucoup de lignes mais pas VACUUM assez fréquemment pour garder l'espace disque sous contrôle conduira souvent à une condition appelée bourrage d'index, ce qui VACUUM FULL ne aide pas du tout. Vous saurez que vous êtes là lorsque la requête que j'ai suggérée montre que la majeure partie de votre espace est occupée par des index plutôt que par des tables régulières. Vous aurez besoin de CLUSTER, qui a besoin d'autant d'espace disque libre que la table elle-même pour tout reconstruire, pour récupérer de ce problème.