2017-09-05 7 views
2

현재 프로덕션 서버에서 중요한 문제가 있습니다. 우리는 한 서버 (Ubuntu 14.04 및 MySQL 버전 5.5.57)에 MySQL DB를 가지고 있습니다.많은 연결 오류로 인해 MySQL 호스트가 차단되었습니다.

우리는 모든 응용 프로그램이 서버 1의 데이터베이스와 통신하는 다른 서버를 가지고 있습니다. 지금 우리는 두 번째 서버에서이 오류가 계속 오일의 경우 :

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) 

우리는이 문제를 해결하기 위해 5 일간 시도하고있다, 그러나 우리는 그에게 몇 시간에는 mysql 다시 시작할 때마다 다음 오류가 다시 시작됩니다. 나는 max_connect_errors를 10에서 50으로 올렸지 만 그것은 단지 오류를 연장시켰다.

또한 로그 수준을 2로 조정했지만 오류 로그에 표시되는 것은 연결이 중단되고 연결이 거부 된 것입니다.

실제 연결 오류를 볼 수있는 방법이 있습니까? 이 문제를 해결하는 데 도움주세요, 해결 방법을 모르겠습니다. 또한 DBA가 없기 때문에 데이터베이스 전문가가 아닌 개발자 팀이 있습니다.

EDIT : 응용 프로그램은 최대 절전 모드를 사용하여 데이터베이스에 연결하는 Java maven 응용 프로그램입니다. 여기에 최대 절전 모드 설정 파일은 다음과 같습니다

<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의 호스트를 세척하거나 다시 시작할 수 있습니다 알고 있지만, 나는이 작업을 수행 할 수 없습니다 프로덕션 서버에서 항상. 왜 연결 오류가 발생했는지, 어디서 볼 수 있는지 알고 싶습니다.

+0

연결을 종료 하시겠습니까? –

+0

여러 스레드간에 Connection 객체를 공유하고 있습니까?이 객체는 스레드로부터 안전하지 않습니다. – Ferrybig

+0

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

답변

0

연결 누수가 있거나 다른 코드 세그먼트가 연결을 못하게하는 장기 실행 쿼리가있는 것 같습니다.

사용하는 데이터 소스 도구 (c3p0, hikari 등)에 따라 jmx (jsconsole, visual vm)를 통해 풀을 모니터링 할 수 있습니다.

또한 Flexy Pool을 사용하여 모니터링을 수행 할 수 있습니다.

또한 Mysql Workbench는 책임있는 작업에 대한 자세한 정보를 얻기 위해 몇 가지 유용한 도구를 제공합니다.

관련 문제