MySQL主机因连接错误过多而被阻止

3

我们当前的生产服务器存在一个重大问题。我们在一台服务器上拥有一个MySQL数据库(Ubuntu 14.04和MySQL版本为5.5.57)。

我们有另外一台服务器,所有应用程序都在该服务器上访问第一台服务器上的数据库。现在已经出现了5天,在第二台服务器上我们不断收到以下错误:

05-09-2017 00:00:01 WARN com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@623841b8 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
    at sun.reflect.GeneratedConstructorAccessor32.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
    at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2395)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2316)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at sun.reflect.GeneratedConstructorAccessor19.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:347)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:146)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:195)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:184)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:200)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1086)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1810)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:648)
  Caused by: java.sql.SQLException: null,  message from server: "Host 'IP_ADDRESS' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'"
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1114)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2493)
    at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2334)

我们已经尝试了5天来解决这个问题,但每次重新启动mysql后,几个小时后错误就会再次出现。我们将max_connect_errors从10增加到50,但这只延长了错误的时间。
然后,我们还将日志级别调整为2,但错误日志中唯一看到的是中止的连接,没有“拒绝”的连接。
有没有办法可以查看实际的连接错误?请帮忙解决这个问题,我不知道该怎么解决。我们也没有DBA,所以只有一个开发团队,他们不是数据库专家。
编辑:该应用程序是一个Java maven应用程序,使用hibernate连接到数据库。这是hibernate配置文件:
<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.username">USERNAME_HERE</property>
    <property name="hibernate.connection.password">PASSWORD_HERE</property>
    <property name="hibernate.connection.url">jdbc:mysql://SERVER_HERE:3306/voda_soccer?zeroDateTimeBehavior=convertToNull</property>
    <property name="hibernate.connection.autoReconnect">true</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
    <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
    <property name="show_sql">false</property> 

    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.timeout">300</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="hibernate.c3p0.idle_test_period">3000</property>

    <mapping class="com.myapp.sms.producer.entity.Customer"></mapping>
    <mapping class="com.myapp.sms.producer.entity.Gifting"></mapping>
    <mapping class="com.myapp.sms.producer.entity.BulkCampaign"></mapping>
</session-factory>

我们总是在 finally 块中关闭连接:

} finally {
        if (session != null) {
            try {
                session.close();
            } catch (Exception e) {}
        }
        session = null;
    }

我知道我们可以刷新主机或重新启动MySQL,但我不能一直在生产服务器上这样做。我想找出为什么我们会遇到连接错误以及在哪里查看它们?


你是否关闭了你的连接? - Scary Wombat
参见https://dev59.com/h2Eh5IYBdhLWcg3wjEDn - Scary Wombat
我们总是在 finally 块中关闭连接 - 我们已经添加了这一点。 - lulu88
https://dba.stackexchange.com/a/32972 - yılmaz
为解决连接错误,您需要在my.ini文件(MySQL配置文件)中将变量max_connect_errors和max_connections的值设置得更高。如果max_connect_errors失败了10个请求,那么mysql会认为存在某些问题并阻止主机。您可以尝试执行flush-hosts,然后在my.ini文件中设置上述变量并重新启动MySQL。我使用Monyog来跟踪我的MySQL服务器(即使我是MySQL的初学者),它帮助我监控服务器变量,您也可以试试。 - user7562197
显示剩余3条评论
1个回答

1
似乎存在连接泄漏或者有长时间运行的查询导致其他代码段无法获取连接。
根据您使用的数据源工具(c3p0,hikari等),可以通过jmx(jsconsole,visual vm)监控您的池。
还可以使用Flexy Pool进行一些监控。
Mysql Workbench还提供了一些有用的工具,以获取更多关于负责操作的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接