본문 바로가기

Technical/DBMS

MySQL 수동 동기화 - Master read lock 또는 shutdown 없이 동기화 하기


상용 운영 상태에서 Database를 shutdown하는 의사 결정이 쉽지 않은데, 2대의 Replication 데이터베이스들의 동기화가 깨졌을 때는 이 방법을 쓰도록 한다.
Dual Master 구성일 경우 M1:10.0.3.71, M2:10.0.3.72, 동기화할 대상 DB는 my_db 라고 가정하고 아래와 같이 진행한다. 단, 양쪽 데이터베이스를 모두 Running 상태로 유지하되, Read/Write 작업은 M1(동기화 원본) 쪽에서만 일어나는 상황이어야 한다.

M1> slave stop;
M1> reset slave;
M2> slave stop;
M2> reset slave;
M2> drop database my_db;
M2> create database my_db;

M1# mysqldump -uroot -ppassword --databases my_db --opt --master-data=2 >  mysql_data_20110101.sql
M2# scp root@10.0.3.71:mysql_data_20110101.sql /workdir
M2# grep MASTER_LOG_FILE /workdir/mysql_data_20110101.sql 
M2# head -25 /workdir/mysql_data_20110101.sql

 
위에서 grep으로 검색 된 결과에서 head를 수행한 결과, 25 라인 정도 위치에 있는 MASTER_LOG_FILE, MASTER_LOG_POS 값을 이용해야 하니 따로 메모 또는 에디터로 복사해 둔다.
(전체 데이터베이스를 동기화하고 싶을 경우, --databases my_db 옵션 대신
--all-databases=TRUE 옵션을 사용한다)

M2# mysql -uroot -ppassword < /workdir/mysql_data_20110101.sql
M2> flush logs;
M2> reset slave;
M2> change master to master_host='10.0.3.71', master_user='root', master_password='password', master_log_file='mysql-bin.000019', master_log_pos=429;

메모 또는 복사해 둔 2개의 값(예: mysql-bin.000019, 419) 을 사용하여 동기화를 수행한다.

M2> slave start;
M2> show slave status; 

 Slave 쓰레드를 기동하고 상태를 확인한다.

M2> show master status;
M1> flush logs;
M1> reset slave;
M1> change master to master_host='10.0.3.72', master_user='root', master_password='password', master_log_file='mysql-bin.000022', master_log_pos=106;
M1> slave start;
M1> show slave status; 

 M2 의 로그파일과 위치를 이용해서 M1을 동기화하고, Slave 쓰레드를 기동하고 상태를 확인한다. 최종 점검을 위해서 test 테이블을 생성하고 양쪽에서 insert 를 수행하고 동기화가 되는지 확인하도록 한다.