Mysql

Tamanho das tabelas MySQL 8: a query que acha o vilão do disco

O df -h mostra 94% e o banco é o suspeito. Antes de sair rodando DELETE em tabela de log (com backup do banco na mão, sempre), dá para saber em dez segundos qual delas comeu o disco. Conecte no MySQL 8 com o banco do site selecionado:

SET SESSION information_schema_stats_expiry = 0;

SELECT table_name,
       ROUND((data_length + index_length) / 1024 / 1024) AS mb,
       ROUND(data_length / 1024 / 1024)  AS dados_mb,
       ROUND(index_length / 1024 / 1024) AS indice_mb,
       table_rows
FROM information_schema.TABLES
WHERE table_schema = DATABASE()
ORDER BY 2 DESC
LIMIT 15;

Como ler as colunas que importam

A primeira linha não é enfeite: no MySQL 8 essas estatísticas vêm de cache com validade de um dia (information_schema_stats_expiry, padrão 86400). Sem zerar na sessão, você olha o tamanho de ontem.

data_length é o espaço das linhas; index_length é o dos índices. Índice maior que os dados costuma ser índice sobrando ou duplicado, não volume de registro. Em WordPress o topo quase sempre é wp_postmeta ou wp_options; em Magento 2, report_event e url_rewrite. Já table_rows é estimativa em InnoDB: se o número parecer absurdo, um ANALYZE TABLE nome_da_tabela; refaz a conta.

O espaço que já é seu e não voltou

SELECT table_name, ROUND(data_free / 1024 / 1024) AS livre_mb
FROM information_schema.TABLES
WHERE table_schema = DATABASE() AND data_free > 0
ORDER BY 2 DESC;

data_free é o pedaço do .ibd que o InnoDB já tomou do disco e liberou só internamente depois de um DELETE grande: o sistema operacional continua vendo aquilo como ocupado. Quem devolve é o OPTIMIZE TABLE, só que ele recria a tabela do zero e precisa de espaço livre do tamanho dela enquanto trabalha.

Ou seja: com o disco em 94% o OPTIMIZE é a última coisa a tentar. Ganhe fôlego primeiro com PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);, conferindo antes que nenhuma réplica atrasada nem backup dependa daqueles binlogs, porque eles não voltam. Depois volte para a tabela campeã.

Post Recentes

cron_schedules WordPress: intervalo de 5 minutos no WP-Cron

O WordPress só oferece hourly, twicedaily, daily e weekly. Use o filtro cron_schedules para criar um intervalo de 5 minutos…

16 horas atrás

E-mails do WooCommerce não chegam: como testar o envio de um pedido real

Dispare pela linha de comando o e-mail de um pedido que já existe na loja e descubra se a falha…

23 horas atrás

CodeIgniter 4 tela branca: CI_ENVIRONMENT e o erro que sumiu

Página em branco no CodeIgniter 4, sem nenhuma mensagem? O ambiente está em production e escondeu o erro. Troque o…

2 dias atrás

Google Consent Mode v2 no WordPress: default denied antes do gtag rodar

O Google Ads acusa consentimento ausente porque o gtag sobe antes do banner. Veja como injetar o default denied do…

3 dias atrás

Módulos PHP 8.3 faltando na Saúde do site do WordPress: como instalar

A tela Saúde do site avisa que faltam extensões como intl, imagick ou zip: instale no PHP 8.3, reinicie o…

3 dias atrás

Caso de teste PHPUnit a partir do bug: do relato solto para o teste que falha

Chegou um chamado sem passo a passo e sem exemplo. Veja como virar esse relato em um caso de teste…

4 dias atrás