Como corrigir o erro de permissão ao limpar o banco no WP-Optimize
O que é o erro de permissão no banco do WP-Optimize?
O erro de permissão no banco do WP-Optimize é a falha em que a aba Optimizations executa cada operação, mas devolve uma mensagem de privilégio negado em vez de reduzir o overhead da tabela. O WP-Optimize não tem acesso próprio ao banco: ele roda as consultas pela conexão que o WordPress abre com o usuário e a senha definidos nas constantes DB_USER e DB_PASSWORD do wp-config.php. Quando uma otimização de tabela é disparada, o plugin envia o comando OPTIMIZE TABLE ao MySQL. Em tabelas InnoDB, esse comando é remapeado pelo servidor para um ALTER TABLE que recria a tabela inteira, e essa recriação exige os privilégios ALTER, INDEX, CREATE e DROP sobre o schema. Se o usuário do WordPress recebeu apenas SELECT, INSERT, UPDATE e DELETE, o servidor recusa a operação com um erro de comando negado, e a limpeza para naquele ponto.
Como identificar
- A aba Optimizations mostra a mensagem “Optimizing the table … failed” logo abaixo da operação, em vermelho, e o overhead da tabela continua igual ao anterior.
- O log do MySQL ou o WP_DEBUG registra o erro “OPTIMIZE command denied to user ‘usuário’@’host’ for table ‘wp_options'” ou “ALTER command denied to user”.
- Rodar wp db query “OPTIMIZE TABLE wp_postmeta;” pela linha de comando devolve “Access denied” em vez de uma tabela de status com Op optimize e Msg_text status OK.
- A coluna Status do relatório do WP-Optimize fica em “Table does not support optimize, doing recreate + analyze instead” e em seguida falha por falta de privilégio para recriar.
- Apenas a limpeza por DELETE de revisões e transients conclui, enquanto toda otimização que recria a tabela é marcada como falha, sinal de que faltam privilégios de DDL e não de leitura ou escrita.
Como prevenir
- Ao criar a conta do banco para um site WordPress, conceda de uma vez SELECT, INSERT, UPDATE, DELETE, ALTER, INDEX, CREATE e DROP restritos ao schema do site, para a limpeza que recria tabela funcionar sem ajuste posterior
- Sempre limite o GRANT ao banco do WordPress no formato nome_do_banco.* em vez de escopo global, para reduzir o estrago caso a senha do usuário do site vaze
- Antes de migrar de hospedagem, anote os privilégios do usuário do banco de origem e replique exatamente no destino, porque painéis diferentes criam contas com privilégios mínimos distintos
- Confira se um plugin de segurança ou uma política do provedor não revoga ALTER e DROP do usuário do site de forma automática, o que silenciosamente quebra a otimização de tabela depois de já estar funcionando
Causa
- O usuário em DB_USER do wp-config.php recebeu só os privilégios SELECT, INSERT, UPDATE e DELETE na criação da conta de hospedagem, e o OPTIMIZE TABLE de uma tabela InnoDB é remapeado para um ALTER TABLE que exige ALTER, INDEX, CREATE e DROP que o usuário não tem.
- O banco roda MySQL anterior à versão 5.7 e o WP-Optimize tenta o caminho de recriar mais analisar a tabela InnoDB, descrito na doc oficial do plugin, em vez de um OPTIMIZE direto, e essa recriação esbarra na falta de privilégio de DDL do usuário.
- A conta do banco foi concedida com escopo restrito a um único schema, no formato GRANT em nome_do_banco.* para o usuário@host, e a otimização tenta operar numa tabela com prefixo que ficou fora desse escopo, então o servidor nega o comando.
- Um plugin de segurança ou uma política do provedor revogou os privilégios de ALTER e DROP do usuário do site para reduzir o risco de injeção, e a limpeza que recria tabela passou a ser recusada a partir daquele momento.
- A tabela alvo é InnoDB e o servidor responde com o aviso de que não suporta optimize e parte para recriar mais analisar, e é nesse passo de recriação que o privilégio ausente derruba a operação.
Como resolver
- Confirme qual usuário do banco o WordPress usa: abra o wp-config.php por FTP e leia as constantes de conexão para saber exatamente qual conta o WP-Optimize está usando e em qual banco ela opera. Anote os três valores antes de mexer em privilégios.
define( 'DB_NAME', 'nome_do_banco' ); define( 'DB_USER', 'usuário_do_banco' ); define( 'DB_HOST', 'localhost' ); - Reproduza o erro pela linha de comando: rode o mesmo comando que o WP-Optimize dispara, isolado, para confirmar que a falha é de privilégio e não outra coisa. Se voltar Access denied, o problema é o GRANT do usuário.
wp db query "OPTIMIZE TABLE wp_options;" - Veja os privilégios atuais do usuário: entre no MySQL com uma conta administrativa, normalmente a root ou a conta de admin do painel da hospedagem, e liste o que o usuário do site realmente pode fazer. Procure por ALTER, INDEX, CREATE e DROP na resposta.
mysql -u root -p SHOW GRANTS FOR 'usuário_do_banco'@'localhost'; - Conceda os privilégios que o OPTIMIZE TABLE exige: ainda no MySQL com a conta administrativa, acrescente ao usuário do site os privilégios de recriação de tabela apenas no banco do WordPress, nunca em escopo global. Em seguida recarregue as permissões para o servidor aplicar a mudança na hora.
GRANT ALTER, INDEX, CREATE, DROP ON nome_do_banco.* TO 'usuário_do_banco'@'localhost'; FLUSH PRIVILEGES; - Valide a otimização e rode de novo no WP-Optimize: repita o comando isolado para confirmar que agora a tabela de status volta com Msg_text como OK, depois abra o plugin e dispare a limpeza completa. O overhead deve cair e as operações param de aparecer em vermelho.
wp db query "OPTIMIZE TABLE wp_options;" wp-admin -> WP-Optimize -> Database -> Run all selected optimizations
-- Diagnostico: lista os privilegios atuais do usuario do site
SHOW GRANTS FOR 'usuario_do_banco'@'localhost';
-- Concede SO os privilegios de DDL que o OPTIMIZE TABLE exige,
-- restrito ao schema do WordPress (nunca global *.*)
GRANT ALTER, INDEX, CREATE, DROP
ON nome_do_banco.*
TO 'usuario_do_banco'@'localhost';
FLUSH PRIVILEGES;
-- Confirma que a otimizacao agora roda sem Access denied
OPTIMIZE TABLE wp_options;














