Aurora MySQL에서 복잡한 JSON 서브쿼리로 인한 Signal 11 Crash 원인 분석 및 대응법

✅ 문제 요약

AWS RDS에서 운영 중인 Aurora MySQL 8.0.28 기반의 인스턴스에서 특정 복잡 쿼리 실행 중 signal 11 (Segmentation Fault) 이 발생하여 인스턴스가 재시작되었습니다.


✅ 문제 쿼리 구조 (샘플 변환)

SELECT m.user_id,
IFNULL(SUM(IF((
SELECT IFNULL((LENGTH(log.json_column) - LENGTH(REPLACE(log.json_column, 'sampleKey', '')) / 15), 0)
FROM user_log log
WHERE log.user_id = m.user_id
AND log.type = 'ACTION'
ORDER BY log.received_time
LIMIT 1
) > 0, 1, 0)), 0) AS action_count
FROM users m
GROUP BY m.user_id;

✅ Crash 백트레이스 주요 로그

  • SortFileIterator::Read()
  • Item_subselect::exec()
  • Item_func_if::val_decimal()
  • AggregateIterator::Read()
  • signal 11 (Segmentation Fault)

✅ 기타 관련 로그 요약

  • Got an error reading communication packets → crash 직후 발생한 RDS 내부 관리계정(rdsadmin)의 커넥션 종료
  • Out of sort memory → 정렬 버퍼 부족 경고
  • The server is running with the --read-only option → 읽기 전용 노드에서 slow log 기록 실패

✅ 분석 결론

가능 원인설명
🔴 복잡한 상관 서브쿼리JSON 문자열 분석 + ORDER BY + LIMIT 1 이 결합됨
🟠 MySQL 버그 가능성해당 구조에서 signal 11이 보고된 이슈 다수 존재
🟠 정렬 버퍼 부족sort_buffer_size 기본값 초과로 충돌 유발
🟡 Read replica 제한읽기 전용 인스턴스에서 임시 테이블 처리 제한
🟡 동시성 경합여러 동일 쿼리 동시 실행 시 internal 상태 꼬임 가능성

✅ 조치 및 대응 전략

  • 쿼리 리팩토링: 상관 서브쿼리 제거 → JOIN + GROUP BY 방식 전환
  • 정렬 버퍼 튜닝: sort_buffer_size, tmp_table_size 증가
  • 쿼리 실행 위치 제한: read replica가 아닌 primary에서 실행
  • 위험 쿼리 탐지 및 로깅: thread ID 기반 로그 연동
  • Aurora 엔진 버전 업그레이드 고려 (bug fix 포함 가능성 있음)

✅ 쿼리 실행 주체 IP 추적 방법

현재 로그에서는 아래 정보만 제공됨:

Connection ID: 1711885
Query: ...

IP를 확인하려면 다음 중 하나 필요:

  • CloudWatch에 연동된 general log 또는 audit log에서 thread_id 검색
  • Performance Insights 에서 문제 시간대 쿼리 추적

관련 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다