안녕하세요
Mysql 8.0 replication 설정 방법입니다.
Master
OS : CentOS 7.6
Mysql : 8.0.22
Slave
OS : lubuntu(ubuntu) 20.04
Mysql : 8.0.22
네트워크는 분리되어 있고 Master DB는 원래 데이터가 있는 환경 입니다.
1-1 Replication용 계정 생성 및 replication 권한 부여 (특정 아이피만 가능하게 할경우 % 대신 IP입력)
mysql > CREATE USER '아이디'@'%' IDENTIFIED BY '비밀번호';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'test_user'@'%';
1-2 my.cnf - Mysql Replication 설정
# vi /etc/my.cnf
[mysqld]
max_allowed_packet=1000M
server-id = 1
log-bin = mysql-bin
binlog_format = ROW
max_binlog_size = 500M
sync_binlog = 1
expire-logs-days = 7
binlog_do_db = DB명
max_allowed_packet = log파일 용량 때문에 1gb로 설정하였습니다.
server-id = 1 : 마스터 서버 아이디로 고유값이어야 합니다.
binlog_do_db의 경우 입력하지 않으면 전체 database를 복제하고 입력하면 특정 db만 복제합니다.
sync_binlog = 1 : 동기화 사용
나머지는 필요에 따라 설정하시면 됩니다.
1-3 Mysql 재시작
# systemctl restart mysqld
2-1. my.cnf - Slave Mysql Replication 설정
# vi /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
max_allowed_packet=1000M
server-id = 2 log-bin = mysql-bin binlog_format = ROW max_binlog_size = 500M sync_binlog = 1 expire-logs-days= 7 slow_query_log = 1 read_only = 1
Master 설정과 비슷하나 server-id = 2, read_only =1로 읽기전용 설정 하였습니다.
2-2. mysql 재시작
# sudo systemctl restart mysql
3-1. Master DB 백업
첫번째로 Master DB를 백업해줍니다. 사용중인 dbms나 mysqldump 명령어를 사용합니다.
데이터를 백업하는 동안은 테이블에 락이 걸립니다.
# : 터미널 입력
mysql> mysql 입력
1. 마스터 로그 리셋
mysql> RESET MASTER;
2. 마스터 테이블 락
mysql> FLUSH TABLES WITH READ LOCK;
3. 마스터 상태 확인
- File과 , Position은 Slave DB에 적용해야되기 때문에 따로 적어둡니다.
ex) mysql-bin.00001 / 2038
mysql> SHOW MASTER STATUS;
4. DB 백업
DBMS Tool 사용하여 sqldump 백업 또는 명령어 사용하여 백업
# mysqldump -u root -p db명 > 경로/파일명.sql
5. 백업완료 후 테이블 락 해제 - 백업이 끝난 경우 db 사용 가능합니다.
mysql > UNLOCK TABLES;
3-2. Slave DB
Master DB 백업본으로 복원
1. Slave DB에 백업한 데이터 복원
mysql> CREATE DATABASE DB명;
# mysql -u root -p db명 < 경로/파일명.sql
2. Slave - Master 연결
mssql> RESET SLAVE;
mysql> CHANGE MASTER TO MASTER_HOST='Mast DB IP 주소', MASTER_USER='1-1에서 생성한 replication용 계정', MASTER_PASSWORD='계정 비밀번호', MASTER_LOG_FILE='mysql-bin.00001', MASTER_LOG_POS=2038;
3. Replication 시작
mysql> START REPLICA; ( 8.0 이전버전 START SLAVE)
MASTER_LOG_FILE = '3에서 적어놓은 로그파일'
MASTER _LOG_POST='3에서 적어놓은 로그 포지션'
3-3 Replication 동작 확인
Slave DB에서 아래 명령어를 입력합니다.
mysql> SHOW SLAVE STATUS\G;
Slave_IO_Running : YES
Slave_SQL_Running: YES
정상 연동되는 경우 위 두가지 모두 YES가 출력되어야 하며 하나라도 No가 있다면 정상적으로 동작하지 않는 상태입니다.
이 경우 에러 메세지가 추가로 표기 됩니다.
1062 error
- duplicate entry for key primary 에러가 나는 경우
백업한 시점과 로그 포지션이 안맞을때 PK 중복으로 에러 발생하는 경우입니다.
복원한 slave db에서 해당 테이블의 키 이후 데이터를 지우고 다시 replication을 설정합니다.
1. Replication 중단
mysql> STOP REPLICA (STOP SLAVE);
2. duplicate entry 발생하는 테이블의 해당키부터 이후 데이터 삭제
3. Slave log reset
mysql > RESET SLAVE;
4. mysql> CHANGE MASTER TO
MASTER_HOST='Mast DB IP 주소', MASTER_USER='1-1에서 생성한 replication용 계정', MASTER_PASSWORD='계정 비밀번호', MASTER_LOG_FILE='mysql-bin.00001', MASTER_LOG_POS=2038; # 에러가 계속 나는 경우 POS=0으로도 시도 5.Replication 시작 mysql > START REPLICA; (START SLAVE) 6. 상태확인 mysql > SHOW SLAVE STATUS\G; 7. 다른테이블 에러나는 경우 반복