Desempenho e monitorização

Consultas SQL para limpar dados órfãos e purgar a base de dados do WordPress

Revisto a 8 min de leitura WordPress base de dados desempenho

Uma base de dados antiga do WordPress pode acumular metadados sem objeto associado, revisões e dados temporários. Antigo ou grande não significa dispensável. Este guia permite identificar candidatos e preparar uma limpeza limitada; não é um lote de comandos para colar em produção.

Preparar uma cópia e delimitar o site

Verifique a base de dados e o prefixo reais no wp-config.php. Os exemplos usam wp_. Em multisite, as tabelas de utilizadores podem ser partilhadas e cada site tem o seu próprio conjunto de tabelas: não aplique estes exemplos sem rever essa estrutura.

Ensaie num clone. Antes de limpar a produção, prepare uma cópia recente e controle as escritas de visitas, cron, filas e integrações. Mostrar uma página de manutenção não trava necessariamente todas essas escritas.

A partir da instalação do WordPress, exporte para um caminho privado fora das raízes web. Neste exemplo, crie previamente ~/copias-docs com permissões 700 e verifique que não está publicado:

umask 077
wp db export "$HOME/copias-docs/antes-limpieza.sql" &&
sha256sum "$HOME/copias-docs/antes-limpieza.sql" > "$HOME/copias-docs/antes-limpieza.sql.sha256"

Se a exportação falhar, o ficheiro pode estar incompleto: não continue. Utilize nomes novos para não substituir uma cópia anterior, descarregue a cópia e verifique um restauro numa base de dados temporária. O checksum verifica a integridade, não demonstra que o restauro funciona.

Inspecionar metadados de artigos órfãos

Execute primeiro a contagem e uma amostra no phpMyAdmin:

SELECT COUNT(*) AS filas_afectadas
FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.ID IS NULL;

SELECT pm.meta_id, pm.post_id, pm.meta_key
FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.ID IS NULL
LIMIT 50;

Reveja porque existem e se há importações ou processos incompletos. Se confirmou que são dispensáveis, esta é a eliminação equivalente:

DELETE pm FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.ID IS NULL;

Em tabelas grandes, o programador deve preparar lotes limitados e controlar os bloqueios; não execute uma eliminação massiva só porque a amostra é pequena.

Inspecionar metadados de utilizadores órfãos

SELECT COUNT(*) AS filas_afectadas
FROM wp_usermeta um
LEFT JOIN wp_users u ON um.user_id = u.ID
WHERE u.ID IS NULL;

SELECT um.umeta_id, um.user_id, um.meta_key
FROM wp_usermeta um
LEFT JOIN wp_users u ON um.user_id = u.ID
WHERE u.ID IS NULL
LIMIT 50;

Só depois de rever o conjunto, o contexto de multisite e a cópia, a eliminação equivalente é:

DELETE um FROM wp_usermeta um
LEFT JOIN wp_users u ON um.user_id = u.ID
WHERE u.ID IS NULL;

Transações e caches

Se todas as tabelas alteradas forem InnoDB, pode ensaiar uma única eliminação revista dentro de uma transação, na mesma sessão de base de dados:

START TRANSACTION;
-- Execute um único DELETE revisto e verifique a contagem.
ROLLBACK;

Não use COMMIT até concluir as verificações previstas. O MyISAM e as alterações de estrutura não oferecem esse mesmo retorno; não converta tabelas como passo improvisado de uma limpeza. Uma transação pode manter bloqueios enquanto está aberta.

O SQL direto não executa as APIs nem atualiza todas as caches do WordPress. Após uma limpeza validada, invalide as caches afetadas com um âmbito conhecido, sem esvaziar indiscriminadamente o Redis de outros sites.

Etiquetas vazias

Liste as etiquetas incluindo as vazias e reveja a coluna count:

wp term list post_tag --hide_empty=0 --fields=term_id,name,count

Um valor zero é um candidato a revisão, não uma ordem de eliminação: pode existir conteúdo não publicado ou uma razão editorial para manter a etiqueta. Para eliminar uma etiqueta confirmada, utilize a API através do WP-CLI, substituindo o marcador pelo seu ID real:

wp term delete post_tag ID_REVISADO

Não elimine relações de taxonomias diretamente com SQL. Verifique depois as ligações, a navegação e o conteúdo relacionado.

Artigos cujo autor já não existe

Não os elimine nem reatribua todos os tipos de conteúdo sem os rever. Esta consulta permite localizar candidatos:

SELECT p.ID, p.post_type, p.post_status, p.post_title, p.post_author
FROM wp_posts p
LEFT JOIN wp_users u ON p.post_author = u.ID
WHERE u.ID IS NULL
LIMIT 50;

Alguns registos podem usar o autor 0 legitimamente. Para um artigo cuja autoria deva ser corrigida, escolha um utilizador válido e utilize a edição do WordPress ou wp post update com os identificadores revistos. Assim executam-se as operações da aplicação que um UPDATE direto omitiria.

Revisões e transientes

Para rever revisões antigas, utilize uma data UTC coerente com a coluna:

SELECT ID, post_parent, post_modified_gmt
FROM wp_posts
WHERE post_type = 'revision'
  AND post_modified_gmt < DATE_SUB(UTC_TIMESTAMP(), INTERVAL 10 DAY)
ORDER BY ID
LIMIT 50;

Dez dias é apenas um exemplo. Decida a retenção de acordo com as suas necessidades e elimine as revisões selecionadas com uma ferramenta que use as APIs do WordPress, não apagando linhas de wp_posts em bloco e deixando os seus metadados.

Para rever os transientes sem mostrar os seus valores e depois retirar apenas os expirados:

wp transient list --fields=name,expiration
wp transient delete --expired

A lista inclui transientes não expirados; verifique a sua validade. Com cache persistente ou multisite, reveja o âmbito da ferramenta antes de interpretar o que aparece nas tabelas.

No fim, valide o frontend, a administração, os utilizadores, as encomendas e as tarefas. Mantenha a cópia durante o período de observação. Se for preciso restaurar, coordene as escritas novas para não perder encomendas ou alterações posteriores à cópia.

Também lhe pode ser útil

Algo não bate certo ou mudou? Diga-nos e revemos.