데이터베이스/0 + MySQL

[MySQL] Error Handling

힘들면힘을내는쿼카 2024. 12. 28. 13:20
728x90
반응형

 

DB를 사용하다가 에러가 발생한 경험은 서버 개발자라면 무조건 있을 것 같은데요.

바로 DBA에게 해당 사실을 공유하거나, 담당 개발자를 부른 경험이 있을까요?

 

서버 연결이 안돼요~~

쿼리 에러 났어요~~

 

그런데, 담당자가 부재중이거나 다른 업무로 바쁘다면…?! ㅠㅠ

최소한 어떤 에러가 발생했고, 어떻게 하면 에러를 핸들링 할 수있을지 알아 봅시다!

 

MySQL 에러 구분

  • Global Error
    • server-side 와 client-side 공용으로 발생
  • Server Error
    • server-side 에서만 발생
    • ERROR 1146 (42S02): Table ‘test.no_such_table’ doesn’t exist
    • 일부 Server Error는 client-side 로 전달 됩니다.
  • Client Error
    • client-side 에서만 발생
    • ERROR 2005 (HY000): Unkown MySQL server host ‘no-such-host’

 

MySQL ERROR Format

3개의 파트로 구성 됩니다.

  • Error No
  • SQLState
  • Error Message

 

Error No

  • 4자리 정수
    • 최근에는 6자리 정수를 이용한 문자열 형태도 추가됨
  • MySQL 에서만 유효한 정보
  • 에러 번호의 구분
    • MySQL Global Error
      • 1 ~ 999
    • MySQL Server Error
      • 1000 ~ 1999
      • 3000 ~
      • MY-01000 ~
    • MySQL Client(or Connector) Error
      • 2000 ~ 2999

에러번호가 2005 라서 Client Error임을 확인할 수 있습니다!

  • ERROR 2005 (HY000): Unkown MySQL server host ‘no-such-host’

 

참고

3500 이후 대역과 MY-010000 이후 대역은 MySQL 8.0 이후에 추가 되었습니다.

 

SQL State

  • 5글자 영문 숫자로 구성
  • ANSI-SQL 에서 제정한 Vendor 비 의존적 에러 코드
  • SQL-STATE는 2파트로 구분
    • 앞 두글자: 상태값의 분류
      • 00: 정상
      • 01: 경고
      • 02: 레코드 없음
      • HY: ANSI-SQL에서 아직 표준 분류를 하지 않은 상태(Vendor 의존적 상태 값)
      • 그외 모두 에러
    • 뒷 세 글자: 주로 숫자 값(영문도 존재함), 각 분류별 상세 에러 코드 값

 

에러번호가 HY로 시작해서 ANSI-SQL에서 아직 표준 분류를 하지 않은 상태라는 것을 알수 있습니다.

  • ERROR 2005 (HY000): Unkown MySQL server host ‘no-such-host’

 

Error Message

  • 사람이 인식할 수 있는 문자열
  • 버전 간 호환이 유지되지 않는 경우가 많고 변경되는 경우가 존재

Unkown MySQL server host ‘no-such-host’ 라고 표기된 것을 확인할 수 있습니다.

  • ERROR 2005 (HY000): Unkown MySQL server host ‘no-such-host’

 

Error Handling

이제 MySQL 에러를 처리하는 방법에 대해서 알아봅시다~!

🟥 Error Message(부적합)

  • ERROR 1366 (HY000) 에러를 처리한다고 했을 때를 가정해 봅시다.
  • MySQL 서버 버전별로 다른 메시지를 갖고 있다!
    • MySQL 5.5.20
      • Incorrect string value: ‘\xF0\x9F\x92\x90’ for column …
    • MySQL 5.5.23
      • Data truncation: Incorrect string value: ‘\xF0\x9F\x92\x90’ for column …
    • 버전과 스토리지 엔진에 종속적인 경우가 많음
    • 에러 메시지를 에러 처리용으로 사용하는 것은 비추천

 

🟥 Error No(부적합)

  • Error No 를 비교해서 처리할 경우
    • MySQL(NDB)
      • Error: 1022 : Can’t write; duplicate key in table ‘%s’
    • MySQL(InnoDB, MyISAM)
      • Error: 1069: Duplicate entry '%s' for key %d
    • MySQL(NDB, Unique Constraint)
      • Error: 1169 : Can’t write, because of unique constraint

 

Error No은 MySQL 스토리지 엔진에 종속적인 경우가 많습니다.

따라서 Error No 로 에러를 처리하는 것은 적합하지 않습니다.

 

🟩 SQL State(적합)

동일 에러에 대해서, 다양한 에러번호와 다양한 에러 메시지가 존재한다는 것을 확인 했습니다.

하지만, SQL State는 항상 동일합니다.

동일한 에러

  • ERROR 1022 SQLSTATE: 23000 (ER_DUP_KEY)
  • ERROR 1062 SQLSTATE: 23000 (ER_DUP_ENTRY)
  • ERROR 1169 SQLSTATE: 23000 (ER_DUP_UNIQUE)

 

MySQL 서버의 스토리지 엔진간의 호환성을 제공 합니다.

추가로 다른 Vendor DBMS 와의 호환성도 제공 합니다.

다만, DBMS 별로 해석의 차이는 조금 존재할 수 있습니다.

 

ANSI 표준에서 SQL State 23000Integrity constraint violation을 의미 합니다.

23505Duplicate key violation 이라고 정의 되어 있습니다.

  • Oracle
    • SQLSTATE = 23000 ORA-00001: unique constraint (…) violated
  • MSSQL
    • Duplicate key in object [SQLSTATE 23000] (Error 2627)
  • PostgreSQL
    • SQL state: 23505 duplicate key value violates unique constraint …

 

Oracle, MSSQL는 조금 더 넓은 범위의 23000 을 사용했고, PostgreSQL은 더 정확한 의미로 23505 를 사용한 것을 확인할 수 있습니다.

SQL State 값이 모든 DBMS는 아니더라도 많은 DBMS 서버들에서 호환되는 것을 확인할 수 있습니다!

따라서, 에러 처리에서는 SQL State가 가장 적합한 것을 알 수 있습니다~!

 

 

그런데…..

SQL State가 HY 문자열로 시작하는 경우가 있습니다..

  • ERROR 1366 SQLSTATE: HY000 Incorrect string value
  • ERROR 1366 SQLSTATE: 22001 Incorrect string value

 

SQL State 값의 카테고리가 HY (미분류 상태)인 경우

버전 업그레이드시, 새로운 카테고리의 SQL State로 변경될 가능성이 있습니다. 🥲

따라서 HY 인 경우, Erorr No를 이용해서 처리 하는 것을 권장 합니다. 👍

 

ERROR 가 발생 했을 때 행동강령

MySQL 서버에서 발생할 수 있는 에러는 매우 다양합니다!

그냥 바로 서버 연결이 안됩니다!, 쿼리 에러 발생 했어요! 같이 이야기 하면 담당자는 에러의 원인을 특정하기 어렵고, 트러블 슈팅 하는데 많은 시간을 소요하게 됩니다.

 

DBA와 개발자간 가장 좋은 대화 방법은 SQL 문장과 Error 정보를 공유하는 것 입니다!

  • Error No, SQL State, Error Message

 

응용 프로그램에서 권장 사항

  • DBMS Server Error 를 무시하는 예외 처리는 비추천
  • ORM 사용시 DBMS 에러와 응용프로그램 에러를 구분
  • DBMS 에러의 경우, 반드시 같이 로깅!

 

참고

 

Real MySQL 시즌 1 - Part 1 강의 | 이성욱 - 인프런

이성욱 | MySQL의 핵심적인 기능들을 살펴보고, 실무에 효과적으로 활용하는 방법을 배울 수 있습니다. 또한, 오랫동안 관성적으로 사용하며 무심코 지나쳤던 중요한 부분들을 새롭게 이해하고,

www.inflearn.com

 

 

 

728x90
반응형