(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");    
}
Il n'y a plus qu'à récupérer le fichier analyses.txt
 
