2025-03-04 11:05:17

데이터 가져오기

 

-- 복제 중지
STOP SLAVE;
RESET SLAVE;

-- 복제 설정
CHANGE MASTER TO
  MASTER_HOST='mysql-master',
  MASTER_USER='repl_user',
  MASTER_PASSWORD='repl_password',
  MASTER_AUTO_POSITION=1;

 

# 보안을 이유로 repl_user 를 따로 만들어서 필요한 권한만 만들어주는게 좋습니다

# 당연히 유저는 마스터에서 만듭니다.

-- 복제 시작
START SLAVE;

-- 복제 상태 확인
SHOW SLAVE STATUS\G
```

# 컨테이너 상태 확인
docker stats mysql-master mysql-slave
```

추가 팁:
1. Docker 네트워크 생성하여 컨테이너 간 통신 보장
```bash
docker network create mysql-network
docker network connect mysql-network mysql-master
docker network connect mysql-network mysql-slave
```

2. 바이너리 로그 관리
```bash
# 마스터 컨테이너에서 바이너리 로그 확인
docker exec mysql-master mysql -uroot -p -e "SHOW BINARY LOGS"

# 불필요한 바이너리 로그 정리
docker exec mysql-master mysql -uroot -p -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY)"
```

이러한 설정으로 Docker 환경에서 안정적인 MySQL 복제를 구성할 수 있습니다. 문제가 발생하면 로그를 확인하고 필요한 경우 컨테이너를 재시작하거나 재구성할 수 있습니다.

 

 

 

이제 데이터가 가져와졌으니까 적용합니다.

 

 

1. **마스터 컨테이너 설정**
```yaml
# docker-compose.yml의 mysql-master 부분
mysql-master:
    image: mysql:8.0
    container_name: mysql-master
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydb
      MYSQL_USER: repl_user
      MYSQL_PASSWORD: repl_password
    volumes:
      - ./master//var/lib/mysql
      - ./master/conf:/etc/mysql/conf.d
    ports:
      - "3306:3306"
```

2. **마스터 설정 파일 (master/conf/master.cnf)**
```cnf
[mysqld]
server-id=1
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON
binlog_expire_logs_seconds=604800
```

3. **마스터에서 복제 사용자 생성**
```sql
-- 마스터 MySQL에 접속
docker exec -it mysql-master mysql -uroot -p

-- 복제 사용자 생성 및 권한 부여
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
```

4. **슬레이브 설정 파일 (slave/conf/slave.cnf)**
```cnf
[mysqld]
server-id=2
gtid_mode=ON
enforce-gtid-consistency=ON
```

5. **GTID 기반 복제 설정 (슬레이브에서)**
```sql
-- 슬레이브 MySQL에 접속
docker exec -it mysql-slave mysql -uroot -p

-- 기존 복제 설정 초기화
STOP SLAVE;
RESET SLAVE ALL;

-- GTID 기반 복제 설정
CHANGE REPLICATION SOURCE TO
    SOURCE_HOST='mysql-master',
    SOURCE_USER='repl_user',
    SOURCE_PASSWORD='repl_password',
    SOURCE_AUTO_POSITION=1;

-- 복제 시작
START SLAVE;

-- 복제 상태 확인
SHOW SLAVE STATUS\G
```

6. **복제 상태 확인**
```sql
-- 복제 상태 확인
SHOW SLAVE STATUS\G

-- 주요 확인 사항:
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Last_IO_Error: (비어있어야 함)
-- Last_SQL_Error: (비어있어야 함)
```

7. **문제 해결 시 유용한 명령어**
```sql
-- GTID 상태 확인
SHOW GLOBAL VARIABLES LIKE 'gtid%';

-- 실행된 GTID 트랜잭션 확인
SELECT @@GLOBAL.GTID_EXECUTED;

-- 복제 오류 발생 시 건너뛰기
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
```

주의사항:
1. SOURCE_AUTO_POSITION=1 사용 시에는 SOURCE_LOG_FILE, SOURCE_LOG_POS 등을 지정하지 않습니다.
2. 복제 설정 전에 마스터와 슬레이브의 데이터가 동기화되어 있어야 합니다.
3. 네트워크 설정이 올바르게 되어 있는지 확인하세요.

추가 팁:
```bash
# 컨테이너 간 네트워크 연결 확인
docker network inspect mysql-network

# 컨테이너 로그 확인
docker logs mysql-master
docker logs mysql-slave
```

 

해보면
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: mysql-master
                  Master_User: repl_user
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 837
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 420
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 837
              Relay_Log_Space: 630
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: c8134046-f848-11ef-856a-0242ac120004
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: c8134046-f848-11ef-856a-0242ac120004:1-188,
d4911ee4-f848-11ef-8ea2-0242ac120006:1-176
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set, 1 warning (0.00 sec)

mysql> SHOW TABLES;
+-----------------------+
| Tables_in_flight_data |
+-----------------------+
| booking               |
| flights_data          |
| forprice              |
| user                  |
+-----------------------+
4 rows in set (0.00 sec)

mysql> USE flight_data;
Database changed
mysql> SHOW TABLES;
+-----------------------+
| Tables_in_flight_data |
+-----------------------+
| booking               |
| flights_data          |
| forprice              |
| user                  |
+-----------------------+
4 rows in set (0.00 sec)

mysql> select * from user;
+---------+-----------+-----------+--------------------------------------------------------------+---------------------+--------+---------------+
| user_no | user_name | user_id   | user_pw                                                      | email               | gender | phone         |
+---------+-----------+-----------+--------------------------------------------------------------+---------------------+--------+---------------+
|       1 | ???       | hong123   | password123                                                  | hong@example.com    | ?      | 010-1234-5678 |
|       2 | ???       | kim456    | password456                                                  | kim@example.com     | ?      | 010-8765-4321 |
|       3 | ???       | sonny1234 | $2a$10$GC2lVMMcvULQvNOa2JKZZOag/fgtjM.U4QHD2PLjySReKyliEL0gm | sonny1234@naver.com | M      | 01099991111   |
+---------+-----------+-----------+--------------------------------------------------------------+---------------------+--------+---------------+
3 rows in set (0.00 sec)

'SQL&DB' 카테고리의 다른 글

mysql server_id  (0) 2025.03.04
MYSQL-DOCKER 에서 데이터 탑재  (0) 2025.03.04
DB 두 가지 복제 방식을 비교  (0) 2025.02.27
Mysql-Master&Slave 구성  (0) 2025.02.27
mysql-commit  (0) 2025.02.27