在 MySQL 中,您如何判断哪个主机接近被阻止?

KM.*_*KM. 4 mysql mysql-5.5

我有一个两部分的问题:

  1. 如果出现此错误,有没有办法查看主机是否接近被阻止?并发出警报?

    PDOException: SQLSTATE[HY000] [1129] Host `hostname` is blocked because of many connection errors; unblock with `mysqladmin flush-hosts`
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在增加时应该遵循什么准则max_connect_errors——我们的准则是 10?是否建议mysqladmin flush-hosts通过 cron 每天运行?

在 Red Hat 6 上运行 MySQL 5.5.13(企业)。

Rol*_*DBA 7

实际上,您应该将max_connect_errors提高到超过默认值 10。

范围是 1-18446744073709547520。我现在将其设置为 1000。

然而,你有一个更大的问题。mysqladmin要求您在执行任何操作之前连接到 mysqld。如果max_connect_errors达到太快,则此时您无法让mysqladmin执行任何操作。在这方面,即使是 cron 作业也会失败。

由于您使用的是 MySQL 5.5,因此最好的选择是在 MySQL 实例中创建一个计划事件,每 5 分钟触发一次,该事件只会做一件事: run FLUSH HOSTS

我刚刚在我的 PC 上的 MySQL 5.5.12 中做了这个

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>
Run Code Online (Sandbox Code Playgroud)

太好了,没有来自 mysqld 的抱怨。当然,我随意选择了5分钟。您可以选择您喜欢的任何时间表。

试一试 !!!

更新 2011-08-25 11:22 EDT

对于使用 MySQL 5.1 之前版本的每个人,我有一个有价值的建议:

编写一个 perl 脚本来保持打开的连接,通过检索某些内容(即正常运行时间、aborted_connects 等)并每 10 分钟踢出 FLUSH HOSTS 使其心跳。无论您以何种用户身份连接,请确保其具有 RELOAD 权限。

例如:运行此命令:

GRANT RELOAD on *.* to 'whateveruser'@'localhost' identified by 'whateverpassword';
Run Code Online (Sandbox Code Playgroud)

这是我调用 heartbeat.pl 使用该用户和密码执行此操作的 perl 脚本:

#!/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();
Run Code Online (Sandbox Code Playgroud)

在操作系统中,每 6 秒调用一次 perl 脚本心跳。当它心跳 100 次时,即 600 秒(10 分钟),让它运行FLUSH HOSTS。像这样调用它:

nohup perl heartbeat.pl 6 100 &
Run Code Online (Sandbox Code Playgroud)

以下是其他时间表:

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)
Run Code Online (Sandbox Code Playgroud)

要停止该程序,请运行以下命令:

perl heartbeat.pl
Run Code Online (Sandbox Code Playgroud)