[DB] Mysql Replication DB 복제하기 [2]
[mysql replicator 서버 세팅]
작성: 2001년 2월 20일 이홍기(genius@chonga.pe.kr)
문서버전: 0.2 draft
————————————————————————————————-
간단히 세팅해본 후에 세팅 및 주의할 점에 대한 정리라 볼수가 있겠다.
mysql 3.23.x 에서 지원하는 replication기능에 대해 알아보도록 한다.
우선, test라는 database의 replication을 위주로 설명한다.
/usr/local/mysql 이 mysql root라 가정한다.
[mysql replication 의 특징]
*. mysql replication 기능은 1 master node와 다수의 slave node를 지원하고 있으며
각 노드간 암호화는 지원하지 않음(stunnel이용해야함)
*. master는 binary log를 지원하여 이를 slave에서 받아가서 갱신하는 형태로,
slave node 자체에서 변경된 데이터는 master 에 반영되지 않음.
sync는 binary log가 이루어진 시점부터 이루어지며, sync할 db에 대한 대상은
포함 또는 제외가 설정에 의해 가능함.
*. AUTO_INCREMENT와 LAST_INSERT_ID, TIMESTAMP 등을 지원하지만, RAND()는 바로 지원하지
않고, RAND(UNIX_TIMESTAMP()) 의 형태로는 제공하는 듯하다.
[mysql replication 명령어]
FLUSH MASTER or RESET MASTER
FLUSH SLAVE or RESET SLAVE
LOAD TABLE ‘tablename’ FROM MASTER
PURGE MASTER LOGS TO ‘log-name’
[mysql replication 설정]
master node
0. 돌고있던 mysql db를 죽인다. (master노드는 굳이 죽일 필욘 없다.)
1. user 등록
*repl/qlalfqjsgh 유저를 등록
#*GRANT FILE ON *.* TO repl@”%” IDENTIFIED BY ‘<password>’;
*GRANT FILE ON *.* TO repl@”%” IDENTIFIED BY ‘qlalfqjsgh’;
*mysqladmin flush-privileges
2. my.cnf에 다음을 추가한다.
[mysqld]
#for master node
log-bin=/usr/local/mysql/data/replication.log
binlog-do-db=test
server-id=1
3. sync하고자하는 db data(여기서는 test)를 master노드에서 백업
4. mysql restart
slave node
0. 돌고있던 mysql db를 죽인다.
1. sync하고자하는 db data를 master노드에서 가져와서 db-data 디렉토리에 푼다.
3. my.cnf에 다음을 추가한다.
[mysqld]
#for master node
# for slave node
server-id=2
master-host=10.0.0.1
master-user=repl
master-password=qlalfqjsgh
replicate-do-db=test
4. mysql restart
/usr/local/mysql/data 에 master.info 가 생성되었나 본다.
[Replication Test]
master node에서
$ mysql -uroot -p test
mysql> show tables;
+—————-+
| Tables_in_test |
+—————-+
| test |
+—————-+
1 rows in set (0.01 sec)
mysql> select * from test;
mysql> insert into test values (‘hongki’,1); ## slavenode에도 싱크됨
mysql> create table test2 (testid int not null primary key ) ; ## slave node에서도 싱크됨
mysql> SET SQL_LOG_BIN=0; # 이순간부터 sync안됨
mysql> create table test3 (testid int not null primary key ) ; ## slave node에서 싱크안됨
mysql> SET SQL_LOG_BIN=1; # 이순간부터 다시 sync됨
slave node에서 (위를 master노드에서 수행한 이후부터 수행했다고보면)
$ mysql -uroot -p test
mysql> show tables;
+—————-+
| Tables_in_test |
+—————-+
| test |
| test2 |
+—————-+
2 rows in set (0.01 sec)
## test3는 예고한 대로 싱크가 되지 않았음.
mysql> LOAD TABLE test3 FROM MASTER # table test3를 master node로부터 싱크한다.
+—————-+
| Tables_in_test |
+—————-+
| test |
| test2 |
| test3 |
+—————-+
3 rows in set (0.01 sec)
mysql>
## 싱크가 되었다.