본문 바로가기

카테고리 없음

Row-based Binlog(binlog_format=row) 일 때, mysqlbinlog 로 실행된 쿼리 백트래킹 해보기

어제, spring batch 로 준실시간 migration 해주는 job 이 하나 있는데, sql 이 실패했거나 예외가 발생하면 Prepared SQL 은 로깅이 되지만, 실패할 당시의 SQL 의 파라미터는 로그로 남지 않는다.

db 에 insert 는 됐지만, 이상한 값이 들어가 있는 row 를 발견했어서, spring batch 의 버그인지 내가 만든 버그인지 구별이 먼저 필요했어서 mysqlbinlog 를 사용해보기로 했다.

row based binlog format 일 때 mysqlbinlog 를 그냥 쓰면 GTID 를 set 해주는 내용 밖에 없어 원하는 insert 구문을 찾을 수 없었다.

결론적으로는 `--base64-output=decode-rows -v` 이 옵션이 있어야 했다.

mysqlbinlog --no-defaults --start-datetime="2019-10-23 18:00:00" --stop-datetime="2019-10-23 19:30:00" --base64-output=decode-rows -v --database=table mysql-bin.000382 > tracking.log

그리고 --no-defaults 를 넣은 이유는 my.cnf 설정에 `default-character-set=utf9mb4` 로 되어 있었는데, mysqlbinlog 에서도 default 로 my.cnf 파일을 읽는데, default-character-set 이라는 옵션은 또 지원하지 않기 때문에 default 를 사용하지 않도록 한 것이다.

mysqlbinlog 로 추출한 파일에서 실제 mysql layer 에서 실행된 쿼리가 뭔지 백트래킹을 해볼 수 있다.

mysqlbinlog 로 추출된 INSERT 쿼리문