Blog

Blog

Outil d'analyse des volumes pour postgreSQL

J'ai eu besoin d'un outil pour récupérer rapidement et facilement tous les volumes de données par table. j'ai donc bricolé un bout de perl qui a juste le mérite d'être efficace.

(Je laisse ensuite le soin à Excel et aux tableaux croisés dynamiques de me permettre de faire des rapport sur les volumes par schéma, ou par base.)
Voici donc cet outil perl :
#!/usr/bin/perl
use Getopt::Long;
use strict;
#-----------------------------------------------------------------------------

sub usage 
{
print <<EOUSAGE;
perl $0 --in <fichierIn>
--Help            : ce message
--in <fichier>    : Le chemin compet du fichier comportant les noms des bases à analyser

Voici la requête SQL permettant de générer le fichier d'entrée :
\\pset format unaligned
\\pset border 0
\\pset tuples_only
SELECT datname as Nom
FROM pg_database
WHERE datname <> 'postgres'
AND datname NOT LIKE 'template%'
ORDER BY pg_database_size(datname) DESC

EOUSAGE
exit;
}

#-----------------------------------------------------------------------------
#   Main
#-----------------------------------------------------------------------------
my $help=0;
my $in;

GetOptions ("in=s" => \$in,
            "Help" => \$help);
usage() if ($help);
usage() if (!defined($in));
usage() if ($in eq '');

open(lignes,"<$in");
my @ligne = <lignes>;
open(out,">analyse_bases.sql");

my $mabdd;

#Génération des ordres de formatage pour la sortie à l'exécution sur script SQL généré
print(out "\\pset format unaligned\n");
print(out "\\pset border 0\n");
print(out "\\pset tuples_only\n");
# On génère le fichier de sortie
print(out "\\! touch /pgsql/save/analyse_bases.txt\n");

use constant REQUETE_TAILLE => "SELECT table_catalog, table_schema, table_name, pg_relation_size(table_schema || '.' || table_name) As Taille_donnees, pg_total_relation_size(table_schema || '.' || table_name) As Taille_totale_octets, pg_size_pretty(pg_total_relation_size(table_schema || '.' || table_name)) As taille_totale FROM information_schema.tables ORDER BY Taille_totale_octets DESC;\n";

foreach $mabdd (@ligne)
{  
    chomp($mabdd);
    # Génération de l'ordre de connexion à la BDD
    print(out "\\c $mabdd\n");
    #On peut commencer à écrire dans le ficheir de sortie
    print(out "\\o | cat - >> /pgsql/save/analyse_bases.txt\n");
    #On lance la requeête
    print(out REQUETE_TAILLE);
    #On arrête d'écrire dans le fichier de sortie
    print(out "\\o\n");    
}
Pour l'usage, on commence par générer la liste des bases de l'instance et on la met dans un fichier texte. On appelle ensuite le script avec en argument ce fichier. Le script nous génère un sql qu'il faut ensuite jouer sur la base.
Il n'y a plus qu'à récupérer le fichier analyses.txt