본문 바로가기

Database/DB

1. mysql binlog

 

MySQL Binary Log(binlog) 설정 및 분석 실습

MySQL에서 Binary Log(이하 binlog)는 데이터 변경 이력을 기록하는 중요한 기능이다. 주로 Replication, Point-in-Time Recovery, Change Data Capture 등에 활용된다. 이 글에서는 Docker 환경에서 binlog를 활성화하고, 데이터 변경 내용을 직접 로그로 확인하는 과정을 다룬다.

 

 

 

1. Docker로 binlog 활성화된 MySQL 구성

먼저 Docker Compose로 binlog가 활성화된 MySQL을 실행합니다. 다음의 커맨드를 추가해야 binlog를 사용할수 있다. 

  • --log-bin=mysql-bin: binlog 활성화
  • --binlog-format=ROW: row-level logging
  • --server-id=1: replication을 위한 필수 설정
services:
  mysql:
    image: mysql:8.0
    container_name: mysql-db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_DATABASE: test_db
      MYSQL_USER: test_user
      MYSQL_PASSWORD: test_pw
    ports:
      - "3306:3306"
    command: --log-bin=mysql-bin --binlog-format=ROW --server-id=1
    volumes:
      - ./init:/docker-entrypoint-initdb.d
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

 

 

 

2. 테이블 생성 및 데이터 삽입

docker-compose.yml의 MYSQL_DATABASE 값으로 이미 test_db가 생성되어 있으므로, 그 안에 샘플 테이블을 만들고 데이터를 추가한다.

-- 데이터베이스 생성은 docker-compose의 MYSQL_DATABASE 환경 변수로 대체됨
USE test_db;

-- 테이블 생성
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 샘플 데이터 삽입
INSERT INTO users (name, email) VALUES 
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com');

 

 

데이터 확인

mysql> SELECT * FROM users;
+----+-------+-------------------+---------------------+
| id | name  | email             | created_at          |
+----+-------+-------------------+---------------------+
|  1 | Alice | alice@example.com | 2025-08-05 08:29:15 |
|  2 | Bob   | bob@example.com   | 2025-08-05 08:29:15 |
+----+-------+-------------------+---------------------+
2 rows in set (0.00 sec)

 


test_user로 접속한 상태에서 만일 binlog 에 대한 권한이 없다면 다음과 같은 오류가 발생

mysql> SHOW BINARY LOGS;
ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operation

 

root로 재접속하여 test_user에게 권한을 줘야 한다. 

$ docker exec -it mysql-db mysql -uroot -prootpw
> GRANT REPLICATION CLIENT ON *.* TO 'test_user'@'%';
> FLUSH PRIVILEGES;

 


 

SHOW BINARY LOGS 명령을 실행하면 다음과 같이 확인한다. 

mysql> SHOW BINARY LOGS;
+------------------+-----------+-----------+
| Log_name         | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 |       550 | No        |
+------------------+-----------+-----------+
1 row in set (0.00 sec)

 

4. binlog 파일 내용 보기

MySQL 서버 안에서 binlog는 /var/lib/mysql 디렉토리에 생성된다. mysqlbinlog 명령어를 사용해 파일 내용을 확인할 수 있다

mysqlbinlog --verbose /logs/mysql-bin.000001 | less

출력 예시:

### INSERT INTO `test_db`.`users`
### SET
###   @1=1
###   @2='Alice'
###   @3='alice@example.com'
###   @4=1754383704
### INSERT INTO `test_db`.`users`
### SET
###   @1=2
###   @2='Bob'
###   @3='bob@example.com'
###   @4=1754383704
# at 1422

여기서

@1=1은 id=1,

@2='Alice'는 name='Alice',

@3='alice@example.com'은 email,

@4=1754383704는 created_at을 의미한다.

 

--binlog-format=ROW 옵션 덕분에 실제 데이터 단위로 변경 사항이 기록되어 있어 로그 분석이나 CDC 구현 시 유용한다