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