MySQL 서버 변경 사항
요약
MySQL 8.0.16부터 rows_event에 파티션 정보 추가
- rows_event: row 단위의 DML
세부 사항
rows_event 레이아웃
- header - body - row 구조
- header에 extra_data 필드 존재
변경 전 rows_event
extra data가 사용되고 있지 않는듯…
변경 후 rows_event
extra data에 ndb info, partition id 추가
-
type이 NDB인 경우
+----------+--------------------------------------+ |type_code | extra_row_ndb_info | +--- ------+--------------------------------------+ | NDB |Len of ndb_info |Format |ndb_data | | 1 byte |1 byte |1 byte |len - 2 byte | +----------+----------------+-------+-------------+
-
type이 partition인 경우
INSERT/DELETE인 경우 +-----------+----------------+ | type_code | partition_info | +-----------+----------------+ | PART | partition_id | | (1 byte) | 2 byte | +-----------+----------------+ UPDATE인 경우 +-----------+------------------------------------+ | type_code | partition_info | +-----------+--------------+---------------------+ | PART | partition_id | source_partition_id | | (1 byte) | 2 byte | 2 byte | +-----------+--------------+---------------------+
python-mysql-replication 이슈
요약
extra data가 존재함을 인지, 파싱 시도
하지만 extra data의 길이를 잘못 계산하여 파싱 실패
MySQL 8.0.15 이전에는 extra data 미사용으로 이슈 없었으나,
MySQL 8.0.16 이후 partition table에 대해 파싱 이슈 발생
세부 사항
기존 비표준 extra data 길이 계산
출처: python-mysql-replication 라이브러리 소스코드
self.extra_data = self.packet.read(self.extra_data_length / 8)
표준 extra data 길이 계산
출처: MySQL 공식 문서, MySQL 서버 소스코드
self.extra_data = self.packet.read(self.extra_data_length - 2)