[MySQL] binlog 기반의 CDC 구현
MySQL은 binlog라는 로그 계층을 통해 WAL(Write Ahead Log)를 구현한다.
따라서 이를 기반으로 쓰기 기록을 조회해서 복제나 CDC 시스템을 구현하는 것이 가능하다.
물론 postgres 등에 비하면 편의성 수준이 매우 낮고 구린 편이다...
BIN LOG 활성화 상태 및 설정 확인
binlog가 활성화되어있는지 확인하려면, 다음 쿼리를 날려보면 된다.
show variables like 'log_bin';
이렇게 ON이면 된다.
보통 기본값이 ON이다.
그리고 상세한 옵션은 다음 명령으로 확인할 수 있다.
SHOW VARIABLES LIKE 'binlog%';

저 기본값들 중에서 뭔가 수정하고 싶은게 있다면, config 파일을 수정하고 재시작하면 된다.
sudo vi /etc/my.cnf

binlog 파일 확인
안타깝게도, MySQL에는 postgres의 replication처럼 편리한 형태로 제공되는 log 동기화 매커니즘이 없다.
직접 로그파일 다 스캔하면서 뭐가 들어왔는지 봐야 한다...
일단 파일이 뭐가 있는지부터 보자.
show binary logs
자. 2개의 파일이 있는 것을 볼 수 있다.
어디에 뭐가 들어있는지는 모르겠지만, 아무튼 저기에 이런저런 의미있는 데이터들이 기록이 되는 것이다.
그리고 저 log_name이 각각의 로그 식별자다. 저걸 사용해서 실제 로그 데이터에 접근해야 한다.
로그 조회하기
로그는 방금 본 log name 기반으로 show binlog events 명령을 사용해서 조회할 수 있다.
조회 방식은 LIMIT OFFSET이다.
SHOW BINLOG EVENTS IN 'binlog.000001' limit 10SHOW BINLOG EVENTS IN 'binlog.000001' from 914 limit 10 # 그 다음 페이지 조회SHOW BINLOG EVENTS limit 10 # 전체 로그 다 보기
다음 페이지를 조회하려면 계속 End_log_pos 값을 그 다음 from에 넘겨주면 된다.
변경 로그 확인
데이터를 한번 넣어보고, 로그에 잘 뜨는지 한번 확인해보자.

그러면 아마 00001 로그는 시스템 내부 로그가 많아서 00002로그에서 노출될 것이다.
이런 식으로 간략하게 어떤 테이블에 대한 write를 했는지 정도만 알 수 있는데
문제는 그 이상을 알 수 없다는 것이다.
어떤 테이블에 뭔가 했는지는 알 수 있는데, 무슨 값을 넣었는지, 어떤 행을 지웠는지를 전혀 알 수가 없다.
삽입된 실제 데이터 조회하기
실제 로그 데이터를 까서 어떤걸 넣었는지 보려면 mysqlbinlog를 써야만 한다.
일반적인 형태의 쿼리로는 아예 보는게 불가능하다...
mysqlbinlog는 mysql 스택을 설치하면 함께 딸려온다.
대충 이렇게 쓰면 된다.
DB 접속정보 넣고, 읽기 원하는 로그 정보 넣고 날린다.
mysqlbinlog --read-from-remote-server \
--host=0.0.0.0 --port=3306 \
--user=root --password=q1w2e3r4 \
--verbose --base64-output=DECODE-ROWS \
binlog.000002mysqlbinlog --read-from-remote-server \
--host=0.0.0.0 --port=3306 \
--user=root --password=q1w2e3r4 \
--verbose --base64-output=DECODE-ROWS \
--start-position=1407 \ # 특정 BINLOG 포지션부터 조회
binlog.000002
그러면 이렇게 뭐가 산만하게 날라오는데
잘 찾아보면
INSERT 로그를 확인할 수 있을 것이다.
그리고 여러개를 한번에 날린다면

한번에 묶어서 들어온다.
그러면 적당히 파싱해서 쓰도록 처리하면 된다.
참조
https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog.html
https://dev.mysql.com/doc/refman/8.4/en/show-binary-logs.html
https://dev.mysql.com/doc/refman/8.4/en/show-binlog-events.html