MYsql replication 질문 0 1 1,099

by 티라미수꿀맛 [2022.03.20 01:09:45]


안녕하세요 Mysql에 대해 공부하고 있는 학생입니다.

MYSQL Replication 질문을 좀 드리고 싶은데요.

잘 모르겠는 부분이 2가지가 있습니다.

 

1. Replication error ex)1062에러같은경우 

리플리케이션이 async이긴 하지만 마스터에 있는 binarylog를 그대로 slave에 쓰는것일텐데 

왜 slave쪽에 delete 해야될 로우가 없다든가 해서 리플리케이션 에러가 뜨는지 이해가 안됩니다.

즉, 마스터에 들어왔던 dml을 slave에 똑같이 적용하는데 왜 저런 현상이 발생하는건가요?

 

2. slave가 깨졌을시 Master쪽에 masterposition을 구해서 slave에서 시작을 해주는데

가령 , Master 80 , Slave 80번이다가 -> Slave error로 인해 중지

Master는 100번 이면 Slave를 100번에서 시작해! 라고 적용해주라는데요.

이렇게되면 Master에 있던 81번 로그부터 읽으면서 100번까지 다 적용하나요?

아니면 80번에서 그냥 바로 100번부터 시작을하나요? 즉, 81~99번 로그에 있던 데이터는 유실되는건지 궁금합니다.

그렇더라면 81~99번 데이터는 어떻게 보통 복구를 하나요?

 

아는게 좀 부족하여 도움을 얻고자 글 올립니다.

감사합니다.

by 아메바 [2022.03.22 09:42:11]

1. 원인이 다양하지만 결국은 특정 테이블의 PK 중복으로 일어나는 문제입니다.

보통 마스터 수행중에 장비 문제로 mysql deamon이 죽었거나 했을 때 master가 올라오면서 정상복구가 되지 않으면 master에는 적용되지 않았지만 Slave에는 적용된 상태가 될 때가 있습니다. 보통 그럴 때 많이 일어나고

일반적에 사용중에 그런 문제가 발생한다면 쿼리를 날리는 프로그램 로직을 살펴봐야 하겠네요..

운용상 1032, 1062는 슬레이브 에러에서 skip 하는 경우도 있는데 slave-skip-error= 1032,1062 입력하게 되면 해당 에러를 무시하게 됩니다. 그럼 Slave와 Master간의 데이터가 일치하는것은 보장 못하긴 하지만 운용상 편의를 위해 그냥 가는 경우도 있습니다.(정확히 1032,1062 에러가 나는 이유에 대해 확인했을 때)

2. Master가 100이라고 pos를 100으로 지정하게 되면 말씀하신대로 80~100까지 데이터는 날라갑니다.

그래서 show slave status\G 의 에러내용을 확인 하시고, 어떤 문제로 stop이 되었는지 보시면, 보통 어떤 테이블의 어떤 값 때문에 중복이 났는지, 연결이 안된건지 확인 할 수 있습니다.

해당 값에 대해 조치하시고 (값이 있는지, 업데이트가 됐는지, 값이 있다면 Master랑 비교해서 같은지 다른지 등..) stop slave : set global sql_slave_skip_counter=1; start slave; 하시면 됩니다. 1건에 대해서 작업을 넘어가는 것입니다.

binlog를 확인하셔서 해당 pos에 맞는 쿼리를 추출하시고 적용한다음에 넘어가셔도 됩니다.

복구를 한다면 마찬가지로 master의 binlog를 mysqlbinlog 명령어를 이용해서 필요한 구간의 데이터를 뽑아서 수동 입력해주셔야 합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입