문제 요약
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 이 결합됨 | |
해당 구조에서 signal 11이 보고된 이슈 다수 존재 | |
sort_buffer_size 기본값 초과로 충돌 유발 | |
읽기 전용 인스턴스에서 임시 테이블 처리 제한 | |
여러 동일 쿼리 동시 실행 시 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 에서 문제 시간대 쿼리 추적