Cálculo del uso de espacio en disco según MySQL DB
On febrero 9, 2021 by adminActualmente estoy usando information_schema.TABLES para calcular el uso total de espacio en disco agrupado por el nombre de la base de datos, pero se está ejecutando terriblemente despacio. En servidores con cientos de bases de datos, puede llevar unos minutos calcularlo.
¿Cuál es el método más rápido para calcular el uso de espacio en disco por base de datos? ¿Debería estar mirando el sistema de archivos? ¿Existe algún método para acelerar el esquema de información?
Respuesta
Hay 3 escenarios.
- Si está usando MyISAM, es más fácil simplemente mirar el sistema de archivos y usar
du -sh /var/lib/mysql/database
. - Si está usando InnoDB con innodb_file_per_table establecido, entonces puede obtener una respuesta aproximada usando
du -sh
. Es aproximado porque todavía hay algunos datos almacenados en el archivo ibdata1, por lo que estará un poco en el lado bajo. Esta técnica también funciona con bases de datos mixtas MyISAM / InnoDB (innodb_file_per_table
). - Si está utilizando InnoDB sin
innodb_file_per_table set
, entonces tendrá que mirar INFORMATION_SCHEMA.
En cualquiera de los casos anteriores, puede ejecutar la siguiente consulta para obtener la información que está buscando.
mysql> select table_schema, sum((data_length+index_length)/1024/1024) AS MB from information_schema.tables group by 1; +--------------------+-----------------+ | table_schema | MB | +--------------------+-----------------+ | prod | 298025.72448921 | | information_schema | 0.00781248 | | maatkit | 70.77330779 | | mysql | 0.66873168 | | test | 4752.31449127 | +--------------------+-----------------+ 5 rows in set (0.01 sec)
Si tiene una gran cantidad de tablas, puede ser lento, como ya ha descubierto.
Comentarios
- Vi en otro lugar que la opción 3 no ‘ t toma en cuenta los tamaños de VARCHAR.
Answer
Puedes usar este comando para obtener información en GB:
mysql> select table_schema "DB name (table_schema)", sum((data_length+index_length)/1024/1024/1024) AS "DB size in GB" from information_schema.tables group by table_schema; +-------------------------------------+-----------------+ | table_schema DB name (table_schema) | DB size in GB | +-------------------------------------+-----------------+ | prod | 29.72448921 | | information_schema | 0.00781248 | | miscDB | 0.77330779 | | mysql | 0.66873168 | | test | 47.31449127 | +-------------------------------------+-----------------+ 5 rows in set (0.01 sec)
Se adaptó la respuesta de Aaron Brown para proporcionar el tamaño en GB. Consulte la respuesta de Aaron Brown para obtener más detalles.
O para incluir espacio libre / recuperable, utilice:
mysql> SELECT table_schema "database name", sum( data_length + index_length ) / 1024 / 1024 "database size in MB", sum( data_free )/ 1024 / 1024 "free reclaimable space in MB" FROM information_schema.TABLES GROUP BY table_schema; +--------------------+---------------+------------------------------+ | DB name | DB size in GB | free/reclaimable space in GB | +--------------------+---------------+------------------------------+ | prod | 1.26 | 0.03 | | information_schema | 38.77 | 3.75 | | miscDB | 0.00 | 0.00 | | mysql | 0.00 | 0.00 | | test | 0.00 | 0.00 | +--------------------+---------------+------------------------------+
El espacio se puede recuperar usando comando OPTIMIZE TABLE para tablas InnoDB, MyISAM y ARCHIVE.
Consulte también ¿Cómo obtener el tamaño real de la base de datos MySQL? para obtener más detalles.
Respuesta
Para ver dónde se está usando el espacio en disco (sin importar si está en una tabla mysql o no), uso mi confiable comando «du». Aquí tienes un ejemplo de cómo descubro de dónde se está consumiendo todo el espacio.
$ sudo du -cks /* | sort -rn 954881224 total 945218092 /mysql 5299904 /usr 1781376 /opt 1166488 /var 671628 /home 343332 /run 213400 /root 93476 /lib 30784 /boot 20652 /etc 15940 /bin 13708 /sbin 12388 /tmp 24 /mnt 16 /lost+found 4 /srv 4 /snap 4 /media 4 /lib64 0 /vmlinuz 0 /sys 0 /proc 0 /initrd.img 0 /dev
Puedes ver que la mayor parte del espacio está siendo utilizado por esta carpeta. / mysql
Esa carpeta contiene tablas de datos. Para ver qué tablas están ocupando todo el espacio, puede proceder así usando la opción «humano» o «-h». Me gusta hacer administración del espacio en disco de esta manera porque a veces ni siquiera puede iniciar sesión en mysql porque no conoce la contraseña o el usuario.
$ sudo du -chs /mysql/* 2.3M /mysql/blacklist 18M /mysql/clientservices 2.5G /mysql/data 4.0K /mysql/doubleverify 137G /mysql/ias 4.0K /mysql/IAS 2.2G /mysql/innodb 16K /mysql/lost+found 4.0K /mysql/ml_centroids 16G /mysql/moat 4.0K /mysql/test 4.0K /mysql/tmp 4.0K /mysql/var 282G /mysql/verticaAdFees 4.0K /mysql/verticaViewability 247G /mysql/Whiteops 217G /mysql/Whiteops_TLX 902G total
Puede ver que todo el espacio está siendo acaparado por unas pocas tablas que contienen muchos GiG de datos. Espero que esto ayude.
Respuesta
Para obtener información sobre el nombre de la tabla y el número de registros que tiene, se puede utilizar la siguiente consulta,
SELECT * FROM information_schema.TABLES ;
Para obtener información sobre bases de datos en los servidores con su tamaño respectivo, se puede utilizar la siguiente consulta,
SELECT TABLE_SCHEMA AS `Database`, SUM((data_length + index_length) / (1024 * 1024)) AS `Database_Size` FROM information_schema.TABLES GROUP BY table_schema ORDER BY `Database_Size` DESC;
Respuesta
Buscaría el tamaño del archivo en su diccionario de datos. Es instantáneo y preciso.
Advertencia : Según el motor de almacenamiento, los índices se almacenan en el archivo principal o en otro archivo, no olvide resumirlos si
Comentarios
- Sí, pero ¿dónde está eso?
Responder
Sé que esto es antiguo, pero alguien puede encontrarlo relevante.
Yo n MySQL que uso:
SELECT concat(table_schema) "Database Name", concat(round(SUM(data_length/power(1024,3)),2),"G") DATA, concat(round(SUM(index_length/power(1024,3)),2),"G") "INDEX", concat(round(SUM(data_free/power(1024,3)),2),"G") "DATA FREE", concat(round(sum(data_free)/(SUM(data_length+index_length))*100,2)) "% FRAGMENTED", concat(round(SUM(data_length+index_length)/power(1024,3),2),"G") TOTAL FROM information_schema.TABLES WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") GROUP BY table_schema;
Dado que mi base de datos es InnoDB, esto es solo una estimación.
Comparo esta salida con:
du -sch /location/of_Mysql/* | sort -hr | head -n20
Espero que esto te ayude
Responder
Mejor (después de hacer apt-get install ncdu
):
cd "/var/lib/mysql" && ncdu
para obtener todo el tamaño total de las bases de datos Mysql en su VPS.
Respuesta
Suponiendo que su host MySQL se ejecuta en Linux.
Puede ejecutar la consulta siguiente para encontrar la ruta donde se almacenan los datos de MySQL
select @@datadir;
Una vez que sepa dónde están los datos está almacenado, puede verificar el uso del disco con el comando du
.
Por ejemplo, en Ubuntu sudo du -h /var/lib/mysql
.
Obtendría algo como esto
980K /var/lib/mysql/db_one 1.1M /var/lib/mysql/mysql 8.0K /var/lib/mysql/someother_db 1.2M /var/lib/mysql/another_db 212K /var/lib/mysql/performance_schema 1.7G /var/lib/mysql
Fuente: Verifique el almacenamiento usado por MySQL en Linux
Deja una respuesta