안녕하세요? MEGA IDC 서버운영팀입니다.
BINLOG?
서버 내에서 발생되는 모든 변경내역이 기록되는 파일입니다.
DML,DDL의 모든 명령문이 기록되며 데이터는 "event"형태로 저장되어 있습니다.
각 명령문이 데이터를 업데이트하는 소비시간 정보를 가지고 있습니다.
select or show와 같이 수정하지 않는 명령문은 기록되지 않습니다.
시점복구(PIT)와 리플리케이션에 필수 요소입니다.
활성화 확인법
아래의 명령어를 통해 해당 DB의 bin_log 상태를 ON/OFF로 확인할 수 있습니다.
(mysql8.0.22 기준으로 default로 ON상태입니다.)
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
비활성화 시킬 수 있는 방법입니다.
1. my.cnf에 작성하기
disable_log_bin 의 내용을 추가한 후 DB restart로 적용할 수 있습니다.
확인법
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
1 row in set (0.00 sec)
다른방법으로는
2.서버 구동 시 --log-bin 옵션을 주어서 start를 해도 됩니다.
두 방법다 결과는 동일하지만 서버 구동시마다 옵션을 넣어주는게 번거롭기 때문에 my.cnf 설정법을 주로 사용한다고 합니다.
추가 설정 옵션
-log-bin=bin-log
DATA_DIR에 이름을 bin-log.00001와 같은 형식으로 남길 수 있습니다.
-binlog_format=row
데이터 포맷을 row형식으로 지정할 수 있습니다.
-binlog-do-db=test-db
test-db에 대해 내용을 남긴다는 의미입니다.
-max_binlog_size=256MB
빈로그 파일의 최대 크기입니다. 256MB가 넘어가면 2번으로 추가로 생성됩니다.
-expire_logs_days=4
4일 이상 오래된 빈로그는 삭제할 수 있습니다.
데이터 포맷
Mysql 5.7.6까지는 기본값이 statement이고 그 이후 버전은 row가 기본값입니다. (클러스터는 예외로 mix)
8.0.22 기준에서는 ROW가 기본값입니다.
mysql> show variables like '%binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec)
빈로그 포맷은 동적변수이므로 DB가 가동중일때도 set으로 변경할 수 있지만 리플리케이션일 경우에는 마스터/슬레이브를 내리고 변경하는게 좋습니다.
statement
쿼리문으로 기록되는 형식이고 용량을 적게 차지합니다. 버전 특성을 타지 않습니다.(sysdate()와 now()의 결과가 다른경우 등)
하지만 복구시 일관된 데이터에 대한 보장이 적으며 쿼리기반이기 때문에 복구(동기화)시 느려질 수 있습니다.
row
변경된 데이터 기반으로 기록됩니다.
복구 시 일관성을 보장받을 수 있으며 빠른 복구(동기화)가 가능하지만. 용량이 커지는 단점이 있습니다.
mixed
statement와 row방식의 장점을 취합한 형태로 기본적으로 statement방식을 취하나 필요에 따라 row방식으로 기록합니다.
데이터 일관성을 위해 mixed나 row방식을 선택하는것을 권고하는것 같네요.
<주의 해야할 점>
isolation level이 read-committed일 경우 현재 트랜잭션이 종료되지 않았더라도 다른 트랙잭션에서 동일한 데이터의 commit이 일어나면 현재 트랜잭션에서도 변경된 값이 보이게 됩니다.이런 환경에서 statement방식을 사용하게 되면 트랜잭션 단위로 순서대로 로깅하기 때문에 복구나 슬레이브동기화시 원하는 바와 달리 다른 결과가 나타날 수 있습니다.
그렇기 때문에 read-committed에서는 row방식이나 이런 상황에서 자동으로 row형태로 변경해주는 mixed방식을 사용해야 합니다.
서비스 이용에 관련된 문의는 지원팀으로 문의주시면 자세히 안내해드리겠습니다.
감사합니다.