ES /docs

Failed to create event: Mysql2::Error: Data too long for column 'sys' at row 1

Fix Plan: events.sys 컬럼 용량 부족으로 인한 share event 저장 실패

Background#

PUT /api/v1/facilities/:key/share 호출 시 Event 레코드 저장에서 events.sys 컬럼이 MySQL TEXT(65535 byte) 한계를 초과해 Mysql2::Error: Data too long for column 'sys' at row 1이 발생, share API가 400으로 실패한다. RCA의 "즉시 조치 (Critical)" 항목 중 근본 수정안만 본 plan에 반영한다.

Changes#

tesla: db/migrate/{timestamp}_change_events_sys_to_mediumtext.rb (신규)#

  • What: events.sys 컬럼을 :text(TEXT, 65535 byte)에서 MEDIUMTEXT(:text + limit: 16.megabytes - 1)로 확장하는 신규 ActiveRecord 마이그레이션 파일을 추가한다.
  • Why: RCA Root Cause Summary에서 확인된 직접적 원인. events.sys가 TEXT 한계여서 share 대상 사용자/그룹이 많은 facility에서 직렬화 페이로드가 한계를 초과해 Mysql2::Error: Data too long을 일으킨다. MEDIUMTEXT(16 MB)로 확장하면 현재 보고된 페이로드 크기와 향후 증가 마진을 모두 수용할 수 있다.
  • Pattern: 직전 동일 패턴 마이그레이션(db/migrate/20260529075321_change_bims_meta_to_mediumtext.rb)을 그대로 따른다 — change_column :events, :sys, :text, limit: 16.megabytes - 1(up) / change_column :events, :sys, :text(down).
  • Lines: 신규 파일 약 9 라인.

Scope Notes (의도적으로 제외)#

다음 항목들은 user가 선택한 "즉시 조치 (Critical)" 범위 밖이므로 본 plan에서 제외:

  • "단기 완화" (EventFactory truncation 방어 코드): RCA에서 명시적으로 "동작 변화가 있으므로 영구 해법은 아니며 H1 수정과 함께 제거" — 본 마이그레이션이 영구 해법이므로 불필요.
  • 단기 개선 1주 이내 (event_object_data 화이트리스트화, 85개 테이블 일괄 확장): 별도 작업으로 분리.
  • 장기 개선 (외부 객체 저장소 이전, schema linter): 별도 작업으로 분리.

Acceptance Criteria#

  • db/migrate/change_events_sys_to_mediumtext.rb로 끝나는 신규 마이그레이션 파일이 1개 존재.
  • 마이그레이션 파일의 upchange_column :events, :sys, :text, limit: 16.megabytes - 1 호출을 포함.
  • 마이그레이션 파일의 downchange_column :events, :sys, :text 호출을 포함(롤백 가능).
  • 마이그레이션 클래스가 ActiveRecord::Migration[7.2]을 상속(레퍼런스 마이그레이션과 동일한 Rails 버전).
  • 다른 파일(스키마, 모델, 컨트롤러 등) 변경 없음.

Tests#

  • 기존 테스트: 변경된 파일이 마이그레이션 단일 파일이라 직접 대응되는 RSpec spec 없음(tesla migration은 spec 미보유 관행).
  • 신규 테스트: 추가하지 않음 — 마이그레이션 단순 컬럼 타입 변경. 검증은 운영 ALTER 시점에 events.sys 컬럼 타입이 MEDIUMTEXT로 변경되었는지 SHOW CREATE TABLE events로 확인.

Deployment Note#

운영 배포 시 events 테이블 크기가 큰 경우 ALTER가 길어질 수 있다. RCA에서 권고한 대로 온라인 DDL(ALGORITHM=INPLACE, LOCK=NONE) 가능 여부를 DBA가 사전 점검 후 배포한다. 본 PR은 마이그레이션 파일 자체만 제공하며, 운영 적용 전략은 PR 리뷰에서 별도 합의한다.