Calculando o uso do espaço em disco por banco de dados MySQL

28

Atualmente, estou usando information_schema.TABLES para calcular o uso total do espaço em disco agrupado pelo nome do banco de dados, mas está executando muito lentamente. Em servidores com centenas de bancos de dados, pode levar alguns minutos para calcular.

Qual é o método mais rápido de calcular o uso do espaço em disco pelo banco de dados? Devo apenas estar olhando para o sistema de arquivos? Existe um método para acelerar o information_schema?

GoldenNewby
fonte

Respostas:

46

Existem 3 cenários.

  1. Se você estiver usando o MyISAM, é mais fácil olhar o sistema de arquivos e usá-lo du -sh /var/lib/mysql/database.
  2. Se você estiver usando o InnoDB com innodb_file_per_table definido, poderá obter uma resposta aproximada usando du -sh. É aproximado, porque ainda existem alguns dados armazenados no arquivo ibdata1, portanto você ficará um pouco no lado inferior. Esta técnica também funciona com innodb_file_per_tablebancos de dados MyISAM / InnoDB ( ) misturados .
  3. Se você estiver usando o InnoDB sem innodb_file_per_table set, precisará dar uma olhada em INFORMATION_SCHEMA.

Em qualquer um dos casos acima, você pode executar a seguinte consulta para obter as informações que está procurando.

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)

Se você tiver um número muito grande de tabelas, pode ser lento, como você já descobriu.

Aaron Brown
fonte
Vi em outro lugar que a opção 3 não leva em consideração os tamanhos do VARCHAR.
Joe
3

Você pode usar este comando para obter informações em 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)

Adaptou a resposta de Aaron Brown para fornecer o tamanho em GB. Veja a resposta de Aaron Brown para mais detalhes.

OU para incluir espaço livre / recuperável, 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 |
+--------------------+---------------+------------------------------+

O espaço pode ser recuperado usando o comando OPTIMIZE TABLE para as tabelas InnoDB, MyISAM e ARCHIVE.

Veja também Como obter o tamanho real do banco de dados MySQL? para mais detalhes.

user9269906
fonte
1

Para obter informações sobre o nome da tabela e o número de registros que ela possui, a consulta abaixo pode ser usada,

SELECT * 
FROM information_schema.TABLES ;

Para obter informações sobre bancos de dados nos servidores com seus respectivos tamanhos, a consulta abaixo pode ser usada,

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
fonte
1

Para que eu veja onde o espaço em disco está sendo usado (independentemente de estar em uma tabela mysql ou não), eu uso o meu confiável comando "du". Aqui está um exemplo de como descobrir de onde todo o espaço está sendo consumido.

$ 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

Você pode ver que a maior parte do espaço está sendo usada por esta pasta. / mysql

Essa pasta contém tabelas de dados. Para ver quais tabelas estão ocupando todo o espaço, você pode continuar assim usando a opção "human" ou "-h". Eu gosto de fazer o gerenciamento de espaço em disco dessa maneira, porque às vezes você não pode nem entrar no mysql porque não conhece a senha ou o usuário.

$ 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

Você pode ver que todo o espaço está sendo ocupado por algumas tabelas contendo muitos GiGs de dados. Espero que isto ajude.

Russell Lego
fonte
0

Eu procuraria o tamanho do arquivo no seu arquivo de dados. É instantâneo e preciso.

Aviso : de acordo com o mecanismo de armazenamento, os índices são armazenados no arquivo principal ou em outro arquivo, não se esqueça de resumir, se necessário.

Spredzy
fonte
2
Sim, mas onde é isso?
Magne
0

Eu sei que isso é antigo, mas alguém pode achar isso relevante.

No MySQL eu 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 meu DB é o InnoDB, isso é apenas uma estimativa.

Eu comparo essa saída com:

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

Espero que isso ajude você

AJinSD
fonte
0

Melhor (depois de fazer apt-get install ncdu):

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

para obter todo o tamanho total dos bancos de dados Mysql no seu VPS.

T.Todua
fonte