26. Surveiller l'utilisation des disques

26.1. Déterminer l'utilisation des disques
26.2. Panne pour disque saturé

Ce chapitre explique comment surveiller l'utilisation des disques faite par PostgreSQL™.

26.1. Déterminer l'utilisation des disques

Chaque table possède un fichier principal dans lequel la majorité des données sont stockées. Si la table contient des colonnes pouvant recevoir des valeurs étendues, il existe aussi un fichier TOAST associé à la table. Ce fichier permet de stocker les valeurs trop larges pour tenir dansle table principale (voir la Section 52.2, « TOAST »). Si la table TOAST existe, un index lui est associé. Des index peuvent également être associés à la table de base. Chaque table ou index est stocké dans un fichier distinct -- ou plusieurs si la taille du fichier dépasse 1 Go. Les conventions de nommage de ces fichiers sont décrites dans la Section 52.1, « Emplacement des fichiers de la base de données ».

L'espace disque peut être surveillé de trois façons différentes : depuis psql en utilisant les informations retournées par VACUUM, depuis psql avec les outils de contrib/dbsize et en ligne de commande avec les outils de contrib/oid2name.

Les fonctions SQL sont les plus faciles à utilise. Elles rapporte des informations concernant les tables, les tables avec index et stockage de valeurs étendues (TOAST), les bases de données et les tablespaces.

L'utilisation de psql sur une base de données récemment « nettoyée » (VACUUM) ou « analysée » (ANALYZE) permet de lancer des requêtes pour connaître l'occupation disque d'une table :

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

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

Chaque page utilise typiquement 8 Ko d'espace disque.

relpages n'est mis à jour que par les commandes VACUUM, ANALYZE et par quelques commandes de définition de données (DDL, Data Definition Language), telles que CREATE INDEX. La valeur de relfilenode est intéressante pour l'examen direct du fichier de table.

Pour connaître l'espace disque utilisé par les tables TOAST, on utilise 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

On peut aussi facilement afficher 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

Les tables et les index les plus volumineux sont repérés à l'aide de la requête suivante :

SELECT relname, relpages FROM pg_class ORDER BY relpages DESC;

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

L'utilitaire contrib/oid2name permet de connaître l'utilisation de l'espace disque. Des exemples d'utilisation sont repris dans le fichier README.oid2name situé dans le répertoire de l'utilitaire. On y trouve notamment un script permettant de connaître l'utilisation de l'espace disque par base de données.