{"id":264,"date":"2026-10-20T09:53:00","date_gmt":"2026-10-20T07:53:00","guid":{"rendered":"https:\/\/www.cisilino.com\/?p=264"},"modified":"2026-10-29T20:02:51","modified_gmt":"2026-10-29T19:02:51","slug":"script-espacio-disco-base-de-datos-mysql","status":"publish","type":"post","link":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/","title":{"rendered":"\u00bfQu\u00e9 base de datos ocupa espacio en disco? El script para MySQL y PostgreSQL"},"content":{"rendered":"<p>Le pasa a todo el mundo tarde o temprano. El espacio en disco del servidor se llena, salta la alarma y la pregunta es siempre la misma. <strong>\u00bfQu\u00e9 base de datos est\u00e1 ocupando todo este espacio?<\/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\/espacio-disco-bases-datos-mysql-postgresql.webp\" alt=\"Espacio en disco por base de datos: gr\u00e1fico de anillo en cuatro sectores con tres barras de leyenda a la derecha\" width=\"1200\" height=\"630\"\/><\/figure>\n<p>Yo me encontr\u00e9 con esto despu\u00e9s de una optimizaci\u00f3n. Hab\u00eda lanzado <code>OPTIMIZE TABLE<\/code> con la esperanza de recuperar espacio, pero el sistema de archivos no bajaba como esperaba. Sin un \u00abantes\u00bb con el que comparar el \u00abdespu\u00e9s\u00bb, era imposible saber si la optimizaci\u00f3n hab\u00eda funcionado. No sab\u00eda qu\u00e9 base de datos era la verdadera responsable. Ni si el espacio que faltaba estaba incluso en otra parte.<\/p>\n<p>Las herramientas que ten\u00eda a mano solo respond\u00edan a la mitad del problema.<\/p>\n<ul class=\"wp-block-list\">\n<li><code>du<\/code> muestra los archivos en disco, pero no dice a qu\u00e9 tabla pertenecen.<\/li>\n<li><code>information_schema<\/code> (o <code>pg_class<\/code> en PostgreSQL) da los tama\u00f1os l\u00f3gicos, pero no ve los binlogs, <code>ibdata1<\/code>, los undo logs ni el WAL.<\/li>\n<li>ambos fotograf\u00edan un solo instante. La comparaci\u00f3n en el tiempo sigue siendo un trabajo manual, hecho con copiar y pegar y una hoja de c\u00e1lculo.<\/li>\n<\/ul>\n<p>Necesitaba algo sencillo: <strong>fotografiar el estado de todas las bases de datos en un momento dado, volver a hacerlo m\u00e1s tarde y que me dijera qu\u00e9 ha cambiado<\/strong>, ordenando las diferencias de mayor a menor. As\u00ed el culpable salta enseguida a la vista.<\/p>\n<p>Sali\u00f3 un \u00fanico script de Bash. Solo necesita el cliente de la base de datos y las herramientas est\u00e1ndar de Linux (<code>awk<\/code>, <code>du<\/code>, <code>df<\/code>). Funciona con <strong>MySQL\/MariaDB<\/strong> y con <strong>PostgreSQL<\/strong>. Lo comparto aqu\u00ed con la esperanza de que le ahorre a alguien la misma tarde de frustraci\u00f3n.<\/p>\n<h2 class=\"wp-block-heading\">Qu\u00e9 hace: medir el espacio en disco<\/h2>\n<p>El script tiene cuatro comandos.<\/p>\n<ul class=\"wp-block-list\">\n<li><code>snapshot<\/code> guarda el estado actual (bases de datos, tablas, archivos del directorio de datos, espacio del sistema de archivos).<\/li>\n<li><code>compare<\/code> compara dos instant\u00e1neas y muestra las diferencias, las mayores arriba.<\/li>\n<li><code>report<\/code> muestra las bases de datos y tablas m\u00e1s grandes de una sola instant\u00e1nea.<\/li>\n<li><code>list<\/code> lista las instant\u00e1neas guardadas.<\/li>\n<\/ul>\n<p>La comparaci\u00f3n se divide en cuatro secciones, para no dejar rincones oscuros.<\/p>\n<ul class=\"wp-block-list\">\n<li><strong>tama\u00f1o de cada base de datos<\/strong> (datos + \u00edndices).<\/li>\n<li><strong>espacio libre o recuperable<\/strong> (<code>data_free<\/code> en MySQL, estimaci\u00f3n de tuplas muertas en PostgreSQL).<\/li>\n<li><strong>tama\u00f1o de cada tabla<\/strong>.<\/li>\n<li><strong>archivos reales en el directorio de datos<\/strong>: carpetas de las bases de datos, <code>ibdata1<\/code>, binlogs, undo, <code>pg_wal<\/code>.<\/li>\n<\/ul>\n<p>La \u00faltima secci\u00f3n suele ser la que resuelve el misterio. Muchas veces el espacio \u00aban\u00f3malo\u00bb no pertenece a ninguna base de datos. Pertenece a los logs binarios o a los archivos compartidos de InnoDB.<\/p>\n<h2 class=\"wp-block-heading\">Requisitos<\/h2>\n<ul class=\"wp-block-list\">\n<li>Linux con Bash 4 o superior, <code>awk<\/code>, <code>du<\/code>, <code>df<\/code> (todo de serie).<\/li>\n<li>el cliente <code>mysql<\/code> o <code>psql<\/code>, con un usuario que pueda leer los metadatos de todas las bases de datos.<\/li>\n<li>permisos de root (o del usuario <code>mysql<\/code>\/<code>postgres<\/code>) si quieres medir tambi\u00e9n los archivos en disco. Sin ellos, esa secci\u00f3n se omite con un aviso.<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\">Instalaci\u00f3n<\/h2>\n<p>Guarda el script (lo encontrar\u00e1s al final del art\u00edculo) en un archivo y hazlo ejecutable.<\/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\">Credenciales<\/h3>\n<p>Para MySQL\/MariaDB lo m\u00e1s limpio es un archivo <code>~\/.my.cnf<\/code> con las credenciales, as\u00ed no aparecen en el historial de comandos.<\/p>\n<pre class=\"wp-block-code\"><code>&#91;client]\nuser=root\npassword=LA_TUA_PASSWORD<\/code><\/pre>\n<p>Como alternativa puedes pasar las opciones con una variable de entorno.<\/p>\n<pre class=\"wp-block-code\"><code>export MYSQL_OPTS=\"-u root -pPASSWORD -h 127.0.0.1\"<\/code><\/pre>\n<p>Para PostgreSQL funcionan <code>~\/.pgpass<\/code>, las variables <code>PG*<\/code> o <code>PG_OPTS<\/code>.<\/p>\n<pre class=\"wp-block-code\"><code>export PG_OPTS=\"-U postgres -h localhost\"<\/code><\/pre>\n<h2 class=\"wp-block-heading\">C\u00f3mo se usa<\/h2>\n<p>El flujo t\u00edpico es <em>antes, optimizaci\u00f3n, despu\u00e9s, comparaci\u00f3n<\/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>Para PostgreSQL basta con a\u00f1adir la opci\u00f3n <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>Las opciones disponibles son:<\/p>\n<ul class=\"wp-block-list\">\n<li><code>-e mysql|postgres<\/code> elige el motor (por defecto: <code>mysql<\/code>).<\/li>\n<li><code>-d DIR<\/code> cambia la carpeta donde se guardan las instant\u00e1neas (por defecto: <code>.\/db_snapshots<\/code>).<\/li>\n<li><code>-n N<\/code> fija cu\u00e1ntas filas mostrar por secci\u00f3n (por defecto: 20).<\/li>\n<\/ul>\n<p>Si no indicas una etiqueta, la instant\u00e1nea toma como nombre la fecha y la hora. Es c\u00f3modo para monitorizar el crecimiento en el tiempo.<\/p>\n<h2 class=\"wp-block-heading\">Ejemplo de salida<\/h2>\n<p>Aqu\u00ed tienes una comparaci\u00f3n con datos de prueba, construidos a prop\u00f3sito para mostrar un caso t\u00edpico. La base de datos <code>shop<\/code> se reduce tras la optimizaci\u00f3n, pero la base <code>log<\/code> crece y los binlogs se duplican.<\/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>Aqu\u00ed el culpable es evidente: la tabla <code>log.eventi<\/code> ha crecido m\u00e1s de 6 GiB, y los archivos <code>mysql-bin.*<\/code> han pasado de 3,7 a 8,4 GiB. La optimizaci\u00f3n de <code>shop<\/code> funcion\u00f3, pero la ganancia se la comi\u00f3 el resto.<\/p>\n<h2 class=\"wp-block-heading\">C\u00f3mo leer los resultados del espacio en disco<\/h2>\n<ul class=\"wp-block-list\">\n<li>Arriba de cada secci\u00f3n est\u00e1n los elementos que m\u00e1s han cambiado. Una base de datos o una tabla que <strong>no baja<\/strong> (o incluso crece) tras la optimizaci\u00f3n es la primera sospechosa.<\/li>\n<li>Si las tablas bajan pero el sistema de archivos no, el espacio est\u00e1 en otra parte. Mira la secci\u00f3n sobre los archivos del directorio de datos (binlogs, <code>ibdata1<\/code>, undo, <code>pg_wal<\/code>).<\/li>\n<li><strong>MySQL\/MariaDB:<\/strong> <code>ibdata1<\/code> nunca se encoge, ni siquiera con <code>OPTIMIZE TABLE<\/code>. Con <code>innodb_file_per_table=OFF<\/code> el valor de <code>data_free<\/code> es compartido y poco indicativo.<\/li>\n<li><strong>PostgreSQL:<\/strong> un simple <code>VACUUM<\/code> no devuelve espacio al sistema operativo, hace falta <code>VACUUM FULL<\/code> (o <code>pg_repack<\/code>). El espacio \u00abrecuperable\u00bb que se muestra es una estimaci\u00f3n basada en las tuplas muertas.<\/li>\n<\/ul>\n<p>Para PostgreSQL, la documentaci\u00f3n sobre <a href=\"https:\/\/www.postgresql.org\/docs\/current\/diskusage.html\" target=\"_blank\" rel=\"noopener\">monitorizar el uso del disco<\/a> explica c\u00f3mo se calculan los tama\u00f1os de tablas e \u00edndices.<\/p>\n<h2 class=\"wp-block-heading\">Monitorizar el espacio en disco en el tiempo<\/h2>\n<p>Si el problema no est\u00e1 ligado a una sola optimizaci\u00f3n sino a un crecimiento gradual. Conviene automatizar las instant\u00e1neas con cron, una por hora, y luego comparar dos momentos cualesquiera.<\/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>Sin etiqueta, cada instant\u00e1nea toma como nombre la fecha y la hora (por ejemplo <code>20261011-140000<\/code>). Con <code>list<\/code> ves las disponibles y con <code>compare<\/code> comparas dos. En pocos d\u00edas se ve qu\u00e9 base de datos crece de forma an\u00f3mala.<\/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\">El script completo<\/h2>\n<p>Aqu\u00ed est\u00e1 el c\u00f3digo. C\u00f3pialo en un archivo llamado <code>db_space_compare.sh<\/code>, hazlo ejecutable y listo.<\/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\">Notas finales sobre el espacio en disco<\/h2>\n<ul class=\"wp-block-list\">\n<li>El script es de <strong>solo lectura<\/strong> sobre las bases de datos. Solo ejecuta <code>SELECT<\/code> sobre los metadatos. Escribe \u00fanicamente en la carpeta de las instant\u00e1neas.<\/li>\n<li>En MySQL 8 establece <code>information_schema_stats_expiry = 0<\/code> en la sesi\u00f3n. De lo contrario, las estad\u00edsticas en cach\u00e9 (hasta 24 horas) podr\u00edan mostrar los valores \u00abviejos\u00bb incluso despu\u00e9s de la optimizaci\u00f3n.<\/li>\n<li>Si una instant\u00e1nea falla a medias, se elimina autom\u00e1ticamente para no dejar datos incompletos.<\/li>\n<li>Antes de usarlo en producci\u00f3n, pru\u00e9balo en un entorno de pruebas y comprueba los permisos del usuario de la base de datos.<\/li>\n<\/ul>\n<p>Si MySQL deja de arrancar tras una actualizaci\u00f3n, aqu\u00ed tienes otro caso: <a href=\"https:\/\/www.cisilino.com\/es\/2026\/10\/13\/mysql-no-arranca-debian-12\/\">MySQL no arranca tras actualizar a Debian 12<\/a>.<\/p>\n<p>Si lo usas y encuentras un caso que no cubre, o tienes ideas para ampliarlo (otros motores, exportaci\u00f3n a CSV, avisos por correo), escr\u00edbeme en los comentarios.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El disco del servidor se llena y no sabes qu\u00e9 base de datos es la responsable. Un script para medir el espacio de MySQL y PostgreSQL y compararlo en el tiempo.<\/p>\n","protected":false},"author":1,"featured_media":755,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wpai_generated_summary":"","footnotes":""},"categories":[364],"tags":[339,295,307,343],"class_list":["post-264","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-servidores-bases-de-datos","tag-espacio-en-disco","tag-mysql-es","tag-postgresql-es","tag-script-de-bash"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"Cuando se agota el espacio en disco del servidor y no sabes qu\u00e9 base de datos es la responsable: un script para medir MySQL y PostgreSQL y comparar.\" \/>\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\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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=\"Espacio en disco de MySQL y PostgreSQL: script en Bash\" \/>\n\t\t<meta property=\"og:description\" content=\"Cuando se agota el espacio en disco del servidor y no sabes qu\u00e9 base de datos es la responsable: un script para medir MySQL y PostgreSQL y comparar.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espacio-disco-bases-datos-mysql-postgresql.webp\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espacio-disco-bases-datos-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:02:51+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Espacio en disco de MySQL y PostgreSQL: script en Bash\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Cuando se agota el espacio en disco del servidor y no sabes qu\u00e9 base de datos es la responsable: un script para medir MySQL y PostgreSQL y comparar.\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espacio-disco-bases-datos-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\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-mysql\\\/#blogposting\",\"name\":\"Espacio en disco de MySQL y PostgreSQL: script en Bash\",\"headline\":\"\\u00bfQu\\u00e9 base de datos ocupa espacio en disco? El script para MySQL y PostgreSQL\",\"author\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/author\\\/matteocisilino\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/espacio-disco-bases-datos-mysql-postgresql.webp\",\"width\":1200,\"height\":630,\"caption\":\"Espacio en disco por base de datos: gr\\u00e1fico de anillo en cuatro sectores con tres barras de leyenda a la derecha\"},\"datePublished\":\"2026-10-20T09:53:00+02:00\",\"dateModified\":\"2026-10-29T20:02:51+01:00\",\"inLanguage\":\"es-ES\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-mysql\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-mysql\\\/#webpage\"},\"articleSection\":\"Servidores y bases de datos, espacio en disco, MySQL, PostgreSQL, script de bash\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-mysql\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/category\\\/servidores-bases-de-datos\\\/#listItem\",\"name\":\"Servidores y bases de datos\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/category\\\/servidores-bases-de-datos\\\/#listItem\",\"position\":2,\"name\":\"Servidores y bases de datos\",\"item\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/category\\\/servidores-bases-de-datos\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-mysql\\\/#listItem\",\"name\":\"\\u00bfQu\\u00e9 base de datos ocupa espacio en disco? El script para MySQL y PostgreSQL\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-mysql\\\/#listItem\",\"position\":3,\"name\":\"\\u00bfQu\\u00e9 base de datos ocupa espacio en disco? El script para MySQL y PostgreSQL\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/category\\\/servidores-bases-de-datos\\\/#listItem\",\"name\":\"Servidores y bases de datos\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/#organization\",\"name\":\"Matteo Cisilino\",\"description\":\"Guide su WordPress, server e sicurezza\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/logo-cisilino-512.png\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-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\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-mysql\\\/#organizationLogo\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/author\\\/matteocisilino\\\/#author\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/author\\\/matteocisilino\\\/\",\"name\":\"matteocisilino\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-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\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-mysql\\\/#webpage\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-mysql\\\/\",\"name\":\"Espacio en disco de MySQL y PostgreSQL: script en Bash\",\"description\":\"Cuando se agota el espacio en disco del servidor y no sabes qu\\u00e9 base de datos es la responsable: un script para medir MySQL y PostgreSQL y comparar.\",\"inLanguage\":\"es-ES\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-mysql\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/author\\\/matteocisilino\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/author\\\/matteocisilino\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/espacio-disco-bases-datos-mysql-postgresql.webp\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-mysql\\\/#mainImage\",\"width\":1200,\"height\":630,\"caption\":\"Espacio en disco por base de datos: gr\\u00e1fico de anillo en cuatro sectores con tres barras de leyenda a la derecha\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/2026\\\/10\\\/20\\\/script-espacio-disco-base-de-datos-mysql\\\/#mainImage\"},\"datePublished\":\"2026-10-20T09:53:00+02:00\",\"dateModified\":\"2026-10-29T20:02:51+01:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/\",\"name\":\"Matteo Cisilino\",\"description\":\"Guide su WordPress, server e sicurezza\",\"inLanguage\":\"es-ES\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.cisilino.com\\\/es\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Espacio en disco de MySQL y PostgreSQL: script en Bash","description":"Cuando se agota el espacio en disco del servidor y no sabes qu\u00e9 base de datos es la responsable: un script para medir MySQL y PostgreSQL y comparar.","canonical_url":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-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\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/#blogposting","name":"Espacio en disco de MySQL y PostgreSQL: script en Bash","headline":"\u00bfQu\u00e9 base de datos ocupa espacio en disco? El script para MySQL y PostgreSQL","author":{"@id":"https:\/\/www.cisilino.com\/es\/author\/matteocisilino\/#author"},"publisher":{"@id":"https:\/\/www.cisilino.com\/es\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espacio-disco-bases-datos-mysql-postgresql.webp","width":1200,"height":630,"caption":"Espacio en disco por base de datos: gr\u00e1fico de anillo en cuatro sectores con tres barras de leyenda a la derecha"},"datePublished":"2026-10-20T09:53:00+02:00","dateModified":"2026-10-29T20:02:51+01:00","inLanguage":"es-ES","mainEntityOfPage":{"@id":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/#webpage"},"isPartOf":{"@id":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/#webpage"},"articleSection":"Servidores y bases de datos, espacio en disco, MySQL, PostgreSQL, script de bash"},{"@type":"BreadcrumbList","@id":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/es\/#listItem","position":1,"name":"Home","item":"https:\/\/www.cisilino.com\/es\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/es\/category\/servidores-bases-de-datos\/#listItem","name":"Servidores y bases de datos"}},{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/es\/category\/servidores-bases-de-datos\/#listItem","position":2,"name":"Servidores y bases de datos","item":"https:\/\/www.cisilino.com\/es\/category\/servidores-bases-de-datos\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/#listItem","name":"\u00bfQu\u00e9 base de datos ocupa espacio en disco? El script para MySQL y PostgreSQL"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/es\/#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/#listItem","position":3,"name":"\u00bfQu\u00e9 base de datos ocupa espacio en disco? El script para MySQL y PostgreSQL","previousItem":{"@type":"ListItem","@id":"https:\/\/www.cisilino.com\/es\/category\/servidores-bases-de-datos\/#listItem","name":"Servidores y bases de datos"}}]},{"@type":"Organization","@id":"https:\/\/www.cisilino.com\/es\/#organization","name":"Matteo Cisilino","description":"Guide su WordPress, server e sicurezza","url":"https:\/\/www.cisilino.com\/es\/","logo":{"@type":"ImageObject","url":"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/logo-cisilino-512.png","@id":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-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\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/#organizationLogo"}},{"@type":"Person","@id":"https:\/\/www.cisilino.com\/es\/author\/matteocisilino\/#author","url":"https:\/\/www.cisilino.com\/es\/author\/matteocisilino\/","name":"matteocisilino","image":{"@type":"ImageObject","@id":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-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\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/#webpage","url":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/","name":"Espacio en disco de MySQL y PostgreSQL: script en Bash","description":"Cuando se agota el espacio en disco del servidor y no sabes qu\u00e9 base de datos es la responsable: un script para medir MySQL y PostgreSQL y comparar.","inLanguage":"es-ES","isPartOf":{"@id":"https:\/\/www.cisilino.com\/es\/#website"},"breadcrumb":{"@id":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/#breadcrumblist"},"author":{"@id":"https:\/\/www.cisilino.com\/es\/author\/matteocisilino\/#author"},"creator":{"@id":"https:\/\/www.cisilino.com\/es\/author\/matteocisilino\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espacio-disco-bases-datos-mysql-postgresql.webp","@id":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/#mainImage","width":1200,"height":630,"caption":"Espacio en disco por base de datos: gr\u00e1fico de anillo en cuatro sectores con tres barras de leyenda a la derecha"},"primaryImageOfPage":{"@id":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/#mainImage"},"datePublished":"2026-10-20T09:53:00+02:00","dateModified":"2026-10-29T20:02:51+01:00"},{"@type":"WebSite","@id":"https:\/\/www.cisilino.com\/es\/#website","url":"https:\/\/www.cisilino.com\/es\/","name":"Matteo Cisilino","description":"Guide su WordPress, server e sicurezza","inLanguage":"es-ES","publisher":{"@id":"https:\/\/www.cisilino.com\/es\/#organization"}}]},"og:locale":"es_ES","og:site_name":"Matteo Cisilino - Guide su WordPress, server e sicurezza","og:type":"article","og:title":"Espacio en disco de MySQL y PostgreSQL: script en Bash","og:description":"Cuando se agota el espacio en disco del servidor y no sabes qu\u00e9 base de datos es la responsable: un script para medir MySQL y PostgreSQL y comparar.","og:url":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/","og:image":"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espacio-disco-bases-datos-mysql-postgresql.webp","og:image:secure_url":"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espacio-disco-bases-datos-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:02:51+00:00","twitter:card":"summary_large_image","twitter:title":"Espacio en disco de MySQL y PostgreSQL: script en Bash","twitter:description":"Cuando se agota el espacio en disco del servidor y no sabes qu\u00e9 base de datos es la responsable: un script para medir MySQL y PostgreSQL y comparar.","twitter:image":"https:\/\/www.cisilino.com\/wp-content\/uploads\/2026\/10\/espacio-disco-bases-datos-mysql-postgresql.webp"},"aioseo_meta_data":{"post_id":"264","title":"Espacio en disco de MySQL y PostgreSQL: script en Bash","description":"Cuando se agota el espacio en disco del servidor y no sabes qu\u00e9 base de datos es la responsable: un script para medir MySQL y PostgreSQL y comparar.","keywords":null,"keyphrases":{"focus":{"keyphrase":"espacio en disco"}},"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:36","updated":"2026-10-29 21:59:55","focus_keyword":"espacio en disco base de datos 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\/es\/\" 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\/es\/category\/servidores-bases-de-datos\/\" title=\"Servidores y bases de datos\">Servidores y bases de datos<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t\u00bfQu\u00e9 base de datos ocupa espacio en disco? El script para MySQL y PostgreSQL\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.cisilino.com\/es\/"},{"label":"Servidores y bases de datos","link":"https:\/\/www.cisilino.com\/es\/category\/servidores-bases-de-datos\/"},{"label":"\u00bfQu\u00e9 base de datos ocupa espacio en disco? El script para MySQL y PostgreSQL","link":"https:\/\/www.cisilino.com\/es\/2026\/10\/20\/script-espacio-disco-base-de-datos-mysql\/"}],"_links":{"self":[{"href":"https:\/\/www.cisilino.com\/es\/wp-json\/wp\/v2\/posts\/264","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cisilino.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cisilino.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cisilino.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cisilino.com\/es\/wp-json\/wp\/v2\/comments?post=264"}],"version-history":[{"count":2,"href":"https:\/\/www.cisilino.com\/es\/wp-json\/wp\/v2\/posts\/264\/revisions"}],"predecessor-version":[{"id":949,"href":"https:\/\/www.cisilino.com\/es\/wp-json\/wp\/v2\/posts\/264\/revisions\/949"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.cisilino.com\/es\/wp-json\/wp\/v2\/media\/755"}],"wp:attachment":[{"href":"https:\/\/www.cisilino.com\/es\/wp-json\/wp\/v2\/media?parent=264"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cisilino.com\/es\/wp-json\/wp\/v2\/categories?post=264"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cisilino.com\/es\/wp-json\/wp\/v2\/tags?post=264"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}