master-slave 설정을 마치고 확인을 위해 show slave status\G;를 통하여 설정이 완료된것을 확인하였으나 서버 실행 시 slave가 작동하지 않아고 다시 확인하니 아래와 같은 오류가 났음을 확인했다.
Last_SQL_Errno: 1051
Last_SQL_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction 'ANONYMOUS' at source log mysql-bin.000003, end_log_pos 16969. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any.
자세히 오류를 확인하기 위해 performance_schema.replication_applier_status_by_worker 테이블을 조회하여 에레 메세지를 확인하니 아래와 같았다.
select Last_error_message from performance_schema.replication_applier_status_by_worker;
Worker 1 failed executing transaction 'ANONYMOUS' at source log mysql-bin.000003, end_log_pos 16969; Error 'Unknown table 'shoppingmall.Alert,shoppingmall.Brand,shoppingmall.Customer,shoppingmall.CartItem,shoppingmall.Cart,shoppingmall.Item,shoppingmal'' on query. Default database: 'shoppingmall'. Query: 'DROP TABLE `Alert`,`Brand`,`Customer`,`CartItem`,`Cart`,`Item`,`Delivery`,`ImageFile`,`OrderItem`,`MemberShip`,`LikeCount`,`Orders`,`Recipe`,`RecipeItem`,`Review` /* generated by server */'
슬레이브에서 실행하려는 SQL 쿼리가 마스터에는 존재하지만 슬레이브에는 존재하지 않는 테이블을 대상으로 하고 있습니다. 아래와 같이 오류 메시지가 전달되었습니다.
슬레이브에서 복제를 일시적으로 중지합니다.
stop slave;
마스터에서 테이블을 삭제하거나 변경합니다.
저는 JPA의 create옵션으로 인해 Master에만 테이블이 존재하였습니다.
SET foreign_key_checks = 0; # 외래키 체크 중지
DROP TABLE [테이블명]
SET foreign_key_checks = 1; // 다시 체크 설정
SHOW MASTER STATUS; 명령을 사용하여 마스터의 바이너리 로그 파일과 위치를 확인합니다.
슬레이브에서 CHANGE MASTER TO 명령을 사용하여 마스터의 현재 바이너리 로그 위치로 설정합니다.
CHANGE MASTER TO MASTER_HOST='{master-db의 네트워크 IP}',
MASTER_USER='root',
MASTER_PASSWORD='{root 계정의 비밀번호}',
MASTER_LOG_FILE='{master-db의 바이너리 파일 이름}',
MASTER_LOG_POS={master-db에서 조회한 파일 포지션};
슬레이브를 다시 시작하여 복제를 재개합니다.
start slave;
show slave status\G;
Slave_IO_Running과 Slave_SQL_Running이 Yes로 표시되면 복제가 정상적으로 작동하고 있습니다.