피드로 돌아가기
Dev.toDatabase
원문 읽기
MySQL utf8mb3의 3바이트 한계 극복을 위한 utf8mb4 전면 전환 및 Index 최적화
Migrating a Magento 2 store from utf8 to utf8mb4 without losing data
AI 요약
Context
MySQL의 utf8(utf8mb3)이 최대 3바이트만 지원함에 따라 4바이트 문자인 Emoji 및 CJK 확장 문자가 저장될 때 데이터가 silent truncation 되는 결함 발생. Strict mode 미설정 시 에러 없이 데이터가 유실되는 치명적인 데이터 무결성 문제 직면.
Technical Solution
CONVERT TO CHARACTER SET utf8mb4를 통한 기존 테이블 데이터의 물리적 재작성 및 인코딩 변환 수행- Index 길이 제한(767 bytes) 해결을 위해 MySQL 5.7
innodb_large_prefix활성화 또는 8.0DYNAMICRow Format 적용으로 한도를 3072 bytes로 확장 - 767 bytes 제한 환경의 레거시 서버 대응을 위해 Indexed VARCHAR 컬럼 길이를 191자로 축소하여 4바이트 기준 최대 길이(191x4=764) 확보
my.cnf설정 변경 및 Application Connection Charset 동기화를 통한 End-to-End utf8mb4 통신 경로 구축- 대용량 테이블의 Lock 시간 최소화를 위해
pt-online-schema-change또는gh-ost기반의 Online Schema Change 전략 채택 - Join 쿼리 시 발생하는
Illegal mix of collations방지를 위해 전 스키마에utf8mb4_unicode_ci단일 Collation 적용
실천 포인트
- MySQL
5.7 이하 사용 시 Row Format이 DYNAMIC 또는 COMPRESSED인지 확인 - 단순 테이블 변환 외에 Server Default 및 Application Connection 설정 동기화 여부 검증 - Indexed Column의 최대 길이를 191자로 제한하여 인덱스 생성 오류 사전 방지 - 서비스 중단 최소화를 위해 Online Schema Change 도구 도입 검토 - 모든 테이블의 Collation을 동일한 값으로 통일하여 Join 시의 런타임 에러 방지