O erro mkdir(): Permission denied no phpMyAdmin normalmente aparece quando o PHP tenta criar diretório temporário e não possui permissão efetiva de escrita. No meu ambiente, a causa não era apenas chmod, mas combinação de owner inconsistente e política de caminho no PHP-FPM.
Sintoma observado
- upload/import no phpMyAdmin falhando;
- mensagem de
mkdir permission denied; - operações que dependem de diretório temporário não concluídas.
Diagnóstico passo a passo
Descobrir usuário do pool FPM:
ps aux | grep php-fpm
Validar caminho temporário usado pelo PHP:
php -i | grep -E 'upload_tmp_dir|sys_temp_dir|open_basedir'
Validar permissões do diretório:
ls -ld /tmp
ls -ld /var/lib/php/sessions
Correção aplicada
No meu caso, corrigi owner/group do diretório de trabalho e garanti permissão compatível com o usuário de execução:
chown -R www-data:www-data /var/lib/php/sessions
chmod 1733 /var/lib/php/sessions
Se o upload temp estiver customizado para outro caminho, ajuste esse caminho.
Verificação de open_basedir
Mesmo com permissão correta, open_basedir pode bloquear acesso ao diretório. Valide e inclua caminho permitido no pool/site.
Exemplo de ajuste (conceitual):
php_admin_value[open_basedir] = /home/site/web:/tmp:/var/lib/php/sessions
Após alteração:
systemctl restart php8.1-fpm
systemctl reload nginx
Validação final
- reabrir phpMyAdmin;
- tentar import pequeno e depois arquivo maior;
- revisar logs PHP-FPM e webserver para confirmar ausência de novos denies.
Evidências de log que eu coleto no diagnóstico
No PHP-FPM:
journalctl -u php8.1-fpm -n 120 --no-pager | grep -Ei 'mkdir|permission|open_basedir'
No Nginx/Apache:
grep -Ei 'phpmyadmin|permission denied|mkdir' /var/log/nginx/error.log | tail -n 50
grep -Ei 'phpmyadmin|permission denied|mkdir' /var/log/apache2/error.log | tail -n 50
Esses trechos entram no dossiê de incidente para comprovar causa raiz e ação corretiva aplicada.
Casos adicionais que já tratei
Diretório existe, mas com SELinux bloqueando escrita
Quando SELinux está Enforcing, permissões POSIX podem parecer corretas e mesmo assim a operação falha.
Validação:
sestatus
ausearch -m avc -ts recent | tail -n 30
Correção de contexto (exemplo):
semanage fcontext -a -t httpd_sys_rw_content_t '/var/lib/php/sessions(/.*)?'
restorecon -Rv /var/lib/php/sessions
Sessão em partição lotada
Se a partição do temp/sessions está sem espaço ou sem inode, o erro de\nmkdir pode aparecer mascarado.
df -h
df -i
Checklist preventivo
- manter
upload_tmp_direxplícito em ambiente multi-PHP; - padronizar owner/group de diretórios de sessão;
- revisar
open_basedirem novos pools/sites; - monitorar logs de FPM após upgrades de painel/PHP.
Conclusão
mkdir permission denied no phpMyAdmin precisa de diagnóstico de execução real do PHP (usuário, diretório e política). Ajustar só chmod 777 mascara o problema e aumenta risco. A correção correta é alinhar owner, permissões e restrição de caminho.
Este post está licenciado sob CC BY-NC.
Comentários
Participe da discussão abaixo.
Comentários ainda não configurados. Adicione as opções do Cusdis em /assets/json/config/blog-comments-config.json.