extra-data

 

MySQL 서버 변경 사항

요약

MySQL 8.0.16부터 rows_event에 파티션 정보 추가

  • rows_event: row 단위의 DML

세부 사항

rows_event 레이아웃

  1. header - body - row 구조
  2. header에 extra_data 필드 존재

변경 전 rows_event

extra data가 사용되고 있지 않는듯…

변경 후 rows_event

extra data에 ndb info, partition id 추가

  1. 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 |
     +----------+----------------+-------+-------------+
    
  2. 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)

라이브러리 수정 후 PR

Fix parsing of row events for MySQL8 partitioned table