일주일간의 삽질로 완성하다. 부디 다른분은 삽질하지 마시라고.. 
 
## mysql로 replication 하기 2004.1.27 by bluesoul@news.hani.co.kr 
 
+ 환경 
master 서버 : 리눅스 2.4.18, mysql 4.0.13 
slave 서버 : 리눅스 2.4.20 레드햇9.0, mysql 4.0.17 
 
+ master 서버 셋팅 
1. 마스터에서 replication을 위한 사용자를 추가한다 
 mysql> grant file on *.* to repl@"%" identified by "패스워드" ; 
 repl대신 자신이 원하는 아이디 사용해도 된다. 
 % 대신 해당 아이피를 써도 된다. 
 
 주의)repl 계정의 권한에서 Repl_slave_priv, Repl_client_priv 가 yes로 되어있어야 한다. 확인하려면 mysql디비의 select * from user 에서 
  
2. /etc/my.cnf 파일을 카피하고 수정한다. 
 mysql을 처음 설치하면 support-files/ 디렉토리 밑에  
 my-huge.cnf(1G~2G), my-large.cnf(512M), my-medium.cnf(64~256M), my-small.cnf(64M)  
 중에 메모리 크기에 맞게 한가지를 카피한다. 
  
 my.cnf 에서 아래와 같이 해준다. 
  
	 # Replication Master Server (default) 
	 # binary logging is required for replication 
	 log-bin 
	 binlog-do-db=test //복제할 디비명 
	 
	 # required unique id between 1 and 2^32 - 1 
	 # defaults to 1 if master-host is not set 
	 # but will not function as a master if omitted 
	 server-id = 1 //unique 한 값이어야 한다. 
	  
3. slave서버와 동기화 하기 
   - 테이블 락을 걸어서 쓰기 방지를 해놓고 데이터 옮긴후 풀어준다. 
    물론 디비서버 죽이고 해도 되면 더 좋다. 
    mysql>lock tables koko read; 	  
    mysql>unlock tables; 
 
 - dump해서 똑같은 디비명으로 생성하여 로드해도 된다. 
 테스트디비만 백업 
 # ./mysqldump -uroot -p패스워드 test > test.sql 
  
 복구 
 # ./mysql -uroot -p패스워드 test < test.sql 
  
   
 - 자신이 설치한 mysql 데이터 디렉토리에 가면 해당 디비이름의 디렉토리가 
 있다. 거기에 있는 파일을 tar로 묶어서 slave에 데이터있는 디렉토리에 마찬가지로 풀어놓기만 
 하면 된다. 
  
  
4. master 서버의 mysql 재시작 
  
 # /etc/rc.d/init.d/mysql.server stop 
 # /etc/rc.d/init.d/mysql.server start 
  
 mysql>show master status;  
 +---------------+----------+--------------+------------------+ 
 | File  | Position | Binlog_do_db | Binlog_ignore_db | 
 +---------------+----------+--------------+------------------+ 
 | peace-bin.007 | 159 | test  |   | 
 +---------------+----------+--------------+------------------+ 
  
 peace-bin.007과 159 를 기억해두자 slave 서버에 셋팅할때 쓴다. 
  
  
+ slave 서버 셋팅 
 
1. my.cnf 설정 
 server-id = 2 			//master 서버(server-id =1)와 다른값 
 master-host = 211.233.22.187		//master 서버 아이피	 
 master-user = 아이디			//리플리케이션할 계정아이디 
 master-password = 패스워드 
 master-port = 3306 
 slave-skip-errors=all 
 replicate-do-db = test		//리플리케이션할 디비명 
  
  
2. 이렇게 설정하고 mysql을 재가동하면 된다. 
 
3. 문제가 있을경우 데이터 디렉토리에 보면 호스트이름.err에 로그가 남는다. 
 확인해서 수정한후 재가동하자 
  
 040127 16:57:08 Slave I/O thread: connected to master 'repl@211.233.22.187:3306',  
 replication started in log 'peace-bin.007' at position 79 
 위와 같은 문장이 있으면 성공한것이다. 
  
 - 데이터 디렉토리에 master.info master 관련 정보가 있다. 직접 수정하여도 되고 
 아래와 같이 sql문으로 수정할수도 있다.  
 mysql>change master to  
  >master_host='host_string'  
  >master_user='user_name'  
  >master_port=prot_no  
  >master_password='password'  
  >master_log_file='log_file_name'  
  >master_log_pos=pos_no;  
  
 요문장을 수행하기전에 
 mysql>slave stop; 하고 나서 하자  
  
 시작은 
 mysql>slave start; 
  
4. 확인 
 mysql> show slave statusG // 그냥 ; 로 끝나면 보기 어렵게 나온다. G 옵션 뒤에 ; 빼고 해보자 
 아래와 같이 나온다. 
  
*************************** 1. row *************************** 
  Master_Host: 211.233.22.187 
  Master_User: repl 
  Master_Port: 3306 
 Connect_retry: 60 
 Master_Log_File: peace-bin.007 
 Read_Master_Log_Pos: 159 
 Relay_Log_File: bluesoul2-relay-bin.002 
 Relay_Log_Pos: 84 
Relay_Master_Log_File: peace-bin.007 
 Slave_IO_Running: Yes 
 Slave_SQL_Running: Yes 
 Replicate_do_db: test 
 Replicate_ignore_db:  
  Last_errno: 0 
  Last_error:  
  Skip_counter: 0 
 Exec_master_log_pos: 159 
 Relay_log_space: 84 
1 row in set (0.00 sec) 
 
 
 여기서 Read_Master_Log_Pos: 159 요 값이 아까 master서버에서 show master status할때 나온값가 같아야 한다. 
  
 아래와 같이 나오면 정상이다. 
 mysql> show processlistG 
*************************** 1. row *************************** 
 Id: 1 
 User: system user 
 Host:  
 db: NULL 
Command: Connect 
 Time: 3635 
 State: Waiting for master to send event 
 Info: NULL 
*************************** 2. row *************************** 
 Id: 2 
 User: system user 
 Host:  
 db: NULL 
Command: Connect 
 Time: 1913 
 State: Has read all relay log; waiting for the I/O slave thread to update it 
 Info: NULL 
*************************** 3. row *************************** 
 Id: 4 
 User: root 
 Host: localhost 
 db: NULL 
Command: Query 
 Time: 0 
 State: NULL 
 Info: show processlist 
3 rows in set (0.00 sec) 
 
 
+ 진짜 확인  
master 서버에서 업데이트, 인서트, 딜리트해보자.. slave서버에 반영된걸 확인할수 있다. 
 
참고로 create구문은 리플리케이션 안된다. 
마스터에서 디비 크리에이트하면 슬레이브에 반영안된다는 뜻이다. 
 
 
  
  
 
  
	
	
		날짜: 2004-01-27 18:09:28,
	조회수: 10501	  |