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
- MySQL Global Error
에러번호가 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 …
- 버전과 스토리지 엔진에 종속적인 경우가 많음
- 에러 메시지를 에러 처리용으로 사용하는 것은 비추천
- MySQL 5.5.20
🟥 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
- MySQL(NDB)
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 23000
은 Integrity constraint violation
을 의미 합니다.
23505
는 Duplicate 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 에러의 경우, 반드시 같이 로깅!
참고
'데이터베이스 > 0 + MySQL' 카테고리의 다른 글
[MySQL] 쿼리 실행 구조 (0) | 2024.12.28 |
---|---|
[MySQL] Lateral Derived Table 활용하는 방법 (0) | 2024.12.24 |
[MySQL] Stored Function 에서 많이 하는 실수 방지하기 (0) | 2024.08.21 |
[MySQL] left join 아무생각 없이 사용하고 있는 것은 아니지? (0) | 2024.08.15 |
[MySQL] 페이징 쿼리 작성하기 (0) | 2024.07.21 |