{"id":260,"date":"2026-10-20T09:53:00","date_gmt":"2026-10-20T07:53:00","guid":{"rendered":"https:\/\/www.cisilino.com\/?p=260"},"modified":"2026-10-29T20:01:20","modified_gmt":"2026-10-29T19:01:20","slug":"script-espace-disque-base-de-donnees-mysql","status":"publish","type":"post","link":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/","title":{"rendered":"Quelle base de donn\u00e9es occupe l&rsquo;espace disque ? Un script pour MySQL et PostgreSQL"},"content":{"rendered":"<p>Cela arrive \u00e0 tout le monde t\u00f4t ou tard. L&rsquo;espace disque du serveur se remplit, l&rsquo;alarme se d\u00e9clenche et la question est toujours la m\u00eame. <strong>Quelle base de donn\u00e9es occupe tout cet espace ?<\/strong><\/p>\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espace-disque-bases-mysql-postgresql.webp\" alt=\"Espace disque : graphique en anneau divis\u00e9 en quatre secteurs de couleurs, avec trois barres de l\u00e9gende \u00e0 droite\" width=\"1200\" height=\"630\"\/><\/figure>\n<p>Je m&rsquo;y suis retrouv\u00e9 confront\u00e9 apr\u00e8s une optimisation. J&rsquo;avais lanc\u00e9 <code>OPTIMIZE TABLE<\/code> en esp\u00e9rant r\u00e9cup\u00e9rer de l&rsquo;espace, mais le syst\u00e8me de fichiers ne baissait pas comme pr\u00e9vu. Sans un \u00ab avant \u00bb \u00e0 comparer \u00e0 l&rsquo;\u00ab apr\u00e8s \u00bb, impossible de savoir si l&rsquo;optimisation avait fonctionn\u00e9. Impossible aussi de savoir quelle base \u00e9tait responsable, et si l&rsquo;espace disque manquant n&rsquo;\u00e9tait pas carr\u00e9ment ailleurs.<\/p>\n<p>Les outils dont je disposais ne r\u00e9pondaient qu&rsquo;\u00e0 la moiti\u00e9 du probl\u00e8me :<\/p>\n<ul class=\"wp-block-list\">\n<li><code>du<\/code> montre les fichiers sur le disque, mais ne dit pas \u00e0 quelle table ils appartiennent ;<\/li>\n<li><code>information_schema<\/code> (ou <code>pg_class<\/code> sur PostgreSQL) donne les tailles logiques, mais ne voit ni les binlogs, ni <code>ibdata1<\/code>, ni les undo logs, ni les WAL ;<\/li>\n<li>tous deux photographient un seul instant : la comparaison dans le temps reste un travail manuel, fait de copier-coller et d&rsquo;un tableur.<\/li>\n<\/ul>\n<p>Il me fallait quelque chose de simple : <strong>photographier l&rsquo;\u00e9tat de toutes les bases \u00e0 un moment donn\u00e9, refaire la photo plus tard et me dire ce qui a chang\u00e9<\/strong>, en classant les diff\u00e9rences de la plus grande \u00e0 la plus petite. Le coupable saute ainsi aux yeux.<\/p>\n<p>Il en est sorti un unique script Bash, sans d\u00e9pendances au-del\u00e0 du client de base de donn\u00e9es et des outils standard de Linux (<code>awk<\/code>, <code>du<\/code>, <code>df<\/code>). Il fonctionne avec <strong>MySQL\/MariaDB<\/strong> et avec <strong>PostgreSQL<\/strong>. Je le partage ici dans l&rsquo;espoir d&rsquo;\u00e9pargner \u00e0 quelqu&rsquo;un le m\u00eame apr\u00e8s-midi de frustration.<\/p>\n<h2 class=\"wp-block-heading\">Ce qu&rsquo;il fait<\/h2>\n<p>Le script a quatre commandes :<\/p>\n<ul class=\"wp-block-list\">\n<li><code>snapshot<\/code> enregistre l&rsquo;\u00e9tat actuel (bases, tables, fichiers du r\u00e9pertoire de donn\u00e9es, espace du syst\u00e8me de fichiers) ;<\/li>\n<li><code>compare<\/code> compare deux instantan\u00e9s et montre les diff\u00e9rences, les plus grandes en t\u00eate ;<\/li>\n<li><code>report<\/code> montre les bases et tables les plus grosses d&rsquo;un seul instantan\u00e9 ;<\/li>\n<li><code>list<\/code> liste les instantan\u00e9s enregistr\u00e9s.<\/li>\n<\/ul>\n<p>La comparaison est divis\u00e9e en quatre sections, pour ne laisser aucun angle mort :<\/p>\n<ul class=\"wp-block-list\">\n<li><strong>taille de chaque base<\/strong> (donn\u00e9es + index) ;<\/li>\n<li><strong>espace libre ou r\u00e9cup\u00e9rable<\/strong> (<code>data_free<\/code> sur MySQL, estimation des tuples morts sur PostgreSQL) ;<\/li>\n<li><strong>taille de chaque table<\/strong> ;<\/li>\n<li><strong>fichiers r\u00e9els du r\u00e9pertoire de donn\u00e9es<\/strong> : dossiers des bases, <code>ibdata1<\/code>, binlogs, undo, <code>pg_wal<\/code>.<\/li>\n<\/ul>\n<p>La derni\u00e8re section est souvent celle qui r\u00e9sout le myst\u00e8re. Bien des fois, l&rsquo;espace \u00ab anormal \u00bb n&rsquo;appartient \u00e0 aucune base, mais aux journaux binaires ou aux fichiers partag\u00e9s d&rsquo;InnoDB.<\/p>\n<h2 class=\"wp-block-heading\">Pr\u00e9requis<\/h2>\n<ul class=\"wp-block-list\">\n<li>Linux avec Bash 4 ou sup\u00e9rieur, <code>awk<\/code>, <code>du<\/code>, <code>df<\/code> (le tout en standard) ;<\/li>\n<li>le client <code>mysql<\/code> ou <code>psql<\/code>, avec un utilisateur capable de lire les m\u00e9tadonn\u00e9es de toutes les bases ;<\/li>\n<li>les droits root (ou ceux de l&rsquo;utilisateur <code>mysql<\/code>\/<code>postgres<\/code>) si vous voulez aussi mesurer les fichiers sur disque ; sans eux, cette section est ignor\u00e9e avec un avertissement.<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\">Installation<\/h2>\n<p>Enregistrez le script (vous le trouverez \u00e0 la fin de l&rsquo;article) dans un fichier et rendez-le ex\u00e9cutable :<\/p>\n<pre class=\"wp-block-code\"><code>nano db_space_compare.sh\nchmod +x db_space_compare.sh<\/code><\/pre>\n<h3 class=\"wp-block-heading\">Identifiants<\/h3>\n<p>Pour MySQL\/MariaDB, le plus propre est un fichier <code>~\/.my.cnf<\/code> contenant les identifiants, afin qu&rsquo;ils n&rsquo;apparaissent pas dans l&rsquo;historique des commandes :<\/p>\n<pre class=\"wp-block-code\"><code>&#91;client]\nuser=root\npassword=LA_TUA_PASSWORD<\/code><\/pre>\n<p>Vous pouvez aussi passer les options via une variable d&rsquo;environnement :<\/p>\n<pre class=\"wp-block-code\"><code>export MYSQL_OPTS=\"-u root -pPASSWORD -h 127.0.0.1\"<\/code><\/pre>\n<p>Pour PostgreSQL, <code>~\/.pgpass<\/code>, les variables <code>PG*<\/code> ou <code>PG_OPTS<\/code> fonctionnent :<\/p>\n<pre class=\"wp-block-code\"><code>export PG_OPTS=\"-U postgres -h localhost\"<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Comment l&rsquo;utiliser<\/h2>\n<p>Le d\u00e9roulement type est <em>avant, optimisation, apr\u00e8s, comparaison<\/em> :<\/p>\n<pre class=\"wp-block-code\"><code># 1. fotografia prima dell'ottimizzazione\nsudo .\/db_space_compare.sh snapshot prima\n\n# 2. esegui l'ottimizzazione (OPTIMIZE TABLE, VACUUM FULL, ...)\n\n# 3. fotografia dopo\nsudo .\/db_space_compare.sh snapshot dopo\n\n# 4. confronto\nsudo .\/db_space_compare.sh compare prima dopo<\/code><\/pre>\n<p>Pour PostgreSQL, il suffit d&rsquo;ajouter l&rsquo;option <code>-e postgres<\/code> :<\/p>\n<pre class=\"wp-block-code\"><code>sudo .\/db_space_compare.sh -e postgres snapshot prima\nsudo .\/db_space_compare.sh -e postgres snapshot dopo\nsudo .\/db_space_compare.sh -e postgres compare prima dopo<\/code><\/pre>\n<p>Les options disponibles sont :<\/p>\n<ul class=\"wp-block-list\">\n<li><code>-e mysql|postgres<\/code> choisit le moteur (par d\u00e9faut : <code>mysql<\/code>) ;<\/li>\n<li><code>-d DIR<\/code> change le dossier o\u00f9 sont enregistr\u00e9s les instantan\u00e9s (par d\u00e9faut : <code>.\/db_snapshots<\/code>) ;<\/li>\n<li><code>-n N<\/code> fixe le nombre de lignes affich\u00e9es par section (par d\u00e9faut : 20).<\/li>\n<\/ul>\n<p>Si vous n&rsquo;indiquez pas d&rsquo;\u00e9tiquette, l&rsquo;instantan\u00e9 prend pour nom la date et l&rsquo;heure. C&rsquo;est pratique pour surveiller la croissance dans le temps.<\/p>\n<h2 class=\"wp-block-heading\">Exemple de sortie<\/h2>\n<p>Voici une comparaison sur des donn\u00e9es de test, construites expr\u00e8s pour montrer un cas typique. La base <code>shop<\/code> diminue apr\u00e8s l&rsquo;optimisation, mais la base <code>log<\/code> grossit et les binlogs doublent.<\/p>\n<pre class=\"wp-block-code\"><code>Confronto 'prima' (2026-10-11 20:00:00)  -&gt;  'dopo' (2026-10-11 22:00:00)\nFilesystem \/var: usato 46.6 GiB -&gt; 48.4 GiB (+1.9 GiB)\n\n=== Database - dimensione totale ===\n  NOME                                                      PRIMA         DOPO    DIFFERENZA  NOTE\n  log                                                    21.4 GiB     27.5 GiB      +6.1 GiB  +28.3%\n  shop                                                    5.6 GiB      3.6 GiB      -2.0 GiB  -35.0%\n\n=== Tabelle - dimensione (dati + indici) ===\n  NOME                                                      PRIMA         DOPO    DIFFERENZA  NOTE\n  log.eventi                                             21.4 GiB     27.5 GiB      +6.1 GiB  +28.3%\n  shop.ordini                                             5.6 GiB      3.6 GiB      -2.0 GiB  -35.0%\n  log.nuova                                                   0 B      1.0 KiB      +1.0 KiB  NUOVO\n\n=== File nella data directory (cartelle DB, ibdata1, binlog, undo, WAL) ===\n  NOME                                                      PRIMA         DOPO    DIFFERENZA  NOTE\n  log                                                    21.4 GiB     27.5 GiB      +6.1 GiB  +28.3%\n  mysql-bin.*                                             3.7 GiB      8.4 GiB      +4.7 GiB  +125.0%\n  shop                                                    5.7 GiB      3.6 GiB      -2.0 GiB  -36.1%\n  ibdata1                                                11.2 GiB     11.2 GiB           0 B<\/code><\/pre>\n<p>Ici le coupable est \u00e9vident. La table <code>log.eventi<\/code> a grossi de plus de 6 GiB. Les fichiers <code>mysql-bin.*<\/code> sont pass\u00e9s de 3,7 \u00e0 8,4 GiB. L&rsquo;optimisation sur <code>shop<\/code> a fonctionn\u00e9, mais le gain d&rsquo;espace disque a \u00e9t\u00e9 englouti par le reste.<\/p>\n<h2 class=\"wp-block-heading\">Comment lire les r\u00e9sultats<\/h2>\n<ul class=\"wp-block-list\">\n<li>En haut de chaque section se trouvent les \u00e9l\u00e9ments qui ont le plus chang\u00e9. Une base ou une table qui <strong>ne diminue pas<\/strong> (voire grossit) apr\u00e8s l&rsquo;optimisation est le premier suspect.<\/li>\n<li>Si les tables diminuent mais pas le syst\u00e8me de fichiers, l&rsquo;espace disque est ailleurs. Regardez la section sur les fichiers du r\u00e9pertoire de donn\u00e9es (binlogs, <code>ibdata1<\/code>, undo, <code>pg_wal<\/code>).<\/li>\n<li><strong>MySQL\/MariaDB :<\/strong> <code>ibdata1<\/code> ne r\u00e9tr\u00e9cit jamais, pas m\u00eame avec <code>OPTIMIZE TABLE<\/code>. Avec <code>innodb_file_per_table=OFF<\/code>, la valeur de <code>data_free<\/code> est partag\u00e9e et peu indicative.<\/li>\n<li><strong>PostgreSQL :<\/strong> un simple <code>VACUUM<\/code> ne rend pas d&rsquo;espace au syst\u00e8me d&rsquo;exploitation, il faut <code>VACUUM FULL<\/code> (ou <code>pg_repack<\/code>). L&rsquo;espace \u00ab r\u00e9cup\u00e9rable \u00bb affich\u00e9 est une estimation fond\u00e9e sur les tuples morts.<\/li>\n<\/ul>\n<p>Pour PostgreSQL, la <a href=\"https:\/\/www.postgresql.org\/docs\/current\/diskusage.html\" target=\"_blank\" rel=\"noopener\">documentation officielle sur l&rsquo;utilisation du disque<\/a> explique comment mesurer l&rsquo;espace occup\u00e9.<\/p>\n<h2 class=\"wp-block-heading\">Surveiller l&rsquo;espace disque dans le temps<\/h2>\n<p>Si le probl\u00e8me n&rsquo;est pas li\u00e9 \u00e0 une seule optimisation mais \u00e0 une croissance progressive, mieux vaut automatiser les instantan\u00e9s avec cron, un par heure, puis comparer deux moments quelconques :<\/p>\n<pre class=\"wp-block-code\"><code># crontab -e (come root)\n0 * * * * \/usr\/local\/bin\/db_space_compare.sh -d \/var\/lib\/db_snapshots snapshot &gt;\/dev\/null 2&gt;&amp;1<\/code><\/pre>\n<p>Sans \u00e9tiquette, chaque instantan\u00e9 prend pour nom la date et l&rsquo;heure (par exemple <code>20261011-140000<\/code>). Avec <code>list<\/code> vous voyez ceux qui existent et avec <code>compare<\/code> vous en comparez deux. En quelques jours, on voit quelle base grossit de fa\u00e7on anormale.<\/p>\n<pre class=\"wp-block-code\"><code>.\/db_space_compare.sh -d \/var\/lib\/db_snapshots list\n.\/db_space_compare.sh -d \/var\/lib\/db_snapshots compare 20261011-140000 20261012-140000<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Le script complet<\/h2>\n<p>Voici le code. Copiez-le dans un fichier nomm\u00e9 <code>db_space_compare.sh<\/code>, rendez-le ex\u00e9cutable et vous \u00eates pr\u00eat.<\/p>\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n#\n# db_space_compare.sh\n# Fotografa l'occupazione di spazio di tutti i database (MySQL\/MariaDB o\n# PostgreSQL) e confronta due fotografie (es. prima\/dopo l'ottimizzazione)\n# per capire quale database, tabella o file occupa spazio in modo anomalo.\n#\n# Uso:\n#   db_space_compare.sh &#91;opzioni] snapshot &#91;etichetta]   (default: data-ora)\n#   db_space_compare.sh &#91;opzioni] compare  &lt;prima&gt; &lt;dopo&gt;\n#   db_space_compare.sh &#91;opzioni] report   &lt;etichetta&gt;\n#   db_space_compare.sh &#91;opzioni] list\n#\n# Opzioni:\n#   -e mysql|postgres   motore del database (default: mysql)\n#   -d DIR              cartella delle fotografie (default: .\/db_snapshots)\n#   -n N                righe mostrate per sezione (default: 20)\n#\n# Credenziali:\n#   MySQL\/MariaDB: ~\/.my.cnf oppure MYSQL_OPTS=\"-u root -pPASSWORD -h 127.0.0.1\"\n#   PostgreSQL:    ~\/.pgpass, variabili PG* oppure PG_OPTS=\"-U postgres -h localhost\"\n#                  (non mettere -d in PG_OPTS: lo script si collega a ogni database)\n#\n# Per misurare anche i file su disco (cartelle dei DB, ibdata1, binlog, undo,\n# pg_wal) va eseguito come root o come utente mysql\/postgres; altrimenti\n# quella parte viene saltata con un avviso.\n#\n# Esempio:\n#   sudo .\/db_space_compare.sh snapshot prima\n#   ... ottimizzazione (OPTIMIZE TABLE \/ VACUUM FULL \/ ...) ...\n#   sudo .\/db_space_compare.sh snapshot dopo\n#   sudo .\/db_space_compare.sh compare prima dopo\n\nset -euo pipefail\nexport LC_ALL=C\n\nENGINE=mysql\nOUTDIR=.\/db_snapshots\nTOPN=20\nSNAP_IN_PROGRESS=\"\"\n\ndie()  { echo \"ERRORE: $*\" &gt;&amp;2; exit 1; }\nwarn() { echo \"ATTENZIONE: $*\" &gt;&amp;2; }\nusage() { sed -n '2,\/^$\/{s\/^# \\{0,1\\}\/\/;p}' \"$0\"; exit \"${1:-0}\"; }\n\ncleanup() {\n  if &#91;&#91; -n $SNAP_IN_PROGRESS ]]; then\n    rm -rf -- \"$SNAP_IN_PROGRESS\"\n    echo \"Fotografia incompleta rimossa: $SNAP_IN_PROGRESS\" &gt;&amp;2\n  fi\n}\ntrap cleanup EXIT\n\nwhile getopts \":e:d:n:h\" opt; do\n  case $opt in\n    e) ENGINE=$OPTARG ;;\n    d) OUTDIR=$OPTARG ;;\n    n) TOPN=$OPTARG ;;\n    h) usage 0 ;;\n    *) usage 1 ;;\n  esac\ndone\nshift $((OPTIND - 1))\n\n&#91;&#91; $ENGINE == mysql || $ENGINE == postgres ]] || die \"motore non valido: '$ENGINE' (usa mysql o postgres)\"\n&#91;&#91; $TOPN =~ ^&#91;0-9]+$ ]] || die \"-n deve essere un numero\"\n\nread -r -a MYSQL_ARGS &lt;&lt;&lt; \"${MYSQL_OPTS:-}\"\nread -r -a PG_ARGS    &lt;&lt;&lt; \"${PG_OPTS:-}\"\n\nmy() { mysql \"${MYSQL_ARGS&#91;@]+\"${MYSQL_ARGS&#91;@]}\"}\" --batch --skip-column-names \"$@\"; }\npg() { psql  \"${PG_ARGS&#91;@]+\"${PG_ARGS&#91;@]}\"}\" -X -q -A -t -F $'\\t' -v ON_ERROR_STOP=1 \"$@\"; }\n\n# Funzioni awk comuni: formattazione in KiB\/MiB\/GiB, chiave e valore di riga.\n#   nk = numero di colonne che formano il nome (1 = database, 2 = db.tabella)\n#   vc = colonne da sommare per il valore (es. \"4,5\" = dati + indici)\nAWK_LIB='\nfunction h(b,   a, i, u) {\n  split(\"B KiB MiB GiB TiB PiB\", u, \" \")\n  a = (b &lt; 0) ? -b : b; i = 1\n  while (a &gt;= 1024 &amp;&amp; i &lt; 6) { a \/= 1024; i++ }\n  if (i == 1) return sprintf(\"%s%d B\", (b &lt; 0 ? \"-\" : \"\"), a)\n  return sprintf(\"%s%.1f %s\", (b &lt; 0 ? \"-\" : \"\"), a, u&#91;i])\n}\nfunction hs(b) { return (b &gt; 0 ? \"+\" : \"\") h(b) }\nfunction key(   k, i) { k = $1; for (i = 2; i &lt;= nk; i++) k = k \".\" $i; return k }\nfunction val(   n, c, i, s) { n = split(vc, c, \",\"); s = 0; for (i = 1; i &lt;= n; i++) s += $(c&#91;i]); return s }\n'\n\nmeta_get() { awk -F= -v k=\"$2\" '$1 == k { sub(\/^&#91;^=]*=\/, \"\"); print; exit }' \"$1\/meta.txt\"; }\n\n# ---------------------------------------------------------------- raccolta dati\n\n# Occupazione reale su disco delle voci di primo livello della data directory:\n# cartelle dei database, ibdata1, binlog, undo, redo log, pg_wal, base, ...\n# I file numerati (mysql-bin.000123, relay-log.000045, ...) sono sommati in una voce.\ncollect_disk() {\n  local d=$1 out=$2\n  : &gt; \"$out\"\n  if &#91;&#91; -z $d || ! -r $d || ! -x $d ]]; then\n    warn \"data directory '${d:-?}' non leggibile: salto i file su disco (esegui come root per includerli)\"\n    return 0\n  fi\n  { du -sb -- \"$d\"\/* 2&gt;\/dev\/null || true; } |\n    awk -F'\\t' -v p=\"$d\/\" '\n      { n = $2\n        if (index(n, p) == 1) n = substr(n, length(p) + 1)\n        if (n ~ \/\\.&#91;0-9]&#91;0-9]&#91;0-9]&#91;0-9]&#91;0-9]&#91;0-9]$\/) sub(\/&#91;0-9]+$\/, \"*\", n)\n        s&#91;n] += $1 }\n      END { for (n in s) printf \"%s\\t%.0f\\n\", n, s&#91;n] }' &gt; \"$out\"\n}\n\nwrite_meta() {\n  local dir=$1 datadir=$2 version=$3\n  {\n    echo \"timestamp=$(date '+%Y-%m-%d %H:%M:%S')\"\n    echo \"engine=$ENGINE\"\n    echo \"host=$(hostname)\"\n    echo \"version=$version\"\n    echo \"datadir=$datadir\"\n    if &#91;&#91; -n $datadir &amp;&amp; -e $datadir ]]; then\n      { df -P -B1 -- \"$datadir\" 2&gt;\/dev\/null || true; } |\n        awk 'NR == 2 { print \"fs_mount=\" $6; print \"fs_used=\" $3; print \"fs_avail=\" $4 }'\n    fi\n  } &gt; \"$dir\/meta.txt\"\n}\n\n# File prodotti da ogni fotografia (separati da TAB):\n#   tables.tsv     db, tabella, engine, dati, indici, libero\/recuperabile, righe\n#   databases.tsv  db, dati, indici, libero\/recuperabile, totale\n#   disk.tsv       voce della data directory, byte su disco\n#   meta.txt       data, host, versione, filesystem\n\nsnapshot_mysql() {\n  local dir=$1 pre=\"\" datadir version\n  command -v mysql &gt;\/dev\/null 2&gt;&amp;1 || die \"client 'mysql' non trovato\"\n  my -e \"SELECT 1\" &gt;\/dev\/null || die \"connessione a MySQL\/MariaDB fallita (controlla ~\/.my.cnf o MYSQL_OPTS)\"\n\n  # MySQL 8 tiene in cache le statistiche di information_schema fino a 24 ore:\n  # senza questo, i valori \"dopo\" l'ottimizzazione potrebbero essere quelli vecchi.\n  if &#91;&#91; -n $(my -e \"SHOW VARIABLES LIKE 'information_schema_stats_expiry'\") ]]; then\n    pre=\"SET SESSION information_schema_stats_expiry = 0;\"\n  fi\n\n  my -e \"$pre\n    SELECT table_schema, table_name, IFNULL(engine, '-'),\n           IFNULL(data_length, 0), IFNULL(index_length, 0), IFNULL(data_free, 0), IFNULL(table_rows, 0)\n      FROM information_schema.TABLES\n     WHERE table_type IN ('BASE TABLE', 'SYSTEM VERSIONED')\n       AND table_schema NOT IN ('information_schema', 'performance_schema', 'sys')\" &gt; \"$dir\/tables.tsv\"\n\n  my -e \"$pre\n    SELECT s.schema_name,\n           IFNULL(SUM(t.data_length), 0), IFNULL(SUM(t.index_length), 0), IFNULL(SUM(t.data_free), 0),\n           IFNULL(SUM(t.data_length), 0) + IFNULL(SUM(t.index_length), 0)\n      FROM information_schema.SCHEMATA s\n      LEFT JOIN information_schema.TABLES t\n             ON t.table_schema = s.schema_name\n            AND t.table_type IN ('BASE TABLE', 'SYSTEM VERSIONED')\n     WHERE s.schema_name NOT IN ('information_schema', 'performance_schema', 'sys')\n     GROUP BY s.schema_name\" &gt; \"$dir\/databases.tsv\"\n\n  datadir=$(my -e \"SELECT @@datadir\"); datadir=${datadir%\/}\n  version=$(my -e \"SELECT VERSION()\")\n  collect_disk \"$datadir\" \"$dir\/disk.tsv\"\n  write_meta \"$dir\" \"$datadir\" \"$version\"\n}\n\nsnapshot_postgres() {\n  local dir=$1 maindb=${PGDATABASE:-postgres} datadir version db\n  command -v psql &gt;\/dev\/null 2&gt;&amp;1 || die \"client 'psql' non trovato\"\n  pg -d \"$maindb\" -c \"SELECT 1\" &gt;\/dev\/null || die \"connessione a PostgreSQL fallita (controlla PG_OPTS, PGUSER, ~\/.pgpass)\"\n\n  pg -d \"$maindb\" -c \"SELECT datname FROM pg_database WHERE datallowconn AND NOT datistemplate ORDER BY 1\" &gt; \"$dir\/.dblist\"\n\n  # Per ogni database: dimensione di ogni tabella (catalogo incluso, es. pg_largeobject)\n  # e stima dello spazio occupato da tuple morte (bloat recuperabile con VACUUM FULL).\n  : &gt; \"$dir\/tables.tsv\"\n  while IFS= read -r db; do\n    &#91;&#91; -n $db ]] || continue\n    pg -d \"$db\" -c \"\n      SELECT current_database(), s.schemaname || '.' || s.relname, 'table',\n             pg_table_size(s.relid), pg_indexes_size(s.relid),\n             CASE WHEN s.n_live_tup + s.n_dead_tup &gt; 0\n                  THEN (pg_table_size(s.relid)::numeric * s.n_dead_tup \/ (s.n_live_tup + s.n_dead_tup))::bigint\n                  ELSE 0 END,\n             s.n_live_tup\n        FROM pg_stat_all_tables s\n       WHERE s.schemaname &lt;&gt; 'information_schema'\n         AND s.schemaname NOT LIKE 'pg_toast%'\" &lt; \/dev\/null &gt;&gt; \"$dir\/tables.tsv\" \\\n      || warn \"impossibile leggere le tabelle del database '$db'\"\n  done &lt; \"$dir\/.dblist\"\n\n  pg -d \"$maindb\" -c \"SELECT datname, pg_database_size(oid) FROM pg_database WHERE datallowconn AND NOT datistemplate\" &gt; \"$dir\/.dbsize\"\n  awk -F'\\t' '\n    FILENAME == ARGV&#91;1] { d&#91;$1] += $4; i&#91;$1] += $5; f&#91;$1] += $6; next }\n    { printf \"%s\\t%.0f\\t%.0f\\t%.0f\\t%s\\n\", $1, d&#91;$1], i&#91;$1], f&#91;$1], $2 }' \\\n    \"$dir\/tables.tsv\" \"$dir\/.dbsize\" &gt; \"$dir\/databases.tsv\"\n\n  datadir=$(pg -d \"$maindb\" -c \"SHOW data_directory\" 2&gt;\/dev\/null || true)\n  version=$(pg -d \"$maindb\" -c \"SHOW server_version\")\n  collect_disk \"$datadir\" \"$dir\/disk.tsv\"\n\n  # Dettaglio di base\/&lt;oid&gt; con il nome del database al posto dell'oid\n  if &#91;&#91; -n $datadir &amp;&amp; -r $datadir\/base &amp;&amp; -x $datadir\/base ]]; then\n    pg -d \"$maindb\" -c \"SELECT oid, datname FROM pg_database\" &gt; \"$dir\/.oidmap\"\n    { du -sb -- \"$datadir\"\/base\/* 2&gt;\/dev\/null || true; } |\n      awk -F'\\t' '\n        FILENAME == ARGV&#91;1] { name&#91;$1] = $2; next }\n        { o = $2; sub(\/.*\\\/\/, \"\", o); printf \"base\/%s\\t%s\\n\", ((o in name) ? name&#91;o] : o), $1 }' \\\n        \"$dir\/.oidmap\" - &gt;&gt; \"$dir\/disk.tsv\"\n  fi\n  write_meta \"$dir\" \"$datadir\" \"$version\"\n}\n\n# --------------------------------------------------------------- presentazione\n\nprint_fs() {\n  local d=$1 used avail mount\n  used=$(meta_get \"$d\" fs_used); avail=$(meta_get \"$d\" fs_avail); mount=$(meta_get \"$d\" fs_mount)\n  &#91;&#91; -n $used ]] || return 0\n  awk -v u=\"$used\" -v a=\"$avail\" -v m=\"$mount\" \"$AWK_LIB\"'\n    BEGIN { printf \"Filesystem %s: usato %s, libero %s\\n\", m, h(u), h(a) }'\n}\n\ntop_section() {\n  local f=$1 nk=$2 vc=$3 title=$4\n  echo\n  echo \"=== $title ===\"\n  if &#91;&#91; ! -s $f ]]; then echo \"  (nessun dato)\"; return 0; fi\n  awk -F'\\t' -v nk=\"$nk\" -v vc=\"$vc\" \"$AWK_LIB\"'\n    { v = val(); printf \"%.0f\\t%s\\t%s\\n\", v, key(), h(v) }' \"$f\" |\n    sort -t $'\\t' -k1,1nr -k2,2 |\n    awk -F'\\t' -v top=\"$TOPN\" 'NR &lt;= top &amp;&amp; $1 &gt; 0 { printf \"  %-60s %12s\\n\", $2, $3 }'\n}\n\ncompare_section() {\n  local fa=$1 fb=$2 nk=$3 vc=$4 title=$5\n  &#91;&#91; -f $fa ]] || fa=\/dev\/null\n  &#91;&#91; -f $fb ]] || fb=\/dev\/null\n  echo\n  echo \"=== $title ===\"\n  if &#91;&#91; ! -s $fa &amp;&amp; ! -s $fb ]]; then echo \"  (nessun dato)\"; return 0; fi\n  printf '  %-50s %12s %12s %13s  %s\\n' \"NOME\" \"PRIMA\" \"DOPO\" \"DIFFERENZA\" \"NOTE\"\n  awk -F'\\t' -v nk=\"$nk\" -v vc=\"$vc\" \"$AWK_LIB\"'\n    FILENAME == ARGV&#91;1] { k = key(); A&#91;k] = val(); S&#91;k] = 1; next }\n                        { k = key(); B&#91;k] = val(); S&#91;k] = 1 }\n    END {\n      for (k in S) {\n        inA = (k in A); inB = (k in B)\n        a = inA ? A&#91;k] : 0; b = inB ? B&#91;k] : 0; d = b - a\n        if (!inA)                 note = \"NUOVO\"\n        else if (!inB)            note = \"RIMOSSO\"\n        else if (a &gt; 0 &amp;&amp; d != 0) note = sprintf(\"%+.1f%%\", 100 * d \/ a)\n        else                      note = \"\"\n        printf \"%.0f\\t%s\\t%s\\t%s\\t%s\\t%s\\n\", (d &lt; 0 ? -d : d), k, h(a), h(b), hs(d), note\n      }\n    }' \"$fa\" \"$fb\" |\n    sort -t $'\\t' -k1,1nr -k2,2 |\n    awk -F'\\t' -v top=\"$TOPN\" 'NR &lt;= top { printf \"  %-50s %12s %12s %13s  %s\\n\", $2, $3, $4, $5, $6 }'\n}\n\n# -------------------------------------------------------------------- comandi\n\ncmd_snapshot() {\n  local label=${1:-$(date '+%Y%m%d-%H%M%S')}\n  &#91;&#91; $label =~ ^&#91;A-Za-z0-9]&#91;A-Za-z0-9._-]*$ ]] || die \"etichetta non valida: usa solo lettere, numeri, . _ -\"\n  local dir=$OUTDIR\/$label\n  &#91;&#91; ! -e $dir ]] || die \"la fotografia '$label' esiste gi\u00e0 ($dir)\"\n  mkdir -p -- \"$dir\"\n  SNAP_IN_PROGRESS=$dir\n  echo \"Fotografia '$label' ($ENGINE) in corso...\"\n  \"snapshot_$ENGINE\" \"$dir\"\n  rm -f -- \"$dir\/.dblist\" \"$dir\/.dbsize\" \"$dir\/.oidmap\"\n  SNAP_IN_PROGRESS=\"\"\n  echo \"Salvata in $dir ($(wc -l &lt; \"$dir\/tables.tsv\") tabelle)\"\n  print_fs \"$dir\"\n  top_section \"$dir\/databases.tsv\" 1 5 \"Database pi\u00f9 grandi\"\n}\n\ncmd_report() {\n  local label=${1:-}\n  &#91;&#91; -n $label ]] || die \"uso: report &lt;etichetta&gt;\"\n  local d=$OUTDIR\/$label\n  &#91;&#91; -f $d\/meta.txt ]] || die \"fotografia '$label' non trovata in $OUTDIR\"\n  echo \"Fotografia '$label' del $(meta_get \"$d\" timestamp) - $(meta_get \"$d\" engine) $(meta_get \"$d\" version) su $(meta_get \"$d\" host)\"\n  print_fs \"$d\"\n  top_section \"$d\/databases.tsv\" 1 5   \"Database pi\u00f9 grandi (dati + indici)\"\n  top_section \"$d\/tables.tsv\"    2 4,5 \"Tabelle pi\u00f9 grandi (dati + indici)\"\n  top_section \"$d\/tables.tsv\"    2 6   \"Tabelle con pi\u00f9 spazio recuperabile (data_free \/ tuple morte stimate)\"\n  top_section \"$d\/disk.tsv\"      1 2   \"Voci pi\u00f9 grandi nella data directory\"\n}\n\ncmd_compare() {\n  local a=${1:-} b=${2:-}\n  &#91;&#91; -n $a &amp;&amp; -n $b ]] || die \"uso: compare &lt;etichetta_prima&gt; &lt;etichetta_dopo&gt;\"\n  &#91;&#91; $a != \"$b\" ]] || die \"le due etichette sono uguali\"\n  local da=$OUTDIR\/$a db=$OUTDIR\/$b\n  &#91;&#91; -f $da\/meta.txt ]] || die \"fotografia '$a' non trovata in $OUTDIR\"\n  &#91;&#91; -f $db\/meta.txt ]] || die \"fotografia '$b' non trovata in $OUTDIR\"\n  &#91;&#91; $(meta_get \"$da\" engine) == \"$(meta_get \"$db\" engine)\" ]] || warn \"le due fotografie sono di motori diversi\"\n\n  echo \"Confronto '$a' ($(meta_get \"$da\" timestamp))  -&gt;  '$b' ($(meta_get \"$db\" timestamp))\"\n  local ua ub m\n  ua=$(meta_get \"$da\" fs_used); ub=$(meta_get \"$db\" fs_used); m=$(meta_get \"$db\" fs_mount)\n  if &#91;&#91; -n $ua &amp;&amp; -n $ub ]]; then\n    awk -v a=\"$ua\" -v b=\"$ub\" -v m=\"$m\" \"$AWK_LIB\"'\n      BEGIN { printf \"Filesystem %s: usato %s -&gt; %s (%s)\\n\", m, h(a), h(b), hs(b - a) }'\n  fi\n\n  compare_section \"$da\/databases.tsv\" \"$db\/databases.tsv\" 1 5   \"Database - dimensione totale\"\n  compare_section \"$da\/databases.tsv\" \"$db\/databases.tsv\" 1 4   \"Database - spazio libero\/recuperabile\"\n  compare_section \"$da\/tables.tsv\"    \"$db\/tables.tsv\"    2 4,5 \"Tabelle - dimensione (dati + indici)\"\n  compare_section \"$da\/disk.tsv\"      \"$db\/disk.tsv\"      1 2   \"File nella data directory (cartelle DB, ibdata1, binlog, undo, WAL)\"\n\n  cat &lt;&lt;'EOF'\n\nCome leggere il risultato:\n  - In cima a ogni sezione ci sono le voci cambiate di pi\u00f9: un database o una\n    tabella che dopo l'ottimizzazione non cala, o addirittura cresce, \u00e8 il\n    primo sospetto.\n  - Se le tabelle calano ma il filesystem no, lo spazio sta altrove: guarda la\n    sezione \"File nella data directory\" (binlog, ibdata1, undo, pg_wal).\n  - MySQL\/MariaDB: ibdata1 non si restringe mai, nemmeno con OPTIMIZE; con\n    innodb_file_per_table=OFF il data_free \u00e8 condiviso e poco indicativo.\n  - PostgreSQL: VACUUM semplice non restituisce spazio al disco, serve\n    VACUUM FULL (o pg_repack); lo spazio \"recuperabile\" \u00e8 una stima.\nEOF\n}\n\ncmd_list() {\n  if &#91;&#91; ! -d $OUTDIR ]]; then echo \"Nessuna fotografia in $OUTDIR\"; return 0; fi\n  local d found=0\n  for d in \"$OUTDIR\"\/*\/; do\n    &#91;&#91; -f $d\/meta.txt ]] || continue\n    found=1\n    printf '%-24s %s  %-8s  %s\\n' \"$(basename \"$d\")\" \"$(meta_get \"$d\" timestamp)\" \\\n      \"$(meta_get \"$d\" engine)\" \"$(meta_get \"$d\" host)\"\n  done\n  &#91;&#91; $found -eq 1 ]] || echo \"Nessuna fotografia in $OUTDIR\"\n}\n\ncmd=${1:-}\nshift || true\ncase $cmd in\n  snapshot) cmd_snapshot \"$@\" ;;\n  compare)  cmd_compare \"$@\" ;;\n  report)   cmd_report \"$@\" ;;\n  list)     cmd_list ;;\n  \"\"|help)  usage 0 ;;\n  *)        die \"comando sconosciuto: '$cmd' (usa snapshot, compare, report, list)\" ;;\nesac<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Notes finales<\/h2>\n<ul class=\"wp-block-list\">\n<li>Le script est en <strong>lecture seule<\/strong> sur les bases : il n&rsquo;ex\u00e9cute que <code>SELECT<\/code> sur les m\u00e9tadonn\u00e9es. Il n&rsquo;\u00e9crit que dans le dossier des instantan\u00e9s.<\/li>\n<li>Sur MySQL 8, il d\u00e9finit <code>information_schema_stats_expiry = 0<\/code> dans la session. Sinon, les statistiques en cache (jusqu&rsquo;\u00e0 24 heures) pourraient afficher d&rsquo;\u00ab anciennes \u00bb valeurs m\u00eame apr\u00e8s l&rsquo;optimisation.<\/li>\n<li>Si un instantan\u00e9 \u00e9choue \u00e0 mi-parcours, il est supprim\u00e9 automatiquement pour ne pas laisser de donn\u00e9es incompl\u00e8tes.<\/li>\n<li>Avant de l&rsquo;utiliser en production, essayez-le dans un environnement de test et v\u00e9rifiez les droits de l&rsquo;utilisateur de la base.<\/li>\n<\/ul>\n<p>Si MySQL ne d\u00e9marre plus apr\u00e8s une mise \u00e0 jour, voyez <a href=\"https:\/\/www.cisilino.com\/fr\/2026\/10\/13\/mysql-ne-demarre-plus-debian-12\/\">l&rsquo;article sur Debian 12<\/a>.<\/p>\n<p>Si vous l&rsquo;utilisez pour surveiller l&rsquo;espace disque et trouvez un cas qu&rsquo;il ne couvre pas, \u00e9crivez-moi dans les commentaires. Vos id\u00e9es pour l&rsquo;\u00e9tendre sont aussi bienvenues (autres moteurs, export CSV, alertes par e-mail).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le disque du serveur se remplit et vous ne savez pas quelle base en est responsable ? Un script pour mesurer l&rsquo;espace de MySQL et PostgreSQL et le comparer dans le temps.<\/p>\n","protected":false},"author":1,"featured_media":753,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wpai_generated_summary":"","footnotes":""},"categories":[362],"tags":[337,293,305,341],"class_list":["post-260","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-serveurs-bases-de-donnees","tag-espace-disque","tag-mysql-fr","tag-postgresql-fr","tag-script-bash-fr"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"L&#039;espace disque du serveur se remplit et vous ne savez pas quelle base en est responsable ? Un script mesure MySQL et PostgreSQL au fil du temps.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"matteocisilino\"\/>\n\t<meta name=\"google-site-verification\" content=\"_A-1f0dO30IDVHfP9muflI8kHQs-H4YOi8WLUkYzuLE\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Matteo Cisilino - Guide su WordPress, server e sicurezza\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Espace disque : quelle base MySQL occupe le disque ?\" \/>\n\t\t<meta property=\"og:description\" content=\"L&#039;espace disque du serveur se remplit et vous ne savez pas quelle base en est responsable ? Un script mesure MySQL et PostgreSQL au fil du temps.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espace-disque-bases-mysql-postgresql.webp\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espace-disque-bases-mysql-postgresql.webp\" \/>\n\t\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-10-20T07:53:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-10-29T19:01:20+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Espace disque : quelle base MySQL occupe le disque ?\" \/>\n\t\t<meta name=\"twitter:description\" content=\"L&#039;espace disque du serveur se remplit et vous ne savez pas quelle base en est responsable ? Un script mesure MySQL et PostgreSQL au fil du temps.\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espace-disque-bases-mysql-postgresql.webp\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/#blogposting\",\"name\":\"Espace disque : quelle base MySQL occupe le disque ?\",\"headline\":\"Quelle base de donn\\u00e9es occupe l&rsquo;espace disque ? Un script pour MySQL et PostgreSQL\",\"author\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/author\\\/matteocisilino\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/espace-disque-bases-mysql-postgresql.webp\",\"width\":1200,\"height\":630,\"caption\":\"Espace disque : graphique en anneau divis\\u00e9 en quatre secteurs de couleurs, avec trois barres de l\\u00e9gende \\u00e0 droite\"},\"datePublished\":\"2026-10-20T09:53:00+02:00\",\"dateModified\":\"2026-10-29T20:01:20+01:00\",\"inLanguage\":\"fr-FR\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/#webpage\"},\"articleSection\":\"Serveurs et bases de donn\\u00e9es, espace disque, MySQL, PostgreSQL, script bash\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/category\\\/serveurs-bases-de-donnees\\\/#listItem\",\"name\":\"Serveurs et bases de donn\\u00e9es\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/category\\\/serveurs-bases-de-donnees\\\/#listItem\",\"position\":2,\"name\":\"Serveurs et bases de donn\\u00e9es\",\"item\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/category\\\/serveurs-bases-de-donnees\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/#listItem\",\"name\":\"Quelle base de donn\\u00e9es occupe l&rsquo;espace disque ? Un script pour MySQL et PostgreSQL\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/#listItem\",\"position\":3,\"name\":\"Quelle base de donn\\u00e9es occupe l&rsquo;espace disque ? Un script pour MySQL et PostgreSQL\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/category\\\/serveurs-bases-de-donnees\\\/#listItem\",\"name\":\"Serveurs et bases de donn\\u00e9es\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/#organization\",\"name\":\"Matteo Cisilino\",\"description\":\"Guide su WordPress, server e sicurezza\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/logo-cisilino-512.png\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/#organizationLogo\",\"width\":512,\"height\":512,\"caption\":\"Logo: un cerchio a sinistra che si divide in cerchi pi\\u00f9 piccoli\"},\"image\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/#organizationLogo\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/author\\\/matteocisilino\\\/#author\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/author\\\/matteocisilino\\\/\",\"name\":\"matteocisilino\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/639872265f0661e8aee8924ba9d756b00ea816f8286fab99a5116c729d49618f?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"matteocisilino\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/#webpage\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/\",\"name\":\"Espace disque : quelle base MySQL occupe le disque ?\",\"description\":\"L'espace disque du serveur se remplit et vous ne savez pas quelle base en est responsable ? Un script mesure MySQL et PostgreSQL au fil du temps.\",\"inLanguage\":\"fr-FR\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/author\\\/matteocisilino\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/author\\\/matteocisilino\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/espace-disque-bases-mysql-postgresql.webp\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/#mainImage\",\"width\":1200,\"height\":630,\"caption\":\"Espace disque : graphique en anneau divis\\u00e9 en quatre secteurs de couleurs, avec trois barres de l\\u00e9gende \\u00e0 droite\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/2026\\\/10\\\/20\\\/script-espace-disque-base-de-donnees-mysql\\\/#mainImage\"},\"datePublished\":\"2026-10-20T09:53:00+02:00\",\"dateModified\":\"2026-10-29T20:01:20+01:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/\",\"name\":\"Matteo Cisilino\",\"description\":\"Guide su WordPress, server e sicurezza\",\"inLanguage\":\"fr-FR\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/fr\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Espace disque : quelle base MySQL occupe le disque ?","description":"L'espace disque du serveur se remplit et vous ne savez pas quelle base en est responsable ? Un script mesure MySQL et PostgreSQL au fil du temps.","canonical_url":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"google-site-verification":"_A-1f0dO30IDVHfP9muflI8kHQs-H4YOi8WLUkYzuLE","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/#blogposting","name":"Espace disque : quelle base MySQL occupe le disque ?","headline":"Quelle base de donn\u00e9es occupe l&rsquo;espace disque ? Un script pour MySQL et PostgreSQL","author":{"@id":"https:\/\/www.cisilino.com\/fr\/author\/matteocisilino\/#author"},"publisher":{"@id":"https:\/\/www.cisilino.com\/fr\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espace-disque-bases-mysql-postgresql.webp","width":1200,"height":630,"caption":"Espace disque : graphique en anneau divis\u00e9 en quatre secteurs de couleurs, avec trois barres de l\u00e9gende \u00e0 droite"},"datePublished":"2026-10-20T09:53:00+02:00","dateModified":"2026-10-29T20:01:20+01:00","inLanguage":"fr-FR","mainEntityOfPage":{"@id":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/#webpage"},"isPartOf":{"@id":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/#webpage"},"articleSection":"Serveurs et bases de donn\u00e9es, espace disque, MySQL, PostgreSQL, script bash"},{"@type":"BreadcrumbList","@id":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/fr\/#listItem","position":1,"name":"Home","item":"https:\/\/www.cisilino.com\/fr\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/fr\/category\/serveurs-bases-de-donnees\/#listItem","name":"Serveurs et bases de donn\u00e9es"}},{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/fr\/category\/serveurs-bases-de-donnees\/#listItem","position":2,"name":"Serveurs et bases de donn\u00e9es","item":"https:\/\/www.cisilino.com\/fr\/category\/serveurs-bases-de-donnees\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/#listItem","name":"Quelle base de donn\u00e9es occupe l&rsquo;espace disque ? Un script pour MySQL et PostgreSQL"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/fr\/#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/#listItem","position":3,"name":"Quelle base de donn\u00e9es occupe l&rsquo;espace disque ? Un script pour MySQL et PostgreSQL","previousItem":{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/fr\/category\/serveurs-bases-de-donnees\/#listItem","name":"Serveurs et bases de donn\u00e9es"}}]},{"@type":"Organization","@id":"https:\/\/www.cisilino.com\/fr\/#organization","name":"Matteo Cisilino","description":"Guide su WordPress, server e sicurezza","url":"https:\/\/www.cisilino.com\/fr\/","logo":{"@type":"ImageObject","url":"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/logo-cisilino-512.png","@id":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/#organizationLogo","width":512,"height":512,"caption":"Logo: un cerchio a sinistra che si divide in cerchi pi\u00f9 piccoli"},"image":{"@id":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/#organizationLogo"}},{"@type":"Person","@id":"https:\/\/www.cisilino.com\/fr\/author\/matteocisilino\/#author","url":"https:\/\/www.cisilino.com\/fr\/author\/matteocisilino\/","name":"matteocisilino","image":{"@type":"ImageObject","@id":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/639872265f0661e8aee8924ba9d756b00ea816f8286fab99a5116c729d49618f?s=96&d=mm&r=g","width":96,"height":96,"caption":"matteocisilino"}},{"@type":"WebPage","@id":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/#webpage","url":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/","name":"Espace disque : quelle base MySQL occupe le disque ?","description":"L'espace disque du serveur se remplit et vous ne savez pas quelle base en est responsable ? Un script mesure MySQL et PostgreSQL au fil du temps.","inLanguage":"fr-FR","isPartOf":{"@id":"https:\/\/www.cisilino.com\/fr\/#website"},"breadcrumb":{"@id":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/#breadcrumblist"},"author":{"@id":"https:\/\/www.cisilino.com\/fr\/author\/matteocisilino\/#author"},"creator":{"@id":"https:\/\/www.cisilino.com\/fr\/author\/matteocisilino\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espace-disque-bases-mysql-postgresql.webp","@id":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/#mainImage","width":1200,"height":630,"caption":"Espace disque : graphique en anneau divis\u00e9 en quatre secteurs de couleurs, avec trois barres de l\u00e9gende \u00e0 droite"},"primaryImageOfPage":{"@id":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/#mainImage"},"datePublished":"2026-10-20T09:53:00+02:00","dateModified":"2026-10-29T20:01:20+01:00"},{"@type":"WebSite","@id":"https:\/\/www.cisilino.com\/fr\/#website","url":"https:\/\/www.cisilino.com\/fr\/","name":"Matteo Cisilino","description":"Guide su WordPress, server e sicurezza","inLanguage":"fr-FR","publisher":{"@id":"https:\/\/www.cisilino.com\/fr\/#organization"}}]},"og:locale":"fr_FR","og:site_name":"Matteo Cisilino - Guide su WordPress, server e sicurezza","og:type":"article","og:title":"Espace disque : quelle base MySQL occupe le disque ?","og:description":"L'espace disque du serveur se remplit et vous ne savez pas quelle base en est responsable ? Un script mesure MySQL et PostgreSQL au fil du temps.","og:url":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/","og:image":"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espace-disque-bases-mysql-postgresql.webp","og:image:secure_url":"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espace-disque-bases-mysql-postgresql.webp","og:image:width":1200,"og:image:height":630,"article:published_time":"2026-10-20T07:53:00+00:00","article:modified_time":"2026-10-29T19:01:20+00:00","twitter:card":"summary_large_image","twitter:title":"Espace disque : quelle base MySQL occupe le disque ?","twitter:description":"L'espace disque du serveur se remplit et vous ne savez pas quelle base en est responsable ? Un script mesure MySQL et PostgreSQL au fil du temps.","twitter:image":"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espace-disque-bases-mysql-postgresql.webp"},"aioseo_meta_data":{"post_id":"260","title":"Espace disque : quelle base MySQL occupe le disque ?","description":"L'espace disque du serveur se remplit et vous ne savez pas quelle base en est responsable ? Un script mesure MySQL et PostgreSQL au fil du temps.","keywords":null,"keyphrases":{"focus":{"keyphrase":"espace disque"}},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_custom_url":null,"og_image_custom_fields":null,"og_image_url":null,"og_image_width":null,"og_image_height":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_image_url":null,"twitter_title":null,"twitter_description":null,"schema_type":"default","schema_type_options":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null,"created":"2026-10-29 09:22:17","updated":"2026-10-29 21:57:55","focus_keyword":"espace disque base de donn\u00e9es mysql","additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.cisilino.com\/fr\/\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.cisilino.com\/fr\/category\/serveurs-bases-de-donnees\/\" title=\"Serveurs et bases de donn\u00e9es\">Serveurs et bases de donn\u00e9es<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tQuelle base de donn\u00e9es occupe l\u2019espace disque ? Un script pour MySQL et PostgreSQL\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.cisilino.com\/fr\/"},{"label":"Serveurs et bases de donn\u00e9es","link":"https:\/\/www.cisilino.com\/fr\/category\/serveurs-bases-de-donnees\/"},{"label":"Quelle base de donn\u00e9es occupe l&rsquo;espace disque ? Un script pour MySQL et PostgreSQL","link":"https:\/\/www.cisilino.com\/fr\/2026\/10\/20\/script-espace-disque-base-de-donnees-mysql\/"}],"_links":{"self":[{"href":"https:\/\/www.cisilino.com\/fr\/wp-json\/wp\/v2\/posts\/260","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cisilino.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cisilino.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cisilino.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cisilino.com\/fr\/wp-json\/wp\/v2\/comments?post=260"}],"version-history":[{"count":2,"href":"https:\/\/www.cisilino.com\/fr\/wp-json\/wp\/v2\/posts\/260\/revisions"}],"predecessor-version":[{"id":915,"href":"https:\/\/www.cisilino.com\/fr\/wp-json\/wp\/v2\/posts\/260\/revisions\/915"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.cisilino.com\/fr\/wp-json\/wp\/v2\/media\/753"}],"wp:attachment":[{"href":"https:\/\/www.cisilino.com\/fr\/wp-json\/wp\/v2\/media?parent=260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cisilino.com\/fr\/wp-json\/wp\/v2\/categories?post=260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cisilino.com\/fr\/wp-json\/wp\/v2\/tags?post=260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}