我有一个两部分的问题:
如果出现此错误,有没有办法查看主机是否接近被阻止?并发出警报?
PDOException: SQLSTATE[HY000] [1129] Host `hostname` is blocked because of many connection errors; unblock with `mysqladmin flush-hosts`
Run Code Online (Sandbox Code Playgroud)在增加时应该遵循什么准则max_connect_errors——我们的准则是 10?是否建议mysqladmin flush-hosts通过 cron 每天运行?
在 Red Hat 6 上运行 MySQL 5.5.13(企业)。
实际上,您应该将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)
| 归档时间: |
|
| 查看次数: |
12558 次 |
| 最近记录: |