• 카테고리

    질문 & 답변
  • 세부 분야

    데이터베이스

  • 해결 여부

    해결됨

SQL Error

22.10.14 17:47 작성 조회수 219

1

안녕하세요 강사님 강의 잘 보고 있습니다 :)

db002가 master이고 db001, db003이 slave로 붙어 있는 상황에서

장애상황을 만드려고 실행중인 master db인 db002를 docker stop을 하고나서 db001이 master로 승격은 잘 됩니다.

 

그 후로 장애가 나서 죽었던 db002를 살려서 master db인 db001의 slave로 붙이려고 db002의 mysql 서버로 들어가서

CHANGE MASTER TO MASTER_HOST='db001', \
MASTER_USER='repl', MASTER_PASSWORD='repl', \
MASTER_AUTO_POSITION=1;

START SLAVE;
SHOW SLAVE STATUS\G

해당 명령어를 사용해서 slave로 붙이려 하면 아래와 같이 SQL 에러가 납니다. 해당 db002엔 이미 테스트용 데이터 베이스와 유저들 그리고 복제 해야할 테이블까지 존재해서 발생하는 오류 같은데요, db002에서 testdb, user들, test용 테이블들을 다 삭제하고 해당 명령어를 다시 사용하면 정상 작동 되는데, 원래 이렇게 문제를 해결하는게 맞을까요 ?? 아니면 다른 방법이 있을까요 ??

 

답변 1

답변을 작성해보세요.

1

안녕하세요.

마스터로 사용되던 db가 장애가 발생해서 Failover가 이루어 지고 이후에 장애가 났던 db를 다시 slave로 연결하는 내용에 대해서 문의를 주셨는데요.

아마도 강의 내용에서는 장애가 발생한 db container를 start 시키고 새로 마스터가 된 db에 change master 명령어를 통해서 slave로 붙이는 형태로 테스트가 진행됐는데요.

만약 이게 실제 상황이라면 각각의 케이스에 따라 처리가 조금씩 달라질 수 있습니다.

가장 일반적인 경우는 이렇게 장애가 발생하게 되면 해당 db를 그대로 다시 slave로 사용하는 경우보다는 새로 마스터가 된 db나 장애가 발생하지 않았던 다른 slave db(db003)을 이용해서 백업 & 복구 절차를 거쳐서 새로 db를 구축한 이후에 새로운 마스터의 slave로 설정을 하게 됩니다.

그 이유는 최초 장애가 발생한 db의 데이터와 failover되서 새로운 마스터가 된 db의 데이터와 데이터 정합성에 문제가 있을 수 있기 때문입니다. 즉 서로 데이터가 달라져 있을 수 있다는 거죠.

그래서 안전하게 새로운 마스터 db의 데이터에서 백업을 통해 동일한 데이터로 slave를 구축하게 됩니다.

만약에 서로 데이터 정합성이 맞는 상태이고 문제가 없는 상황이라면 새로 마스터가 된 db에 데이터 변경이 발생하기 전에 아래 명령어로 binlog file과 position 정보 또는 gtid 정보를 기록해 놓고 해당 정보를 이용해서 재구축 없이 slave로 붙일 수도 있습니다.

새로운 마스터에서 아래 명령어 수행

mysql> show master status;

binlog file과 position 정보 혹은 gtid 정보를 기록.

장애 복구된 db에서

mysql> reset master;

앞에서 기록해 놓은 binlog file과 position정보 또는 gtid 정보를 이용해서 slave 로 세팅

GTID를 사용하지 않는 경우

mysql> change master to master_host='신규-DB-IP',

master_user='repl',

master_password='repl',

master_port=3306,

master_log_file='binlog file명',

master_log_pos=binlog-position;

mysql> start slave;

 

GTID를 사용하는 경우

mysql> SET GLOBAL gtid_purged='gtid 정보';

mysql> change master to master_host='신규-DB-IP',

master_user='repl',

master_password='repl',

master_port=3306,

MASTER_AUTO_POSITION = 1;

mysql> start slave;

 

감사합니다.

sedin님의 프로필

sedin

질문자

2022.10.18

친절한 설명 감사드립니다 !! :)