최근에 MariaDB를 사용하는 시스템의 DB 업그레이드 작업이 있었다. 업그레이드 작업이 끝난 후에 MQ 가 정상적으로 되고 있는지 모니터링을 진행한 후 에러없이 작동한다고 판단하고 모니터링을 종료하였다.
업그레이드 작업이 끝나고 2주정도 지났는데 해당 서버 담당자한테 데이터가 I/F가 되지않는다는 연락을 받고 확인해보니
해당 테이블에서 에러가 발생하고 있었고, 해당 내용을 수정한 내용을 적고자 한다.
DB 업그레이드를 하기 전에는 정상적으로 데이터의 송수신이 이루어지고 있었는데, DB 업그레이드 이후 에러가 발생한 이유를 살펴보기 위하여 소스를 살펴보았다.
보통 Date은 형변환을 하기 때문에 STR_TO_DATE() 메서드를 사용해서 Insert를 한다. 그래서 형변환 메서드는 자주 목격할 수 있는 메서드 중 하나이다.
에러가 발생한 소스를 확인해보니 IFNULL() 와 NULLIF()이 이중으로 된 기괴한 모습을 하고 있었다.
IFNULL() 와 NULLIF() 메서드에 대해 하나씩 설명을 해보자면,
IFNULL(A , B)
→ A가 Null이 아니면 A를 반환, A가 Null이면 B를 반환
NULLIF(A , B )
→ A와 B가 같으면 Null을 반환, A와 B가 다르면 A를 반환
두 메서드를 IFNULL( NULLIF(A , B) , B ) 형태로 이전에 개발을 한 탓에 분석하기가 까다로웠다.
하지만, 에러 내용을 바탕으로 분석을 진행하였고, Decimal 타입의 컬럼이 원인임을 알 수 있었다.
Decimal 타입의 컬럼은 Not Null 조건이 설정되어 있었기 때문에 위 메서드를 조합하여 사용한 것을 분석했다.
굳이 '두 메서드를 조합해서 사용을 해야하나' 라는 의문이 들었다.
[ 수정 내용 ]
IFNULL( NULLIF(A , B) , B ) → NULLIF( A , B )
그래서 위처럼 두 개의 메서드를 사용하는 게 아닌 하나의 메서드만 사용하도록 수정하여, 들어가지 못한 데이터를 다시 넣어주었더니 정상적으로 데이터를 수신하였다.
'DataBase' 카테고리의 다른 글
[Oracle] ORA-01008 : not all variables bound (0) | 2023.02.13 |
---|---|
[DataBase] 기본 키를 여러 개 설정한다고?? (2) | 2022.09.29 |
[DataBase] 정규화에 대해 알아보자! (0) | 2022.07.21 |
[DataBase] RDBMS VS NoSQL (0) | 2022.07.08 |
[DataBase] Join을 왜 써야 하지?(+ Join 종류) (0) | 2022.07.07 |