AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 5026
Accepted
KM.
KM.
Asked: 2011-08-26 05:59:00 +0800 CST2011-08-26 05:59:00 +0800 CST 2011-08-26 05:59:00 +0800 CST

Como você sabe qual host está prestes a ser bloqueado no MySQL?

  • 772

Eu tenho uma pergunta em duas partes:

  1. 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`
    
  2. Que diretrizes devem ser seguidas ao aumentar max_connect_errors-- a nossa é 10? É recomendável rodar mysqladmin flush-hostsdiariamente, via cron?

Executando o MySQL 5.5.13 (Enterprise) no Red Hat 6.

mysql mysql-5.5
  • 1 1 respostas
  • 12974 Views

1 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-08-26T06:17:40+08:002011-08-26T06:17:40+08:00

    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

    mysql> use test
    Database changed
    mysql> CREATE EVENT ev ON SCHEDULE
        ->       EVERY 5 MINUTE
        -> STARTS (NOW() + INTERVAL 1 MINUTE)
        -> DO FLUSH HOSTS;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql>
    

    Ó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:

    GRANT RELOAD on *.* to 'whateveruser'@'localhost' identified by 'whateverpassword';
    

    Aqui está um script perl que chamo de heartbeat.pl para fazer isso usando esse usuário e senha:

    #!/usr/bin/perl
    
    use DBI;
    use DBD::mysql;
    
    my ($SLEEP_TIME_INTERVAL,$HEARTBEAT_CYCLE) = @ARGV;
    
    $check_replication = 1;
    
    $username = "whateveruser";
    $password = "whateverpassword";
    
    $MYSQL_HEARTBEAT_FILE = "/tmp/MySQLHeartBeat.txt";
    $MYSQL_FLATLINE_FILE  = "/tmp/MySQLFlatLine.txt";
    
    $MYSQL_PROCESSLIST_FILE = "/tmp/MySQL_Processlist.txt";
    
    if ( $SLEEP_TIME_INTERVAL == 0 )
    {
            open(fh_output,"> $MYSQL_FLATLINE_FILE") or die "Can't Find File $MYSQL_HEARTBEAT_FILE\n$!\n";
            printf fh_output "DONE !!!\n";
            close fh_output;
            exit 0;
    }
    
    $db = DBI->connect("DBI:mysql:information_schema;host=127.0.0.1",$username,$password)
    or die "Cannot connect to the DB information_schema\n",$DBI->errstr(),"\n";
    
    $st_globalstatus = $db->prepare("SHOW GLOBAL STATUS") or die "Cannot Prepare SQL Statement\n",$DBI->errstr(),"\n";
    $st_flush_hosts  = $db->prepare("FLUSH HOSTS")        or die "Cannot Prepare SQL Statement\n",$DBI->errstr(),"\n";
    
    $heartbeat_count = 0;
    $my_heart_is_beating = 1;
    while ( $my_heart_is_beating )
    {
            $st_globalstatus->execute() or die "Cannot Execute SQL Statement\n",$DBI->errstr(),"\n";
            {
                    $StatusCount  = 0;
                    while ( my $row = $st_globalstatus->fetchrow_hashref() )
                    {
                            my $uptime = $row->{Value};
                    }
                    $st_globalstatus->finish();
                    open(fh_output,"> $MYSQL_HEARTBEAT_FILE") or die "Can't Find File $MYSQL_HEARTBEAT_FILE\n$!\n";
                    printf fh_output "%s : %s\n",$uptime;
                    close fh_output;
            }
            for ($i = 0; $i < $SLEEP_TIME_INTERVAL; $i++)
            {
                    if ( -f $MYSQL_FLATLINE_FILE )
                    {
                            unlink $MYSQL_HEARTBEAT_FILE;
                            unlink $MYSQL_FLATLINE_FILE;
                            $my_heart_is_beating = 0;
                    }
                    sleep 1;
            }
            $heartbeat_count++;
            if ( $heartbeat_count == $HEARTBEAT_CYCLE )
            {
                    $heartbeat_count = 0;
                    $st_flush_hosts->execute();
            }
    }
    
    $db->disconnect();
    

    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:

    nohup perl heartbeat.pl 6 100 &
    

    Seguem outros horários:

    nohup perl heartbeat.pl  6  50 & (heartbeat every  6 sec,FLUSH HOSTS every 5 minutes)
    nohup perl heartbeat.pl 10 360 & (heartbeat every 10 sec,FLUSH HOSTS every 1 hour)
    nohup perl heartbeat.pl 60 180 & (heartbeat every 60 sec,FLUSH HOSTS every 3 hours)
    

    Para parar o programa, execute isto:

    perl heartbeat.pl
    
    • 7

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve