바이너리 로그의 핵심 역할
바이너리 로그는 MySQL 서버의 모든 데이터 변경 작업(INSERT, UPDATE, DELETE, DDL)을 기록하는 이진 형식의 로그 파일입니다. 주요 목적은 두 가지입니다: (1) 레플리케이션 소스 서버의 바이너리 로그는 변경 사항을 레플리카로 전송하여 동일한 데이터 상태를 유지하게 하고, (2) 백업 복구 후 바이너리 로그의 이벤트를 재실행하여 특정 시점의 데이터 상태를 복구합니다.
로깅 포맷과 선택 기준
바이너리 로그는 3가지 포맷을 지원합니다. 문장 기반 로깅(Statement-based)은 SQL 문 자체를 기록하며 로그 크기는 작지만 비결정적 함수 처리 시 이슈가 발생할 수 있습니다. 행 기반 로깅(Row-based)은 각 테이블 행의 변경을 개별적으로 기록하여 모든 경우에 정확하며 MySQL 8.4의 기본값입니다. 혼합 모드(Mixed)는 기본적으로 문장 기반을 사용하되 필요시 자동으로 행 기반으로 전환됩니다.
파일 구조와 트랜잭션 처리
바이너리 로그 파일은 기본 이름에 숫자 확장자를 붙여 순차적으로 생성되며(binlog.000001, binlog.000002), 서버 시작, 로그 플러시, 또는 파일 크기 제한 도달 시 새로운 파일이 생성됩니다. 트랜잭션 테이블의 변경은 COMMIT 시점에 전체 트랜잭션이 한 단위로 바이너리 로그에 기록되어 일관성을 보장하며, binlog_cache_size를 초과하면 임시 파일이 사용됩니다.
실무상 주의사항
바이너리 로그가 활성화되면 성능이 약간 저하되지만 레플리케이션과 복구 능력의 이점이 이를 상쇄합니다. sync_binlog=1(기본값)은 매 커밋마다 디스크 동기화를 보장하여 데이터 안정성을 극대화합니다. log_replica_updates를 활성화하면 레플리카도 자신의 바이너리 로그에 변경을 기록하여 다단계 레플리케이션 구조를 지원합니다.