Eu tenho uma pergunta em duas partes:
Nos casos em que esse erro ocorre, existe uma maneira de ver se um host está próximo de ser bloqueado? E disparar um alerta?
PDOException: SQLSTATE[HY000] [1129] Host `hostname` is blocked because of many connection errors; unblock with `mysqladmin flush-hosts`
Que diretrizes devem ser seguidas ao aumentar
max_connect_errors
-- a nossa é 10? É recomendável rodarmysqladmin flush-hosts
diariamente, via cron?
Executando o MySQL 5.5.13 (Enterprise) no Red Hat 6.
Na verdade, você deve aumentar o max_connect_errors muito além do padrão de 10.
O intervalo é 1-18446744073709547520. Eu definiria para 1000 por enquanto.
No entanto, você tem um problema maior. mysqladmin requer que você se conecte ao mysqld antes de fazer qualquer coisa. Se max_connect_errors for alcançado muito rapidamente, você não pode fazer mysqladmin fazer nada nesse ponto. Mesmo um trabalho cron falhará a esse respeito.
Como você está usando o MySQL 5.5, sua melhor opção é criar um evento agendado na instância do MySQL para ocorrer a cada 5 minutos que fará apenas uma coisa: executar
FLUSH HOSTS
.Acabei de fazer isso no MySQL 5.5.12 no meu PC
Ótimo, sem reclamações do mysqld. Claro, escolhi arbitrariamente 5 minutos. Você pode escolher o horário que preferir.
De uma chance !!!
ATUALIZAÇÃO 2011-08-25 11:22 EDT
Para todos que usam versões do MySQL anteriores a 5.1, tenho uma sugestão que vale a pena:
Escreva um script perl que mantenha uma conexão aberta, tornando-a pulsante recuperando algo (por exemplo, uptime, aborted_connects, etc) e a cada 10 minutos expulsando FLUSH HOSTS. Seja qual for o usuário com o qual você se conecta, certifique-se de que ele tenha o privilégio RELOAD.
Por exemplo: execute este comando:
Aqui está um script perl que chamo de heartbeat.pl para fazer isso usando esse usuário e senha:
No sistema operacional, chame o script perl para heartbeat a cada 6 segundos. Quando ele bater 100 vezes, aqueles 600 segundos (10 minutos), faça-o funcionar
FLUSH HOSTS
. Chame assim:Seguem outros horários:
Para parar o programa, execute isto: