728x90
이슈
mariadb.InterfaceError: Lost connection to MySQL server during query
MariaDB와 SQLalchemy를 사용하는 중에 요청 할 때마다 간헐적으로 계속 끊기는 현상이 발생한 오류입니다.
문제해결
알려지기로는 다음과 같은데요
“해당 오류는 Mysql과 MariaDB에서 발생하는 에러로 장기간 비활성시 발생하는 에러이다.”
저는 당최 예측할 수 없었습니다. 왜냐.....
저의 경우 이게 계속 끊기면 아! 이거다 하고 논리적으로 풀어나가 보겠는데,
- 어느 순간에는 DB 요청 할 때마다 계속 끊겼다가
- 어느 순간에는 한번만 끊겼다가
- 어느 순간에는 끊기지 않는
전혀 예상하지 못하겠는 참 이상한 현상이었습니다
한 가지 찝찝한 것은 저의 경우 방화벽 활성화 하기 전에는 발생하지 않았던 오류였고, 방화벽을 활성화 시킨 후부터 위 에러가 계속 생겼습니다.
어떻게 우연이 딱 겹친 것 일수도 있겠지만 방화벽 때문이 아닌가? 했는데 딱히 방화벽의 문제를 찾진 못했습니다
문제를 찾는 중에
Mysql 솔루션에 대해서
“Wait time”을 늘려라가 가장 많았습니다.
다만 위 방법은 추천하지 않았습니다.
Flask의 공식문서에는 다음과 같이 작성되어 있습니다.
https://flask-sqlalchemy.palletsprojects.com/en/2.x/config/
SQLAlchemy 에서도 해결이 가능한지 찾아 봤는데
다행히 해결 방법이 있었습니다.
SQLAlchemy는 Disconnect Handling 으로 연결에 대한 테스트를 할 수 있는 Pool.pre_ping
을 통해 해결할 수 있다고 합니다.
https://docs.sqlalchemy.org/en/14/core/pooling.html
SQLAlchemy create_engine으로 작성하셨을 경우 pool_pre_ping=True 를 바로 작성하시면 될 것 같습니다.
저는 Flask를 사용해서 다음과 같이 솔루션을 적용했습니다.
Config.py 파일에 다음과 같이 추가해주시면 되겠습니다.
- 우선 Pre_ping은 추가해주시고, 나머지는 필요하다 판단되시면 넣어주세요.
SQLALCHEMY_POOL_RECYCLE = 35 # 풀의 자동으로 재활용 되는 시간
SQLALCHEMY_POOL_TIMEOUT = 7 # 풀에 대한 연결 시간 초과를 초 단위로 지정
SQLALCHEMY_PRE_PING = True
SQLALCHEMY_ENGINE_OPTIONS = {'pool_recycle': SQLALCHEMY_POOL_RECYCLE, 'pool_timeout': SQLALCHEMY_POOL_TIMEOUT, 'pool_pre_ping': SQLALCHEMY_PRE_PING}
SQLALCHEMY_TRACK_MODIFICATIONS = False
위 솔루션을 통해 해결되었습니다.
이상입니다.
728x90
'Programming > Backend' 카테고리의 다른 글
2.Flask MVC 패턴 환경 구축과 Blueprint (0) | 2022.04.22 |
---|---|
1.Flask 웹 서버 구축 시작 (0) | 2022.04.20 |
Spring Request 데이터를 List 형태로 받으면 @Valid 체크가 안되는 현상 해결 방법 (1) | 2021.12.04 |
협업을 위한 snake_case -> camelCase 변환 방법 @JsonNaming, @JsonProperty (0) | 2021.11.22 |
객체 지향, 오브젝트와 의존 관계의 이해 (0) | 2021.10.09 |