MySQL

[MySQL] Replication Master To Slave

bbugge 2019. 7. 2. 15:54

MASTER TO SLAVE

A server - IP : 10.0.2.10

 

$ vi my.cnf
// 아래 내용을 추가해준다.
[mysqld]
bind-address     = 10.0.2.10
server-id        = 1                          // 서버 고유아이디, Slave와 다르게 설정
log-bin          = mysql-bin               // MySQL(오라클의 redo로그와 유사) 로그생성 설정
expire_logs_days = 7                      // 로그 보관주기 설정(일)




/*
* 참고(binlog_do_db/replicate-do-db 차이)
- binlog_do_db : Master 기준 어떤 DB를 Replication 허용할 것인지 설정(제외조건 binlog_ignore_db)
- replicate-do-db : Slave 기준 어떤 DB를 Replication 할 것인지 설정(제외조건 replicate-ignore-db)
*/




$ service mysqld restart             // mysql을 재실행




// 이중화할 때 사용될 사용자 계정 생성 및 권한 설정
mysql> CREATE USER 'replicator'@'%' IDENTIFIED BY 'replicator';
mysql> FLUSH PRIVILEGES;
mysql> GRANT SELECT, PROCESS, FILE, SUPER, REPLICATION CLIENT, REPLICATION SLAVE, RELOAD ON *.* TO 'replicator'@'%' IDENTIFIED BY 'replicator'   // 8버전에서는 IDENTIFIED BY를 붙이지 않는다. 그럼에도 불구하고 이중화가 안됨.
mysql> FLUSH PRIVILEGES;










// 데이터 변경을 막고 mysqldump 명령어를 이용하여 dump파일을 만든다. (READ LOCK or shutdown)
mysql> FLUSH TABLES WITH READ LOCK; // READ LOCK을 할 경우 해당 명령어 수행 후 세션을 나가면 LOCK이 풀립니다.
mysql> \! mysqldump -u root -p --all-dataabases --master-data > dbdump.db


## OR ##


$ service mysqld stop
$ mysqldump -u root -p --all-databases --master-data > dbdump.db  // --master-data 옵션을 붙여주게 되면 slave에 적용할 'CHANGE MASTER TO' 변환 작업을 해줄 필요 없게 해줌.




// READ LOCK을 풀어주거나 mysql을 start 해준다.
mysql> UNLOCK TABLES;


## OR ##


$ service mysqld start

 

 

B server - IP : 10.0.2.20

$ vi my.cnf
// 아래 내용을 추가해준다.
[mysqld]
bind-address     = 10.0.2.20
server-id        = 2                          // 서버 고유아이디, Slave와 다르게 설정
replicate-do-db  = repl              // Replication 대상 DB 지정, 이 옵션을 제거시 모든 DB 복제




// dump한 파일을 B server로 옮긴다.
$ scp root@10.0.2.10:/mysql/mysql_home/dbdump.db /mysql/mysql_home/




// 가져온 dump 파일을 B server에 적용시킨다.
$ mysql -u root -p -h master < /mysql/mysql_home/dbdump.db  // '-h master' 옵션을 사용하면 'CHANGE MASTER TO' 구문 설정을 정의해주는 듯하나, 필자는 해당 구문 에러가 나서 '-h master' 옵션을 제거하고 실행 함. (MySQL Manual 8.0 기준)

 

// A server의 master 정보를 확인한다.

 

// A server의 master 정보 B server slave에 설정된 값이 일치하지 않으면 직접 설정 그렇지 않으면 그냥 start slave 해준다.
mysql> stop slave;
mysql> change master to master_host='10.0.2.10', master_user='replicator', master_password='replicator', master_log_file='mysql-bin.000004',master_log_pos=1794;
mysql> start slave;

 

A server

// 생성하고자 하는 데이터베이스를 생성하여 잘 동작하는지 확인.
mysql> create database repl;




// 생성된 데이터베이스에 테이블 생성하여 사용하고자 한다면 권한을 추가해줘야한다.
mysql> GRANT CREATE, DROP ON repl.* TO 'replicator'@'%' IDENTIFIED BY 'replicator';
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 VARCHAR(30));
mysql> GRANT ALTER, SELECT, DELETE, UPDATE, INSERT ON repl.t1 TO 'replicator'@'%' IDENTIFIED BY 'replicator';
mysql> insert into t1 values (1,'xxxx');

 

B server

 

// slave 상태 확인

mysql> show slave status \G;

 

// Last_Errono 와 Last_Error 의 내용이 없다면 성공적으로 replication 수행 중


// 생성된 데이터베이스에 테이블 생성하여 사용하고자 한다면 권한을 추가해줘야한다.
mysql> GRANT CREATE, DROP ON repl.* TO 'replicator'@'%' IDENTIFIED BY 'replicator';
mysql> GRANT ALTER, SELECT, DELETE, UPDATE, INSERT ON repl.t1 TO 'replicator'@'%' IDENTIFIED BY 'replicator';

 

 

 

# 한 서버에 Master to Slave 로 설정하는 방법을 설명하는 글

https://www.toptal.com/mysql/mysql-master-slave-replication-tutorial