Calcul de l'utilisation de l'espace disque par base de données MySQL

28

J'utilise actuellement information_schema.TABLES pour calculer l'utilisation totale de l'espace disque regroupé par nom de base de données, mais il fonctionne terriblement lentement. Sur des serveurs avec des centaines de bases de données, le calcul peut prendre quelques minutes.

Quelle est la méthode la plus rapide pour calculer l'utilisation de l'espace disque par base de données? Dois-je simplement regarder le système de fichiers? Existe-t-il une méthode pour accélérer le schéma d'information?

GoldenNewby
la source

Réponses:

46

Il existe 3 scénarios.

  1. Si vous utilisez MyISAM, il est plus simple de simplement regarder le système de fichiers et de l'utiliser du -sh /var/lib/mysql/database.
  2. Si vous utilisez InnoDB avec l' ensemble innodb_file_per_table , vous pouvez obtenir une réponse approximative en utilisant du -sh. C'est approximatif car il y a encore des données stockées dans le fichier ibdata1, donc vous serez un peu bas. Cette technique fonctionne également avec des innodb_file_per_tablebases de données mixtes MyISAM / InnoDB ( ).
  3. Si vous utilisez InnoDB sans innodb_file_per_table set, vous devrez consulter INFORMATION_SCHEMA.

Dans tous les cas ci-dessus, vous pouvez exécuter la requête suivante pour obtenir les informations que vous recherchez.

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 vous avez un très grand nombre de tables, cela peut être lent, comme vous l'avez déjà découvert.

Aaron Brown
la source
J'ai vu ailleurs que l'option 3 ne prend pas en compte les tailles VARCHAR.
Joe
3

Vous pouvez utiliser cette commande pour obtenir des informations en Go:

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)

Adapté de la réponse d' Aaron Brown pour fournir la taille en Go. Voir la réponse d'Aaron Brown pour plus de détails.

OU pour inclure un espace libre / récupérable, utilisez:

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 |
+--------------------+---------------+------------------------------+

L'espace peut être récupéré en utilisant commande OPTIMIZE TABLE pour les tables InnoDB, MyISAM et ARCHIVE.

Voir aussi Comment obtenir la vraie taille de la base de données MySQL? pour plus de détails.

user9269906
la source
1

Pour obtenir des informations sur le nom de la table et le nombre d'enregistrements qu'elle contient, la requête ci-dessous peut être utilisée,

SELECT * 
FROM information_schema.TABLES ;

Pour obtenir des informations sur les bases de données sur les serveurs avec leur taille respective, la requête ci-dessous peut être utilisée,

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;
Mathew
la source
1

Pour que je puisse voir où l'espace disque est utilisé (que ce soit dans une table mysql ou non), j'utilise ma fidèle commande "du". Voici un exemple où je trouve d'où tout l'espace est consommé.

$ 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

Vous pouvez voir que la majorité de l'espace est utilisée par ce dossier. / mysql

Ce dossier contient des tableaux de données. Pour voir quelles tables occupent tout l'espace, vous pouvez procéder comme ceci en utilisant l'option "humain" ou "-h". J'aime faire la gestion de l'espace disque de cette façon car parfois vous ne pouvez même pas vous connecter à mysql parce que vous ne connaissez pas le mot de passe ou l'utilisateur.

$ 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

Vous pouvez voir que tout l'espace est occupé par quelques tables contenant de nombreux GiG de données. J'espère que cela t'aides.

Russell Lego
la source
0

Je chercherais la taille du fichier sur votre dictionnaire de données. C'est instantané et précis.

Attention : selon le moteur de stockage, les index sont stockés dans le fichier principal ou dans un autre fichier n'oubliez pas de les résumer si besoin.

Spredzy
la source
2
Ouais, mais où est-ce?
Magne
0

Je sais que c'est vieux mais quelqu'un peut trouver cela pertinent.

Dans MySQL, j'utilise:

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;

Puisque ma base de données est InnoDB, ce n'est qu'une estimation.

Je compare cette sortie à:

du -sch /location/of_Mysql/* | sort -hr | head -n20

J'espère que cela vous aide

AJinSD
la source
0

Meilleur (après avoir fait apt-get install ncdu):

cd "/var/lib/mysql" && ncdu

pour obtenir toute la taille totale des bases de données Mysql dans votre VPS.

T.Todua
la source