Mysql 8.0 replication 설정

북마크 추가

안녕하세요

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.Master 설정

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.Slave 설정

* slave는 ubuntu 서버라 경로랑 mysql 명령어가 약간 다릅니다.

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.Replication 적용


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. 다른테이블 에러나는 경우 반복




AD
관리자
2021-01-12 18:08
SHARE