Cálculo del uso del espacio en disco por MySQL DB

28

Actualmente estoy usando information_schema.TABLES para calcular el uso total de espacio en disco agrupado por el nombre de la base de datos, pero está funcionando muy lentamente. En servidores con cientos de bases de datos, puede tomar minutos calcular.

¿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? ¿Hay algún método para acelerar el esquema de información?

GoldenNewby
fuente

Respuestas:

46

Hay 3 escenarios.

  1. Si está utilizando MyISAM, es más fácil simplemente mirar el sistema de archivos y usarlo du -sh /var/lib/mysql/database.
  2. Si está usando InnoDB con innodb_file_per_table set, 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 innodb_file_per_tablebases de datos mixtas MyISAM / InnoDB ( ).
  3. Si está utilizando InnoDB sin él innodb_file_per_table set, entonces deberá consultar 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 lo ha descubierto.

Aaron Brown
fuente
Vi en otro lugar que la opción 3 no tiene en cuenta los tamaños de VARCHAR.
Joe
3

Puede 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)

Adaptado la respuesta de Aaron Brown para proporcionar tamaño en GB. Vea la respuesta de Aaron Brown para más detalles.

O para incluir espacio libre / recuperable, use:

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 reclamar utilizando el comando OPTIMIZE TABLE para las tablas InnoDB, MyISAM y ARCHIVE.

Consulte también ¿Cómo obtener el tamaño real de la base de datos MySQL? para más detalles.

usuario9269906
fuente
1

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;
Mateo
fuente
1

Para poder ver dónde se está utilizando el espacio en disco (independientemente de si está en una tabla mysql o no), utilizo mi confiable comando "du". Aquí hay un ejemplo de mí encontrando de dónde se está comiendo 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

Puede ver que esta carpeta está utilizando la mayor parte del espacio. / 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 administrar el espacio en disco de esta manera porque a veces ni siquiera puedes iniciar sesión en mysql porque no conoces 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.

Russell Lego
fuente
0

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 es necesario.

Spredzy
fuente
2
Sí, pero ¿dónde es eso?
Magne
0

Sé que esto es viejo, pero alguien puede encontrar esto relevante.

En MySQL yo 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;

Como mi DB 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

AJinSD
fuente
0

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.

T.Todua
fuente