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.

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. Si la table comprend des colonnes avec des valeurs potentiellement larges, il existe aussi un fichier TOAST associé à la table, qui est utilisé pour stocker les valeurs trop larges pour tenir confortablement dans la table principale (voir Section 49.2). Il y aura un index sur la table TOAST, si elle existe. Il pourrait aussi y avoir des index associés à la table de base. Chaque table et index sont stockés dans un fichier séparé — parfois plusieurs fichiers si ce fichier devait dépasser la taille d'1 Go. Les conventions de nommage de ces fichiers sont décrites dans Section 49.1.

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 et par quelques commandes DDL comme CREATE INDEX.) La valeur de relfilenode est d'un grand intérêt si vous voulez examiner le fichier de la table directement.

Afin de connaître l'espace disque utilisé par les tables TOAST, lancez une requête similaire à la suivante :

SELECT relname, relpages
    FROM pg_class,
         (SELECT reltoastrelid FROM pg_class
          WHERE relname = 'customer') ss
    WHERE oid = ss.reltoastrelid
       OR oid = (SELECT reltoastidxid FROM pg_class
                 WHERE oid = ss.reltoastrelid)
    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.