오용의 MySQL의 바이너리 로그 감소를 사용

데이터베이스의 작업은 항상 시간이 너무 싸구려 손이있을 때 테스트 환경이 좋아하는 경우, 데이터의 손실로 이어질하지만, 공식적인 환경 있다면, 발 라이브러리를 삭제합니다. 당신이 열 경우 사실, 빈 - 로그, 또는 이러한 작업은 복원 할 수 있습니다.

큰 상자 로그 옵션에서, 오프닝에서 MySQL의 복제 마스터 /etc/my.cnf다음과 같은 두 가지 구성

1 
2
3
4
5
6
7
8
9
10
# 매우 중요한 데이터 무결성 옵션을 설정하는 #을 선도하고 제거 : 로깅 
# 변경 사항을 백업 사이의 바이너리 로그에.
#의 log_bin

이들은 일반적으로 설정 #는 #을 제거하고 필요에 따라 설정합니다.
#의 기본 디렉토리 = .....
#datadir = .....
# 포트 = .....
#의 SERVER_ID = .....
# 소켓 = .....

우리가에 초점을 맞출 필요가 어디 log_bin server_id당신이 깡통을 구성해야이 두, server_id당신은 주요 분쟁에서 할 수없는, 개별 구성은 다음과 같다, 무료입니다

1 
2
log_bin = / 데이터 / 로그 / mysql을 / mysql을 - bin.log #의 바이너리 로그의 로그 파일 
SERVER_ID = 1

다음 데이터베이스를 입력 MySQL의를 다시 시작의 빈 로그의 상태를 확인

1 
2
3
4
5
6
7
8
9
10
'log_bin의 %'등의 MySQL> 쇼 변수; 
+ --------------------------------- + --------------- -------------- +
| VARIABLE_NAME | 가치 |
+ --------------------------------- + --------------- -------------- +
| log_bin | ON |
| log_bin_basename | / 데이터 / mysql을 / mysql을 - 빈 |
| log_bin_index | /data/mysql/mysql-bin.index |
| 이 log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+ --------------------------------- + --------------- -------------- +

어디 log_binOn이 이미 쇼를 열log_bin

그는 싼 그것을 손에 시작

잘못된 데이터 포인트를 만들기

우리는 우리의 테스트를 위해 허위 데이터 포인트를 생성하기 시작

1 
2
3
4
MySQL은> 데이터베이스 테스트를 만들; 
MySQL은> 테스트를 사용;
MySQL의 작성> 표 binlog_test (아이디 INT 널 부호 생략);
MySQL은> binlog_test 삽입 값 (1), (2), (3), (4), (5);

백업 후 우리는 백업하기 전에 먼저 소개, 테이블에 보면 5 개 개의 데이터에 먼저 --master-data이 매개 변수를

1 
2
3
4
5
6
7
데이터 --- 마스터 [= # 1]이 될 바이너리 로그의 위치 및 이름을 발생한다 
. A.로 출력한다, 상기 경우 출력 동일한 1 추가
CHANGE 명령 MASTER, 2 IF 같 명령 것
ㄱ 붙여야 주석 기호가.
이 매개 변수를 내보내기 파일이 시간 오프셋 빈 로그 파일에 추가 상쇄 될 것이다
값이 1 인 경우는 2와 동일한 경우, 그것은,이 명령을 인쇄 할 수에게,이 명령이
될 것입니다 주석

우리가 백업 할 때, 당신은 우리가 데이터의 실종 된 부분을 찾을 수 있도록하기 위해, 2에이 매개 변수를 추가하고 설정해야합니다

1
mysqldump를 -uroot -p --master 데이터 = 2 시험> test.sql

백업이 완료 될 때, 우리는 가짜 데이터를 추가하고, 마지막으로 의지 이러한 데이터를 볼

1
MySQL은> binlog_test 값을 삽입 (6), (7), (8), (9), (10);

손 싼 그것

1 
2
MySQL의> binlog_test에서 삭제; 
MySQL은> 표 binlog_test 드롭;

이 경우, 데이터 binlog_test 테이블은 모두 사라되어야한다.

데이터 복구 - 텍스트 시작

  1. 오프셋 백업에서 첫보기

    1 
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    λ / 데이터 / mysql을 더 test.sql 
    - MySQL은 덤프 10.13 DISTRIB 5.7.18 리눅스 (x86_64의)에 대한
    -
    - 호스트 : localhost를 데이터베이스 : 테스트
    - -------------- ----------------------------------------
    - 서버 버전 5.7.18 로그

    ! / * 40,101 SET @OLD_CHARACTER_SET_CLIENT = @@해서 character_set_client * /;
    ! / * 40,101 SET @OLD_CHARACTER_SET_RESULTS = @@ CHARACTER_SET_RESULTS * /;
    ! / * 40,101 SET의 @OLD_COLLATION_CONNECTION = @@이 collation_connection * /;
    ! / * 40,101 세트 이름 UTF8 * /;
    ! / * 40,103 SET @OLD_TIME_ZONE = @@ TIME_ZONE * /;
    ! / * 40,103 SET의 TIME_ZONE = '+ 0시'* /;
    ! / * 40,014 SET의 @OLD_UNIQUE_CHECKS = @@ UNIQUE_CHECKS, UNIQUE_CHECKS = 0 * /;
    ! / * 40,014 SET @OLD_FOREIGN_KEY_CHECKS = @@ FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0 * /;
    ! / * 40,101 SET @OLD_SQL_MODE = @@ SQL_MODE, SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO'* /;
    ! / * 40,111 SET @OLD_SQL_NOTES = @@ SQL_NOTES, SQL_NOTES = 0 * /;

    -
    - 위치 복구에서 복제 또는 시점을 시작합니다
    -

    - 변경 MASTER는 MASTER_LOG_POS = 627 = 'mysql을-bin.000002'을, MASTER_LOG_FILE TO;

    SQL 백업 파일을 볼 수있는 바와 같이, 파일 오프셋 (offset)는 우리의 백업입니다 MySQL의-bin.000002는 , 오프셋은 627

  2. 보기 명령 싼 오프셋 손

    우리가 봐야한다 이번에는 우리가 수행하는 삭제 작업을 오프셋

    1 
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    λ  /data/mysql  mysqlbinlog --base64-output=decode-rows mysql-bin.000002 | grep Delete -8
    # at 974
    #180717 16:37:59 server id 1 end_log_pos 1046 CRC32 0x19b80686 Query thread_id=6 exec_time=0 error_code=0
    SET TIMESTAMP=1531816679/*!*/;
    BEGIN
    /*!*/;
    # at 1046
    #180717 16:37:59 server id 1 end_log_pos 1100 CRC32 0x2daa51e1 Table_map: `test`.`binlog_test` mapped to number 514
    # at 1100
    #180717 16:37:59 server id 1 end_log_pos 1185 CRC32 0x05ebafa5 Delete_rows: table id 514 flags: STMT_END_F
    # at 1185
    #180717 16:37:59 server id 1 end_log_pos 1216 CRC32 0x56c7fe9e Xid = 80
    COMMIT/*!*/;
    # at 1216
    #180717 16:44:14 server id 1 end_log_pos 1281 CRC32 0xa285c84c Anonymous_GTID last_committed=4 sequence_number=5
    SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
    # at 1281
    #180717 16:44:14 server id 1 end_log_pos 1405 CRC32 0x4474e0a7 Query thread_id=10 exec_time=0 error_code=0

    我们可以看到,在第10行的时候进行了删除操作,在第8行进行了表的map映射查找,那我们这时候,将结束的偏移就可以定位到 mysql-bin.0000021100 position

  3. 生成备份到手贱这段时间的数据

    由于,我们仅仅对test库进行处理,所以我们可以在使用mysqbinlog 处理的时候指定test 库即可,主要用到了以下几个参数,可参考

    1
    2
    3
    4
    5
    6
    7
    λ  /data/mysql  mysqlbinlog --help | grep position -8
    -j, --start-position=#
    Start reading the binlog at position N. Applies to the
    first binlog passed on the command line.
    --stop-position=# Stop reading the binlog at position N. Applies to the
    last binlog passed on the command line.
    -d, --database=name List entries for just this database (local log only).
    1
    mysqlbinlog --start-position=627 --stop-position=1100 --database=test  mysql-bin.000002 > binlog_test_drop.sql

    这样,我们需要的原始备份文件,和中间缺失的时间段的备份文件就都生成好了,下一步就可以恢复了

  4. 恢复

    1
    2
    mysql -uroot -p test < test.sql
    mysql -uroot -p test < binlog_test_drop.sql
  5. 查看一下吧

    1 
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    MySQL의 선택> * binlog_test에서; 
    + ---- +
    | ID |
    + ---- +
    | 1 |
    | 2 |
    | 3 |
    | 4 |
    | 5 |
    | 6 |
    | 7 |
    | 8 |
    | 9 |
    | 10 |
    + ---- +

    따라서, basic're은 물론, 빈 - 로그 데이터를 복구 만 아니라, 수행,뿐만 아니라 MySQL의 마스터와 슬레이브는 다음 기사 완료하기 위해 그에게 의존하는 것입니다, 대한 위의 이야기 "MySQL은 마스터 - 슬레이브 구성"을 합니다 간단히 살펴

원본 : 대형 열  오용의 MySQL의 바이너리 로그 감소를 사용하여


추천

출처www.cnblogs.com/chinatrump/p/11596621.html