중화사전망 - 서예자전 - Python 을 사용하여 MySQL 데이터베이스에 데이터를 대량 삽입하고 list 를 사용하는 방법

Python 을 사용하여 MySQL 데이터베이스에 데이터를 대량 삽입하고 list 를 사용하는 방법

MySQL 의 Binlog 는 MySQL 데이터베이스에 대한 모든 변경 정보를 기록합니다. Binlog 의 구조를 이해하면 Binlog 를 구문 분석하는 데 도움이 되며, Oracle 플래시백 기능 구현, 잘못 삭제된 레코드 복구, 업데이트된 레코드 복구와 같은 Binlog 수정 또는 "변조" 도 가능합니다. 이 글은 이러한 신기한 기능의 실현을 탐구할 것이며, 당신이 생각했던 것보다 훨씬 쉽다는 것을 알게 될 것이다. (존 F. 케네디, 생각명언) 이 문서에서 참조하는 Binlog 는 행 모드의 Binlog 이자 MySQL 8 의 기본 모드입니다. 문 패턴은 사용에 많은 제한이 있기 때문에 점점 더 적게 사용되고 있다.

Binlog 는 이벤트로 구성됩니다. 이벤트는 트랜잭션이 아니며 한 트랜잭션에 여러 이벤트가 포함될 수 있습니다. 이 이벤트는 데이터베이스 수정 사항을 설명합니다.

이제 우리는 Binlog 의 구조를 알고 있으며 Binlog 의 데이터를 수정해 볼 수 있습니다. 예를 들어, 앞의 예에서 Binlog 는 레코드를 삭제했으며 이 레코드를 복구하려고 할 수 있습니다. Binlog 에는 레코드를 삭제하는 행 삭제 이벤트 (DELETE_ROWS_EVENT) 가 있습니다. 이 이벤트의 데이터 구조는 행을 삭제하는 이벤트 유형이 32 이고 쓰기 행의 이벤트 유형이 30 이라는 점을 제외하면 쓰기 행의 이벤트 (WRITE_ROWS_EVENT) 와 동일합니다. 우리는 해당 Binlog 위치를 배치합니다. 앞의 "Binlog 이벤트 표시" 에서 DELETE_ROWS_EVENT 가 378 위치에서 시작하는 것을 볼 수 있습니다. 이는 binlog 파일의 실제 위치 (바이트) 입니다. 이벤트 구조에서 이벤트의 다섯 번째 바이트에서 type_code 를 볼 수 있습니다. 파이썬 애플릿을 써서 383 번째 (378+5 = 383) 바이트를 30 으로 바꿀 수 있습니다. 물론 이진 편집 도구를 사용하여 변경할 수도 있습니다.

Binlog 에서 큰 거래 찾기

행 모드의 Binlog 는 각 변경 사항에 대해 로그를 기록하기 때문에 간단한 SQL 은 Binlog 에 where 가 없는 update 또는 delete 문과 같은 거대한 트랜잭션을 생성하고, 전체 테이블의 모든 레코드를 수정하며, 각 레코드를 Binlog 에 한 번 기록하여 거대한 트랜잭션 레코드를 생성할 수 있습니다. 이런 큰일은 왕왕 번거로운 원천이다. 내 고객 중 한 명이 Binlog 가 이틀 동안 굴러갔지만 아무 일도 일어나지 않았다고 나에게 불평했다. Binlog 를 분석한 결과, 1.4G 기록이 생성되고 66 만 개의 기록이 수정되었다는 것을 알게 되었습니다! 다음은 Binlog 에서 큰 트랜잭션을 찾는 간단한 파이썬 애플릿입니다. 우리는 mysqlbinlog 가 구문 분석하는 Binlog 에서 각 트랜잭션이 BEGIN 으로 시작되고 COMMIT 으로 끝난다는 것을 알고 있습니다. BENGIN 앞에 "# at" 의 위치를 찾아 COMMIT 뒤에 "# at" 의 위치를 확인해 보겠습니다. 이 거래의 크기는 이 두 위치를 빼서 계산할 수 있다. 다음은 파이썬 프로그램의 예입니다.

Binlog 에서 대량 거래 삭감

큰 트랜잭션의 경우 MySQL 은 이를 여러 이벤트 (하나는 트랜잭션, 하나는 이벤트) 로 분할합니다. 이벤트 크기는 binlog-row-event-max-size 매개 변수에 의해 결정되며 기본값은 8K 입니다. 그래서 우리는 몇 가지 사건을 좀 더 작은 거래로 나눌 수 있다.

행 모드에서는 레코드의 한 필드만 업데이트하더라도 변경 전후의 각 필드 값이 기록됩니다. 이 동작은 세 개의 값이 있는 binlog_row_image 매개변수로 제어됩니다. 기본값은 FULL 입니다. 즉, 필드가 변경되지 않았더라도 해당 열에 대한 모든 수정 사항이 기록됩니다. 이렇게 하면 갑골문 플래시백과 같은 기능을 실현할 수 있다. 나는 개인적으로 향후 MySQL 버전이 이런 Binlog 기반 기능을 절대 내놓지 않을 것으로 예상한다.

Binlog 의 구조와 Python 이라는 스위스 군용 칼을 알면 많은 기능을 할 수 있다. 예를 들어, 어떤 테이블이 가장 많이 수정되었는지 계산할 수 있습니다. Binlog 를 세그먼트로 자른 다음 재결합하여 MySQL 데이터베이스를 유연하게 수정하고 마이그레이션할 수도 있습니다.