MySQL 8.0 기반 데이터베이스 복제 실습
레포지토리에서 제공하는 자동화 스크립트들도 꼭 한번 확인해보길 바란다.
docker-entrypoint-initdb.d에서 User 생성, 권한 부여, 복제 구성 설정 등을 자동화하고 있다.
01-init-user.sql: 복제를 담당할 User 생성 및 권한 부여 (Master Node)02-configure-replication.sql: Slave Node에서 실행될 복제 구성
실습한 내용은 Github Repository에서 확인할 수 있다.
https://github.com/downfa11/mysql-replication
GitHub - downfa11/mysql-replication: MySQL 8.0 기반 데이터베이스 복제와 GTID mode 실습
MySQL 8.0 기반 데이터베이스 복제와 GTID mode 실습. Contribute to downfa11/mysql-replication development by creating an account on GitHub.
github.com
📁 디렉토리 구조
.
├── README.md
├── master/
│ ├── init/
│ │ └── 01-init-user.sql
│ └── my.cnf
├── slave/
│ ├── init/
│ │ └── 02-configure-replication.sql
│ └── my.cnf
├── docker-compose.yml
MySQL 8.0 복제(Replication)
1. Docker-compose 실행
docker-compose up -d
mysql-masterport: 3307mysql-slaveport: 3308
아, 그리고 각 노드의 my.cnf 파일에서 미리 server-id를 설정하고 있지만, 권한 상태(777 → 644)를 변경해둬야한다.
권한이 너무 크면 MySQL가 자체적으로 막아버리고, default인 server-id=1로 중복된 상태로 master,slave 노드가 생성된다.
chmod 작업을 통해서 권한을 제한해둬야 정상적으로 각 노드가 서로 다른 server-id를 갖게 된다.

2. Master Node의 상태 확인
docker exec -it mysql-master mysql -uroot -prootpw -e "SHOW MASTER STATUS\G"
File,Position값을 복제 구성에서 설정

복제 구성을 Slave 노드에서 실행할때 로그 파일명과 위치(Position)을 기록해둬야한다.
4. Master Node 덤프 파일 생성 및 Slave 복원
docker exec mysql-master sh -c "mysqldump -uroot -prootpw --all-databases --master-data=2" > dbdump.sql
docker cp dbdump.sql mysql-slave:/dbdump.sql
docker exec -i mysql-slave mysql -uroot -prootpw < /dbdump.sql
복제를 진행하기 전에 혹시 모를 사태를 대비해서 mysqldump 스냅샷을 찍어둔다.
5. Slave Node의 복제 구성
docker exec -it mysql-slave mysql -uroot -prootpw -e "
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='replpw',
MASTER_LOG_FILE=,
MASTER_LOG_POS=;
START SLAVE;"
MASTER_LOG_FILE,MASTER_LOG_POS는 3번 항목에서 진행한대로,SHOW MASTER STATUS를 통해서 실제 자동 생성된 로그 파일 이름을 확인해야한다.
6. 복제(Replication) 확인
docker exec -it mysql-slave mysql -uroot -prootpw -e "SHOW SLAVE STATUS\G"
Slave_IO_Running,Slave_SQL_Running이 Yes인지 확인

정상적으로 복제에 성공한 모습
출처 및 인용
'mysql' 카테고리의 다른 글
| MySQL 8.0의 GTID 복제(Replication) 및 mode 변경 실습 (0) | 2025.06.18 |
|---|---|
| MySQL Full-text Search가 항상 LIKE보다 뛰어난 성능을 내는가? (3) | 2025.06.13 |
| Entity 계층 구조에 따른 상속 관계에 대하여 알아보자 (0) | 2025.04.01 |
| 데이터베이스 인덱스는 왜 B-tree를 사용하는가? (0) | 2025.03.12 |
| 토이프로젝트 - 트랜잭션 관리를 통한 베타락(Exclusive Lock) 구현 (0) | 2024.11.22 |