본문 바로가기

MySQL

MySQL Aborted connection error

mysql 서버를 사용하다보면 error log에 아래의 [Note]성 오류 메세지가 쌓이는 것을 확인할 수 있다.

 

2023-02-03T20:37:56.060168Z 2176 [Note] [MY-010914] [Server] Aborted connection 2176 to db: 'information_schema' user: 'admin' host: '172.16.250.97' (Got an error reading communication packets). (sql_connect.cc:835)
2023-02-03T20:39:03.160983Z 2177 [Note] [MY-010914] [Server] Aborted connection 2177 to db: 'information_schema' user: 'admin' host: '172.16.250.97' (Got an error reading communication packets). (sql_connect.cc:835)
2023-02-03T20:40:09.189528Z 2179 [Note] [MY-010914] [Server] Aborted connection 2179 to db: 'information_schema' user: 'admin' host: '172.16.250.97' (Got an error reading communication packets). (sql_connect.cc:835)
2023-02-03T20:40:26.476323Z 2180 [Note] [MY-010914] [Server] Aborted connection 2180 to db: 'information_schema' user: 'admin' host: '172.16.250.97' (Got an error reading communication packets). (sql_connect.cc:835)
2023-02-03T20:46:59.901845Z 2182 [Note] [MY-010914] [Server] Aborted connection 2182 to db: 'information_schema' user: 'admin' host: '172.16.250.97' (Got an error reading communication packets). (sql_connect.cc:835)
2023-02-03T20:56:23.539765Z 2188 [Note] [MY-010914] [Server] Aborted connection 2188 to db: 'information_schema' user: 'admin' host: '172.16.250.97' (Got an error reading communication packets). (sql_connect.cc:835)
2023-02-03T20:56:25.966958Z 2189 [Note] [MY-010914] [Server] Aborted connection 2189 to db: 'information_schema' user: 'admin' host: '172.16.250.97' (Got an error reading communication packets). (sql_connect.cc:835)

 

이 오류 메세지의 경우 DB 커넥션을 open하고 쿼리 수행 후에 커넥션 close()를 하지 않았을 경우 발생하는 오류이다. 즉 커넥션을 통해 핸들러를 획득하고 필요한 작업을 수행 후 이를 서버에 반납하지 않았을 때 발생하는 오류인 것이다.

아래는 Aurora MySQL에 쿼리를 요청하는 파이썬 코드로, 코드 가장 마지막에 보면 aurora.close()라는 코드가 작성되어 있는 것을 볼 수 있다. 커넥션을 open하고 작업을 수행한 후에는 이렇게 close()를 해줌으로써 필요한 자원을 다 사용했다는 표시(release)를 DB 서버에 알려주어야 한다.

 

if __name__=="__main__":
    auroradb = pymysql.connect(
            host=_dbEndpoint,
            user=_dbId,
            password=_dbPw,
            database="information_schema",
            charset='utf8mb4',
            port=3306
            )
    auroraClient=auroradb.cursor()

    auroraClient.execute(_query)

    for i in auroraClient.fetchall():
        print(i)

    auroradb.close()

 

대부분의 개발자분들이 드라이버 코드에 close를 하지 않고 사용하기 때문에 아마 의미 없는 오류 로그가 계속 쌓이고 있을 수도 있다.

이 오류를 수정해야 하는 이유는, 나는 크게 2가지 라고 생각되는데 첫 번째는 기록되지 않아도 되는 오류가 불필요하게 로그에 쌓임으로써 스토리지 공간 낭비를 불러오기 때문이다. 더불어 오류 로그가 여러 파일로 분할되어 있는 경우 실제로 필요한 로그를 찾을 때 어느 파일에 오류가 기록되었는지 찾아야 하는 작지만 큰 불편함이 발생한다. 두 번째는 paas 환경에서 MySQL을 사용하는 경우 여러 크리티컬한 오류의 가능성을 최소화할 수 있기 때문이다. 특히나 Aurora MySQL에서는 더욱 그러한데, 사용자 입장에서 인터널하게 확인할 수 있는 가시 범위가 제한되어 있기 때문에 이 사소한 오류가 또 다른 오류에 어떤 영향을 미칠지 알 수 없다는 것이다. 크리티컬한 오류의 가능성을 최소화하기 위해서라도 사용자가 수정할 수 있는 오류는 수정되어야 하는 것이 맞다고 생각한다.

DBA가 별도 모니터링을 위한 스크립트로 DB에 접근한다거나, 다른 목적으로 드라이버를 통해 DB에 접근하지 않는데도 이런 오류가 발생하고 있다면 대부분 서비스 계정으로 접근하는 응용 프로그램의 코드 문제일테니 개발자분들에게 적절한 가이드를 해주는 것이 좋을 것 같다.