MySQL 데이터 오류 삭제 빠 른 해결 방법(MySQL 플래시 도구)
Binlog2sql 은 Python 이 개발 한 MySQL Binlog 분석 도구 로 Binlog 를 원시 SQL 로 해석 할 수 있 으 며,Binlog 를 스크롤 하 는 SQL 로 해석 할 수 있 으 며,메 인 키 를 제거 한 INSERT SQL 도 지원 하 며 DBA 와 운영 자 데이터 복구 에 도 도움 이 됩 니 다.
설치 설정
1.1 용도
데이터 빠 른 스크롤 백(플래시)
주 전환 후 새 master 에서 데 이 터 를 잃 어 버 린 복구
binlog 에서 표준 SQL 을 생 성하 여 가 져 온 파생 기능
MySQL 5.6,5.7 지원
1.2 설치
shell> git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
shell> pip install -r requirements.txt
2.사용 방법
2.1 사용 전 설정
2.1.1 매개 변수 설정
[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full
2.1.2 user 에 필요 한 최소 권한 집합
select, super/replication client, replication slave
제안 권한 부여
select, super/replication client, replication slave
권한 설명2.2.1 기본 용법
표준 SQL 분석
shell> python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -t test3 test4 --start-file='mysql-bin.000002'
출력:
INSERT INTO `test`.`test3`(`addtime`, `data`, `id`) VALUES ('2016-12-10 13:03:38', 'english', 4); #start 570 end 736
UPDATE `test`.`test3` SET `addtime`='2016-12-10 12:00:00', `data`=' ', `id`=3 WHERE `addtime`='2016-12-10 13:03:22' AND `data`=' ' AND `id`=3 LIMIT 1; #start 763 end 954
DELETE FROM `test`.`test3` WHERE `addtime`='2016-12-10 13:03:38' AND `data`='english' AND `id`=4 LIMIT 1; #start 981 end 1147
스크롤 백 SQL 분석
shell> python binlog2sql.py --flashback -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttest3 --start-file='mysql-bin.000002' --start-position=763 --stop-position=1147
출력:
INSERT INTO `test`.`test3`(`addtime`, `data`, `id`) VALUES ('2016-12-10 13:03:38', 'english', 4); #start 981 end 1147
UPDATE `test`.`test3` SET `addtime`='2016-12-10 13:03:22', `data`=' ', `id`=3 WHERE `addtime`='2016-12-10 12:00:00' AND `data`=' ' AND `id`=3 LIMIT 1; #start 763 end 954
2.2.2 옵션mysql 연결 설정
-h host; -P port; -u user; -p password
해석 모드
--stop-never 는 binlog 를 지속 적 으로 해석 합 니 다.선택 할 수 있다.기본 False,명령 을 실행 할 때 최신 binlog 위치 로 동기 화 합 니 다.
-K,--no-primary-key 는 INSERT 문 구 를 홈 키 로 제거 합 니 다.선택 할 수 있다.기본 false
-B,--flashback 은 스크롤 SQL 을 생 성하 고 큰 파일 을 처리 할 수 있 으 며 메모리 제한 을 받 지 않 습 니 다.선택 할 수 있다.거짓 을 묵인 하 다.stop-never 나 no-primary-key 와 동시에 추가 할 수 없습니다.
--back-interval-B 모드 에 서 는 1 천 줄 씩 SQL 을 출력 할 때마다 SLEEP 를 몇 초 추가 하고,SLEEP 를 추가 하지 않 으 려 면 0 으로 설정 하 세 요.선택 할 수 있다.기본 1.0.
해석 범위 제어
--start-file 은 파일 이름 만 있 으 면 전체 경로 가 필요 하지 않 습 니 다.반드시.
--start-position/--start-pos 시작 분석 위치.선택 할 수 있다.기본 값 은 start-file 의 시작 위치 입 니 다.
--stop-file/--end-file 분석 파일 을 종료 합 니 다.선택 할 수 있다.기본 값 은 start-file 과 같은 파일 입 니 다.분석 모드 가 stop-never 이면 이 옵션 은 유효 하지 않 습 니 다.
--stop-position/--end-pos 해석 위 치 를 종료 합 니 다.선택 할 수 있다.기본 값 은 stop-file 의 마지막 위치 입 니 다.분석 모드 가 stop-never 이면 이 옵션 은 유효 하지 않 습 니 다.
--start-datetime 시작 분석 시간,형식'%Y-%m-%d%H:%M:%S'.선택 할 수 있다.기본적으로 필터 하지 않 습 니 다.
--stop-datetime 해석 종료 시간,형식'%Y-%m-%d%H:%M:%S'.선택 할 수 있다.기본적으로 필터 하지 않 습 니 다.
대상 필터
-d,--databases 는 대상 db 의 sql 만 분석 하고 여러 라 이브 러 리 는 빈 칸 으로 분리 합 니 다.예 를 들 어-d db1 db2.선택 할 수 있다.기본 값 이 비어 있 습 니 다.
-t,--tables 는 대상 table 의 sql 만 분석 하고 여러 장의 시 계 는 빈 칸 으로 구분 합 니 다.예 를 들 어-t tbl 1 tbl 2.선택 할 수 있다.기본 값 이 비어 있 습 니 다.
--only-dml 는 dml 만 해석 하고 ddl 은 무시 합 니 다.선택 할 수 있다.거짓 을 묵인 하 다.
--sql-type 은 지 정 된 형식 만 분석 하고 INSERT,UPDATE,DELETE 를 지원 합 니 다.여러 종 류 는 빈 칸 으로 구분 합 니 다.예 를 들 어 sql-type INSERT DELETE.선택 할 수 있다.기본 값 은 첨삭,수정 모두 해석 합 니 다.이 인 자 를 사 용 했 지만 유형 을 채 우지 않 으 면 세 가 지 는 해석 하지 않 습 니 다.
2.3 응용 사례
2.3.1 전체 표 데 이 터 를 잘못 삭제 하면 긴급 스크롤 백 이 필요 합 니 다.
플래시 상세 소 개 는 example 디 렉 터 리 에서 example/mysql-flashback-priciple-and-practice.md 를 참조 할 수 있 습 니 다.
테스트 라 이브 러 리 tbl 표 기 존 데이터
mysql> select * from tbl;
+----+--------+---------------------+
| id | name | addtime |
+----+--------+---------------------+
| 1 | | 2016-12-10 00:04:33 |
| 2 | | 2016-12-10 00:04:48 |
| 3 | | 2016-12-13 20:25:00 |
| 4 | | 2016-12-12 00:00:00 |
+----+--------+---------------------+
4 rows in set (0.00 sec)
mysql> delete from tbl;
Query OK, 4 rows affected (0.00 sec)
20:28 ,tbl
mysql> select * from tbl;
Empty set (0.00 sec)
복구 데이터 단계:1.my sql 에 로그 인하 여 현재 binlog 파일 보기
mysql> show master status;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000051 | 967 |
| mysql-bin.000052 | 965 |
+------------------+-----------+
2.최신 binlog 파일 은 my sql-bin.000052 입 니 다.SQL 을 잘못 조작 한 binlog 위 치 를 다시 찾 습 니 다.오 작 동 자 는 대체적인 오 작 동 시간 만 알 수 있 고 우 리 는 대체적인 시간 에 따라 데 이 터 를 필터 한다.
shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-datetime='2016-12-13 20:25:00' --stop-datetime='2016-12-13 20:30:00'
출력:
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:26:00', 4, ' '); #start 317 end 487 time 2016-12-13 20:26:26
UPDATE `test`.`tbl` SET `addtime`='2016-12-12 00:00:00', `id`=4, `name`=' ' WHERE `addtime`='2016-12-13 20:26:00' AND `id`=4 AND `name`=' ' LIMIT 1; #start 514 end 701 time 2016-12-13 20:27:07
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-10 00:04:33' AND `id`=1 AND `name`=' ' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-10 00:04:48' AND `id`=2 AND `name`=' ' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-13 20:25:00' AND `id`=3 AND `name`=' ' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-12 00:00:00' AND `id`=4 AND `name`=' ' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
3.우 리 는 sql 을 잘못 조작 한 정확 한 위 치 를 728-938 사이 에 얻 었 습 니 다.그 다음 에 위치 에 따라 더 걸 러 내 고 fllashback 모드 로 스크롤 sql 을 생 성하 여 스크롤 sql 이 정확 한 지 확인 합 니 다(주:실제 환경 에서 이 단 계 는 필요 한 sql 을 계속 선별 합 니 다.grep,편집기 등 결합)
shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-position=3346 --stop-position=3556 -B > rollback.sql | cat
출력:
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-12 00:00:00', 4, ' '); #start 728 end 938 time 2016-12-13 20:28:05
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:25:00', 3, ' '); #start 728 end 938 time 2016-12-13 20:28:05
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:48', 2, ' '); #start 728 end 938 time 2016-12-13 20:28:05
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:33', 1, ' '); #start 728 end 938 time 2016-12-13 20:28:05
4.스크롤 백 sql 이 정확 한 지 확인 하고 스크롤 백 문 구 를 실행 합 니 다.mysql 에 로그 인하 여 데이터 스크롤 백 에 성 공 했 습 니 다.
shell> mysql -h127.0.0.1 -P3306 -uadmin -p'admin' < rollback.sql
mysql> select * from tbl;
+----+--------+---------------------+
| id | name | addtime |
+----+--------+---------------------+
| 1 | | 2016-12-10 00:04:33 |
| 2 | | 2016-12-10 00:04:48 |
| 3 | | 2016-12-13 20:25:00 |
| 4 | | 2016-12-12 00:00:00 |
+----+--------+---------------------+
3.총화3.1 제한(대비 mysqlbinlog)
my sql server 를 열 어야 합 니 다.오프라인 모드 에서 분석 할 수 없습니다.
파라미터 binlogrow_image 는 FULL 이 어야 합 니 다.MINIMAL 은 지원 되 지 않 습 니 다.
분석 속도 가 mysql binlog 보다 못 합 니 다.
3.2 장점(대비 mysql binlog)
순수 Python 개발,설치 및 사용 모두 간단 합 니 다.
자체 flashback,no-primary-key 분석 모드,패 치 를 설치 할 필요 가 없습니다.
flashback 모드 에 서 는 실전 으로 되 돌아 가기 에 더욱 적합 합 니 다.
표준 SQL 로 해석 하여 이해,선별 이 편리 합 니 다.
코드 는 쉽게 개조 되 고 더 많은 개성 화 된 해석 을 지원 할 수 있 습 니 다.
총결산
위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 MySQL 데이터 오 류 를 삭제 하 는 빠 른 해결 방법 입 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL에서 JSON 인덱싱 - aarondfrancis사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 말하지만 완전히 정확하지는 않습니다. MySQL로 JSON 열을 인덱싱하는 것은 완전히 가능합니다! 사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.