Chapitre 24. Surveillance de l'utilisation de l'espace disque

Table des matières
24.1. Déterminer l'utilisation de l'espace disque
24.2. Échec sur disque plein

Ce chapitre traite de la manière d'effectuer une surveillance sur l'utilisation de l'espace disque par un système de bases de données PostgreSQL. Dans la version actuelle, l'administrateur de la base de données ne dispose pas de beaucoup de moyens de contrôles sur la manière dont les données sont stockées sur les disques. Ce chapitre est donc surtout informatif et peut vous donner une idée plus précise de la manière de gérer les disques en utilisant plutôt les outils fournis avec le système d'exploitation.

24.1. Déterminer l'utilisation de l'espace disque

Chaque table possède un fichier d'en-tête principal dans lequel la plupart des données sont stockées. Afin de stocker les données des grosses colonnes, un fichier TOAST est également associé à la table dont le nom est basé sur l'OID (en fait il s'agit de pg_class.relfilenode). Pour finir, on lui associe un index dans la table TOAST. Il peut y avoir par ailleurs d'autres index associés à la table de base.

Vous pouvez surveiller l'espace disque en utilisant trois méthodes : depuis psql en utilisant les résultats de la commande VACUUM, depuis psql en utilisant l'outil se trouvant dans contrib/dbsize, et depuis la ligne de commande en utilisant l'outil contenu dans contrib/oid2name. En utilisant psql sur une base de données sur laquelle ont été lancés VACUUM ou ANALYZE, vous pouvez lancer des requêtes vous permettant d'obtenir des informations sur la place occupée par n'importe quelle table :

SELECT relfilenode, relpages FROM pg_class WHERE relname = 'customer';

 relfilenode | relpages 
-------------+----------
       16806 |       60
(1 ligne)

Chaque page utilise en général 8 Ko de d'espace disque (ne pas oublier que relpage n'est mis à jour que par l'utilisation des commandes VACUUM et ANALYZE.)

Afin de connaître l'espace disque utilisé par les tables TOAST, lancez une requête similaire à la suivante en remplaçant le nombre du relfilenode de la table (défini par la requête ci-dessus) :

SELECT relname, relpages
    FROM pg_class
    WHERE relname = 'pg_toast_16806' OR relname = 'pg_toast_16806_index'
    ORDER BY relname;

       relname        | relpages 
----------------------+----------
 pg_toast_16806       |        0
 pg_toast_16806_index |        1

Vous pouvez afficher également la taille des index :

SELECT c2.relname, c2.relpages
    FROM pg_class c, pg_class c2, pg_index i
    WHERE c.relname = 'customer'
        AND c.oid = i.indrelid
        AND c2.oid = i.indexrelid
        ORDER BY c2.relname;

       relname        | relpages 
----------------------+----------
 customer_id_indexdex |       26

Vous pouvez trouver les tables les plus grosses en utilisant la requête suivante :

SELECT relname, relpages FROM pg_class ORDER BY relpages DESC;

       relname        | relpages 
----------------------+----------
 bigtable             |     3290
 customer             |     3144

contrib/dbsize crée dans votre base de données des fonctions permettant de trouver la taille des tables ou de la base de données à partir de psql sans avoir besoin d'exécuter VACUUM ou ANALYZE préalablement.

Vous pouvez aussi utiliser l'utilitaire contrib/oid2name afin d'afficher l'utilisation du disque. Lisez les exemples contenus dans le fichier README.oid2name dans ce même répertoire. Il inclut un script permettant d'afficher la quantité de disque utilisée par chaque base de données.