AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 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

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

  • 772

我有一个两部分的问题:

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

    PDOException: SQLSTATE[HY000] [1129] Host `hostname` is blocked because of many connection errors; unblock with `mysqladmin flush-hosts`
    
  2. 增加时应该遵循什么指导方针max_connect_errors——我们的指导方针是 10?是否建议mysqladmin flush-hosts每天通过 cron 运行?

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

mysql mysql-5.5
  • 1 1 个回答
  • 12974 Views

1 个回答

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

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

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

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

    由于您使用的是 MySQL 5.5,因此最好的选择是在 MySQL 实例中创建一个计划事件,每 5 分钟触发一次,它只会做一件事:运行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>
    

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

    试试看 !!!

    更新 2011-08-25 11:22 EDT

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

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

    例如:运行以下命令:

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

    这是我调用 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();
    

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

    nohup perl heartbeat.pl 6 100 &
    

    以下是其他时间表:

    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)
    

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

    perl heartbeat.pl
    
    • 7

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve