2011-08-23 2 views
0

현재 mysql 5.1.45를 사용하여 마스터 마스터 (A와 B가 기본 마스터 인 경우) 복제 설정이 있습니다. 데이터는 15GB 이상입니다. 중복 키 오류가 발생할 때마다 sql_slave_skip_counter를 1로 설정하고 슬레이브를 다시 시작했습니다. 여러 달 동안이 작업이 완료되었습니다. 이제는 A와 B에 많은 차이가 있으며 엄청난 양의 데이터로 인해 불일치를 해결할 수 없습니다.라이브 데이터에 MySql 복제 문제가 발생했습니다.

이렇게하면 내가했던 서버 B를 다시 만들 수있는 옵션이 남았습니다. 나는 A에서 덤프를 가져다가 B로 복사했습니다. A는 생산품이며 다운 타임을 감당할 수는 없습니다. A의 2 진 로그 파일은 bin.001115 주위에 있으며, 여기서 덤프 후 2 진 로그는 bin.000012입니다.

두 서버 모두에서 마스터 로그 위치를 변경하는 방법에 대해이 단계를 수행 한 후에 혼동 스럽습니다. 마스터 로그 파일과 위치를 A (B의 쇼 마스터 상태에서)로 설정하고 마스터 로그 파일과 B의 위치 (A의 쇼 마스터 상태에서)를 설정했습니다.

올바른 접근법을 따른다면 누군가 말해 줄 수 있습니까?

이 후에도 중복 키 오류가 계속 표시됩니까? 이 중복 키 오류를 피할 수있는 방법이 있습니까? 아니면 원시 데이터 복제를 할 수있는 메커니즘이 있습니까?

답장을 보내 주셔서 감사합니다.

+0

나에게 도움이되는 한 가지는 LVM 파티션에서 내 마스터를 실행하는 것입니다. 복제 서버를 다시 초기화하고 싶을 때, 'FLUSH TABLES WITH READ LOCK'을하고, mysql을 멈추고, 스냅 샷을 취하고, mysql을 다시 시작한다. 그런 다음 여유 시간에 스냅 샷의 파일을 복사 할 수 있습니다. –

+0

그러나, 나는 주 마스터에서 mysql을 멈출 수 없다 :(. –

답변

1

A (주 서버)에 내 절차

여기에 덧붙이 기 :

  1. 정지 노예;
  2. 리셋 마스터; (재설정 할 필요는 없지만 새로 시작하면 혼동을 피할 수 있습니다.)
  3. 리셋 슬레이브;

    1. 다시 설치를하고 --skip-slave-start 옵션으로 mysqld를 다시 시작
    2. 는 B에 --master-data

    와 덤프을.

  4. 복제 사용자 이름 및 암호 만들기
  5. 덤프에서 복원
  6. 재설정 마스터; (슬레이브를 재설정하지 마십시오. 우리는 노예를 재설정하면 B의 데이터는 복제되지 않습니다)
  7. 시작 슬레이브 (이것은의 차이점을 동기화합니다)
  8. 다시 시작 MySQL의를 --skip-slave-start 옵션을 사용하지 않고. A의

:

  1. 시작 노예;

그리고 나는 auto_increment_increment 옵션에 동의합니다. 내 두 서버가 그렇게 설정되어 있습니다.

4

로그 위치와 서버 B와 A를 동기화하는 경우 : 불행히도 서버가 실행되는 동안 SQL 덤프를 만드는 것은 일부 테이블이 작성된 이후에 작성되었을 수 있으므로 결국에는 깨끗한 스냅 샷을 제공하지 않습니다. 덤프가 완료되기 전에 덤프에 추가되었습니다.

1)

2 B

에 로그인/복제를 중지) 로그를 가져 오기 : 당신은 이미 여기에 당신이 시도 할 수 있습니다 뭔가 당신이 전체 잠금을하거나 데이터 파일을 복사하기 위해 서버를 중지 할 수 없습니다 것을 주장

3에 위치) SQL)이

4 덤프 덤프에서 B를 복원합니다

5) 구성 옵션 slave_skip_errors과 함께 시작 B는 = 모든 (참조 : http://dev.mysql.com/doc/refman/5.1/en/replication-options-slave.html#option_mysqld_slave-skip-errors)

6) 2에서 얻은 위치)

7) B 캐치하자에서 시작 B의 복제

8) 읽으 다시 최대 : 그것이 작동하는 경우 키 미래의 오류, 변경 설정을 복제 방지 slave_skip_errors없이 당신이

9) 다시 시작 B에 대한

10)는

에 시작 B의 기록은 미래에 중복 키 오류를 가진 방지하려면 다음과

당신이 가진 서버의 수를 가지고 (이 경우 2) = [그 숫자] 1에서 시작하여 각 서버

예를 들어 최대 1 가고, 각 서버의 auto_increment_offset를 설정 설정 각 서버의 auto_increment_increment :

A의 설정

auto_increment_increment=2 
auto_increment_offset=1 

B의 설정

auto_increment_increment=2 
auto_increment_offset=2 

A가

http://dev.mysql.com/doc/refman/5.1/en/replication-options-master.html#sysvar_auto_increment_increment#auto_increment_increment

명심 ... B는 2,4,6,8를 생성합니다 ..., 1,3,5,7처럼 자동 증가 ID 년대를 생성하는 것도 slave_skip_errors = A와 B가 중복되어 있고 자동 증가가 아닌 키를 삽입하는 경우 모두 또는 사용자 정의 자동 증가가 데이터 일관성을 유지하는 데 도움이됩니다 (예 : 코드에 의해 생성 된 기본 키).

관련 문제