머리말
질문 주체는 오늘(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/
마치다
교훈을 배워라!