MySQL에서 실수로 삭제된 데이터 레코드(binlog)를 복구하는 방법

머리말

질문 주체는 오늘(2022년 11월 27일) 온라인 환경에서 실수로 기록을 삭제해 백업 데이터가 없었고, 밤새 사고 원인을 조사한 결과, 최종적으로 생산사고는 발생하지 않았습니다. 이 글에 기록하고 싶습니다.

참고자료

https://blog.csdn.net/qq_23543983/article/details/127298578

이 글은 위의 작업에 대한 실질적인 보충 설명입니다.

1 binlog 로그를 확인하세요

먼저 binlog가 켜져 있는지 확인하세요. 일반적으로 온라인 환경이 개방됩니다. 명령은 다음과 같습니다.

show VARIABLES like '%log_bin%';

그런 다음 MySQL을 저장하는 서버에 로그인합니다. binlog 로그가 저장된 폴더를 찾으세요. 일반적으로 프로젝트 팀의 운영 및 유지 관리 담당자는 이 파일의 위치를 ​​알고 있습니다. 이를 찾으면 아래와 같이 많은 로그 파일을 찾을 수 있습니다.

여기에 이미지 설명을 삽입하세요.
마지막 로그 파일은 실시간으로 증분 업데이트됩니다. 파일은 항상 기록됩니다. 최근에 삭제하셨다면 위 사진에 동그라미 친 파일을 찾아보세요. 다른 기간에 삭제된 경우 날짜별로 이름이 지정된 파일을 찾으세요.

데이터 복구 시간은 빠르고 빠를수록 좋습니다. 우리는 45일 동안만 서버에 기록을 보관합니다!

2 해당 binlog 파일을 찾아 직접 명령을 실행

다음 SQL은 기간을 제공합니다. 잘못된 작업을 캡처한 대략적인 기간입니다.

 mysqlbinlog --no-defaults --start-datetime='2022-10-12 15:00:00' --stop-datetime='2022-10-12 17:00:00' /var/lib/mysql/mysql-bin.000031 >/var/lib/mysql/mysql_delete20221012.sql

실행 후 sql 파일이 생성됩니다. 당신이 잘못 조작한 모든 데이터가 들어 있습니다.(데이터가 암호화되어 있습니다.) 그 안에 많은 레코드가 있습니다.시작 인덱스와 끝 인덱스만 찾으면 됩니다.

시작 및 끝 노드를 보려면 head -100, tail -100을 사용하는 것이 좋습니다. 다음 두 가지 결과 값을 찾아 기록합니다.

332334767

366250788

그런 다음 다음 명령을 실행하여 노드를 통해 오작동 SQL을 정확하게 내보냅니다.

mysqlbinlog --no-defaults -vv --start-position=332334767 --stop-position=366250788 /var/lib/mysql/mysql-bin.000031 >/var/lib/mysql/bin_data.sql

사실, 그것은 단지 당신의 기간을 함께 연결하는 것에 관한 것입니다. 모든 INSERT 및 UPDATE 문이 캡처됩니다(아래 범례에 표시됨).

여기에 이미지 설명을 삽입하세요.

3 실수로 삭제한 데이터 찾기

일반적으로 실수로 삭제한 데이터에는 대략 식별자가 표시됩니다. 문서번호는 다음과 같습니다. 삭제된 데이터의 문서 인코딩이 무엇인지 막연하게 기억하고 있으면 이 조건을 퍼지 검색할 수 있습니다.

less bin_data.sql | grep -C 100 "单据编号xxxxx"

이 방법으로 아래와 같이 해당 역방향 INSERT 문을 얻을 수 있습니다.

여기에 이미지 설명을 삽입하세요.

4 삭제문을 삽입문으로 변환

Baidu에서 직접 검색하거나 다음 명령을 참조할 수 있습니다.

cat /var/lib/mysql/bin_data.sql | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' |sed -r 's/(@17.*),/\1;/g' | sed 's/@[1-9]=//g' | sed 's/@[1-9][0-9]=//g' >  /var/lib/mysql/delete2insert.sql

문법 형식을 준수하도록 주의하세요. 수동으로 수정해야 하지만 거의 동일합니다. 파일에서;와 같은 일부 기호를 수동으로 변경해야 합니다.

다음을 참고하실 수도 있습니다: https://www.lmlphp.com/user/62049/article/item/2326681/

마치다

교훈을 배워라!

추천

출처blog.csdn.net/weixin_44757863/article/details/128071839