MySQL 5.7에서 Binlog 로그 활성화 및 분석 방법

Binlog 상태 확인

MySQL 5.7 환경에서 이진 로그(Binary Log, binlog)를 사용하려면 먼저 현재 설정 상태를 확인해야 합니다. 다음 SQL 명령을 실행하여 binlog가 활성화되었는지 확인합니다.

SHOW GLOBAL VARIABLES LIKE 'log_bin';

결과 값이 OFF인 경우 binlog가 비활성화된 것이므로 구성 파일을 수정해 수동으로 활성화해야 합니다.

my.ini 파일 수정을 통한 Binlog 활성화

Windows 기반 MySQL 설치에서는 my.ini 파일에 설정을 추가합니다. 일반적으로 이 파일은 MySQL 설치 디렉터리 또는 C:\ProgramData\MySQL\MySQL Server 5.7\ 경로에 위치합니다.

다음 항목을 [mysqld] 섹션 아래에 추가합니다.

[mysqld]
log-bin="C:/ProgramData/MySQL/MySQL Server 5.7/logs/bin-log"

참고: 지정된 로그 경로 C:/ProgramData/MySQL/MySQL Server 5.7/logs 는 사전에 반드시 폴더를 생성해 두어야 합니다. 그렇지 않으면 MySQL 서비스 시작 시 오류가 발생할 수 있습니다.

생성된 Binlog 파일 확인

설정 후 MySQL 서버를 재시작하면 지정된 디렉터리에 bin-log.000001, bin-log.000002 등의 형식으로 로그 파일이 생성됩니다. 현재 존재하는 binlog 파일 목록은 다음 쿼리로 조회할 수 있습니다.

SHOW BINARY LOGS;

mysqlbinlog 도구를 이용한 로그 분석

binlog는 바이너리 형식이므로 직접 읽을 수 없으며, MySQL 제공 유틸리티 mysqlbinlog 를 사용해 텍스트 형식으로 변환해야 합니다. 이 명령은 MySQL 클라이언트 내부이 아니라 운영체제의 커맨드 라인(예: Windows CMD 또는 PowerShell)에서 실행해야 합니다.

특정 데이터베이스의 특정 시간 범위 내 변경 내용을 추출하는 예시:

mysqlbinlog --no-defaults --base64-output=decode-rows -v \
--database="ezhizao_yzbh_ggy" \
--start-datetime="2024-12-04 11:10:00" \
--stop-datetime="2025-07-17 12:00:00" \
"C:/ProgramData/MySQL/MySQL Server 5.7/logs/bin-log.000001"

출력 예시:

DELIMITER /*!*/;
# at 4
#241203 16:50:52 server id 1  end_log_pos 123 CRC32 0xd1b0f8d9  
Start: binlog v 4, server v 5.7.36-log
ROLLBACK/*!*/;

# at 1247
#241204 11:11:55 server id 1  end_log_pos 1312 CRC32 0x7bbf9070  
Anonymous_GTID  last_committed=3 sequence_number=4 rbr_only=yes
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;

# at 1312
#241204 11:11:55 server id 1  end_log_pos 1396 CRC32 0xd0da4e48  
Query   thread_id=5     exec_time=0     error_code=0
SET TIMESTAMP=1733281915/*!*/;
BEGIN
/*!*/;

# at 1396
#241204 11:11:55 server id 1  end_log_pos 1493 CRC32 0xaa53947b  
Table_map: `ezhizao_yzbh_ggy`.`fxy_financial_voucher_template` mapped to number 140

# at 1493
#241204 11:11:55 server id 1  end_log_pos 1591 CRC32 0x86714204  
Update_rows: table id 140 flags: STMT_END_F
### UPDATE `ezhizao_yzbh_ggy`.`fxy_financial_voucher_template`
### WHERE
###   @1=12
###   @2='12'
###   @3=b'0'
###   @4=1
###   @5=1
###   @6=2
###   @7=222
### SET
###   @1=12
###   @2='12'
###   @3=b'0'
###   @4=1
###   @5=1
###   @6=555
###   @7=222

# at 1591
#241204 11:11:55 server id 1  end_log_pos 1622 CRC32 0x32e198c4  
Xid = 292
COMMIT/*!*/;

상기 출력은 fxy_financial_voucher_template 테이블의 한 행에서 6번째 칼럼 값이 2 → 555로 업데이트된 것을 보여줍니다.

주요 Binlog 관련 설정 항목 정리

  • log_bin: 이진 로그 활성화 및 파일 이름 접두사 지정.
    [mysqld]
    log_bin = mysql-bin
  • binlog_format: 로그 기록 방식 설정 (ROW, STATEMENT, MIXED).
    binlog_format = ROW
  • max_binlog_size: 개별 로그 파일 최대 크기 제한.
    max_binlog_size = 100M
  • binlog_cache_size: 트랜잭션 중인 ROW 형식 로그의 메모리 캐시 크기.
    binlog_cache_size = 32K
  • log_bin_index: 사용 중인 binlog 파일 목록을 기록할 인덱스 파일 지정.
    log_bin_index = mysql-bin.index
  • sync_binlog: 디스크 동기화 주기 설정. 값 1은 트랜잭션마다 기록 보장.
    sync_binlog = 1
  • expire_logs_days: 로그 자동 삭제 기한 (단위: 일).
    expire_logs_days = 7
  • max_binlog_files: 보관 가능한 최대 파일 수 (실제 옵션은 expire_logs_days와 함께 사용되며 직접적인 제한은 아님).
  • gtid_mode: 글로벌 트랜잭션 ID 활성화로 복제 환경에서 안정성 향상.
    gtid_mode = ON
  • log_slave_updates: 슬레이브 서버에서도 수신한 복제 쿼리를 로그에 기록하도록 함.
    log_slave_updates = 1

태그: MySQL binlog 로그분석 데이터복구 레플리케이션

7월 2일 19:28에 게시됨