백업을 받아 줄 Slave를 설정해 보자.
이미 Master DB에 어느정도 데이터가 쌓여 있었다면 Slave설정만으로 단순히 Replication백업이 되지 않는다.
Master DB에 있는 데이터를 Slave에 넣은 후에 Replication을 진행 시켜야 한다.
그럼 dump를 통해 얻은 데이터를 이용하면 되지 않을까해서 찾아 봤더니, Master DB를 멈춘 상태에서 Dump를 받아야하고 그 시점의 Master DB의 상태를 알아야 한단다.
디비 정지 => 서비스 중지
이용자가 적고 데이터 양도 많지 않다면 은근 슬쩍 할 수도 있겠는데, 미니블로그 같은 서비스를 하고 있다면 이건 큰 부담이 된다.
어쩌겠는가...까라면 까야지...그래서 아주 이른 아침 5시에서 7시 사이에 하기로 했다.
Master DB 백업* 데이터를 옮기는 방법으로는 보통 2가지가 있을 거다. 첫번째는 Master DB의 데이터 파일을 전부 Slave DB서버에 복사하는 방법이다. 두번째는 mysql의 dump를 통해 받은 데이터 파일을 Slave DB에 넣는 방법이 있다. 어느쪽이 좋은지는 잘 모르겠다. 첫번째 방법을 사용해 봤지만, 설정등이 정확히 일치 하지 않으면 오류 메시지를 지속적으로 보게 되어 귀찮았다.
안전하게(?) 두번째 mysqldump를 통해 데이터를 옮긴다.
1. Master DB의 테이블들에 LOCK을 설정한다.
mysql> FLUSH TABLES WITH READ LOCK;
2. Master DB의 Status를 확인하여 File이름과 Position을 기록해 둔다.
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000015 | 88857076 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
3. mysqldump를 통해 DB를 백업 받는다. 여기서 데이터 양에 따라 중지 시간이 결정된다.
$ mysqldump -uxxxxxx -pyyyyyy DB명 > db_backup.sql
4. dump가 끝났으면 Master DB의 LOCK을 해제해 준다. 정상적인 서비스를 제공하게 된다. 이후부터는 서비스에 영향을 주지 않는다.
mysql> UNLOCK TABLES;
LOCK이 해제 된 후 STATUS를 확인 해 보면 Position이 증가하고 있음을 알 수 있다.
5. Slave DB서버에 dump된 파일을 Upload하여 백업한다.
Slave 설정1. Master DB처럼 Slave DB서버의 my.cnf파일을 찾아서 간단히 아래 내용을 넣고 DB를 재기동한다.
[mysqld]
server-id = 2 # 식별자이므로 중복되지 않도록한다. slave가 여러개 일 수 있으므로...
2. Slave DB의 MySQL에 접속하여 다음 설정을 한다.
mysql> CHANGE MASTER TO
MASTER_HOST='Master DB의 ip주소',
MASTER_USER='접속 userid', <- Master DB에서 Grant로 설정했던 id
MASTER_PASSWORD='비밀번호',
MASTER_LOG_FILE='Master DB의 Status에 기록된 파일',
MASTER_LOG_POS=123456; <- Master DB의 Status에 기록된 Position
3. 다음 명령어를 통해 Replication을 시작한다
mysql> START slave;
4. Replication 상태를 확인해 보자.
mysql> show slave status;
+----------------------------------+--------------+-------------+-------------+---------------+------------------+---------------------+-------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Slave_IO_State | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master |
+----------------------------------+--------------+-------------+-------------+---------------+------------------+---------------------+-------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Waiting for master to send event | 192.168.4.69 | haru4b | 3306 | 60 | mysql-bin.000015 | 88855077 | mysqld-relay-bin.000004 | 2492730 | mysql-bin.000015 | Yes | Yes | | | | | | | 0 | | 0 | 88855077 | 2492730 | None | | 0 | No | | | | | | 0 |
+----------------------------------+--------------+-------------+-------------+---------------+------------------+---------------------+-------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
1 row in set (0.00 sec)
보기가 좀 어렵다. 아래와 같이 입력하면 정리된 결과를 얻을 수 있다. '\G'를 추가한다.
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.69
Master_User: haru
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000015
Read_Master_Log_Pos: 88854250
Relay_Log_File: mysqld-relay-bin.000004
Relay_Log_Pos: 2491903
Relay_Master_Log_File: mysql-bin.000015
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 88854250
Relay_Log_Space: 2491903
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
"Last_Error: "에 오류 메시지가 나오면 해당 로그를 삭제 하거나 데이터에 대한 조작을 통해 해결을 해 준다.
Slave DB의 Status에서 Log_Pos가 정상적으로 증가하고 Master DB의 Position과 거의 동일하게 된다면 실시간으로 동기화가 되고 있는 것이다. 즉, 백업이 되고 있는 것이다.
이로서 백업 DB의 설치는 끝났다.