2017-09-05 1 views
2

nous avons actuellement un problème majeur sur notre serveur de production. Nous avons une base de données MySQL sur un serveur (Ubuntu 14.04 et MySQL version 5.5.57).MySQL Hôte est bloqué à cause de nombreuses erreurs de connexion

Nous avons un autre serveur avec toutes les applications parlant à la base de données sur le serveur un. Pendant 5 jours maintenant, nous continuons à obtenir cette erreur sur le deuxième serveur:

05-09-2017 00:00:01 WARN com[email protected]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) 

Nous avons essayé pendant 5 jours pour résoudre ce problème, mais chaque fois que nous remettons en marche mysql son quelques heures, puis l'erreur commence à nouveau. J'ai augmenté le max_connect_errors de 10 à 50, mais cela a prolongé l'erreur.

Ensuite, nous avons également ajusté le niveau de journalisation à 2, mais la seule chose que nous voyons jamais dans le journal des erreurs est des connexions avortées, pas de connexions «refusées».

Est-il possible de voir les erreurs de connexion réelles? S'il vous plaît aider à résoudre ce problème, je ne sais pas comment résoudre. Nous n'avons pas non plus de DBA, donc c'est juste une équipe de développeurs qui ne sont pas des experts en bases de données.

EDIT: L'application est une application Java maven, qui utilise hibernate pour se connecter à la base de données. Voici le fichier de configuration de mise en veille prolongée:

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

Nous avons toujours des liens étroits dans un bloc finally:

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

Je sais que nous pouvons débusquer les hôtes ou redémarrer MySQL, mais je ne peux pas le faire tout le temps dans le serveur de production. Je veux savoir pourquoi nous obtenons les erreurs de connexion et où les voir?

+0

Fermez-vous vos connexions? –

+0

Partagez-vous votre objet Connection entre plusieurs threads, ces objets ne sont pas sûrs pour les threads – Ferrybig

+0

voir aussi https://stackoverflow.com/questions/22285318/how-to-unblock-with-mysqladmin-flush-hosts –

Répondre

0

Il semble qu'il y ait une fuite de connexion ou que vous ayez des requêtes longues qui empêchent les autres segments de code d'acquérir une connexion. Selon l'outil de source de données (c3p0, hikari, etc.) que vous utilisez, vous pouvez surveiller votre pool via jmx (jsconsole, visual vm). Vous pouvez également utiliser Flexy Pool pour effectuer une surveillance. Mysql workbench fournit également quelques outils utiles pour obtenir plus d'informations sur l'action qui est responsable.