MySQL 복제 · 3 min read · Nov 20, 2025

Debian 8.4 Jessie에서 ISPConfig 3.1로 웹, 이메일 및 MySQL 데이터베이스 클러스터 설치 - 페이지 2

5. MySQL 마스터-마스터 복제

5.1 Server1 준비하기

MySQL에 로그인하고 MySQL에서 복제를 위해 특별히 계정을 생성합니다. 저는 복제를 위해 별도의 사용자를 사용하여 다른 계정이 손상될 가능성을 최소화합니다 (사용자 이름과 비밀번호는 마스터 정보 저장소 파일이나 테이블에 일반 텍스트로 저장됩니다):

CREATE USER 'slaveuser2'@'server2.example.tld' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser2'@'192.168.0.106' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser2'@'2001:db8::2' IDENTIFIED BY 'slave_user_password';

그리고 REPLICATION SLAVE 권한을 부여합니다:

GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'server2.example.tld';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'192.168.0.106';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'2001:db8::2';  
QUIT;

복제를 위해 MySQL-Config에 몇 가지 변경을 합니다:

vi /etc/mysql/my.cnf

[mysqld]로 시작하는 섹션을 찾아 다음 옵션을 추가합니다 (모든 기존 충돌하는 옵션은 주석 처리합니다):

[...]  
[mysqld]  
server-id                = 1  
replicate-same-server-id = 0  
auto-increment-increment = 2  
auto-increment-offset    = 1  
log_bin                  = mysql-bin.log  
expire_logs_days         = 10  
max_binlog_size          = 100M  
binlog_format            = mixed  
sync_binlog              = 1  
relay-log                = slave-relay.log  
relay-log-index          = slave-relay-log.index  
slave_skip_errors        = 1007,1008,1050, 1396  
bind-address             = ::

그 후 MySQL을 재시작합니다:

service mysql restart

저는 단순히 일부 슬레이브 오류를 건너뜁니다. 이에 대한 설명은 제 블로그에 있습니다:

  • 1007 = 데이터베이스 ‘%s’를 생성할 수 없습니다; 데이터베이스가 존재합니다
  • 1008 = 데이터베이스 ‘%s’를 삭제할 수 없습니다; 데이터베이스가 존재하지 않습니다
  • 1050 = 테이블 ‘%s’가 이미 존재합니다
  • 1396 = %s에 대한 작업 %s 실패 - 사용자를 생성할 수 없습니다

MySQL 오류 코드 목록은 여기에서 확인할 수 있습니다: 서버 오류 코드 및 메시지

5.2 Server2 준비하기

복제를 위해 MySQL-Config에 몇 가지 변경을 합니다:

vi /etc/mysql/my.cnf

[mysqld]로 시작하는 섹션을 찾아 다음 옵션을 추가합니다 (모든 기존 충돌하는 옵션은 주석 처리합니다):

[...]  
[mysqld]  
server-id                = 2  
log_bin                  = mysql-bin.log  
expire_logs_days         = 10  
max_binlog_size          = 100M  
binlog_format            = mixed  
sync_binlog              = 1  
slave_skip_errors        = 1007,1008,1050, 1396

5.3 server1의 기존 데이터베이스 스냅샷 생성

server1의 데이터베이스를 덤프하고 MySQL 루트 비밀번호를 입력합니다:

mysqldump -p --all-databases --allow-keywords --master-data --events --single-transaction > /root/mysqldump.sql

덤프를 server2로 복사합니다:

scp /root/mysqldump.sql [email protected]:/root

5.4 server2에서 덤프 가져오기

mysql -u root -p < /root/mysqldump.sql

server2에서 mysql을 종료합니다:

service mysql stop

server1에서 server2로 MySQL의 기본 파일을 복사합니다. server1로 전환하고 다음을 실행합니다:

scp /etc/mysql/debian.cnf [email protected]:/etc/mysql/debian.cnf

server2에서 MySQL을 시작합니다:

service mysql start

그리고 MySQL에 로그인하여 마스터 서버를 설정합니다:

CHANGE MASTER TO MASTER_HOST="server1.example.tld", MASTER_USER="slaveuser2", MASTER_PASSWORD="slave_user_password";

슬레이브를 시작합니다:

START SLAVE;

슬레이브 상태를 확인합니다:

SHOW SLAVE STATUS \G

결과는 다음과 같을 것입니다:

************************* 1. row ***********************  
               Slave_IO_State: Waiting for master to send event  
                  Master_Host: server1.example.tld  
                  Master_User: slaveuser2  
                  Master_Port: 3306  
                Connect_Retry: 60  
              Master_Log_File: mysql-bin.000001  
          Read_Master_Log_Pos: 109989  
               Relay_Log_File: mysqld-relay-bin.000002  
                Relay_Log_Pos: 110276  
        Relay_Master_Log_File: mysql-bin.000001  
             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: 109989  
              Relay_Log_Space: 110574  
              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  
Master_SSL_Verify_Server_Cert: No  
                Last_IO_Errno: 0  
                Last_IO_Error:  
               Last_SQL_Errno: 0  
               Last_SQL_Error:  
  Replicate_Ignore_Server_Ids:  
             Master_Server_Id: 1  
               Master_SSL_Crl:  
           Master_SSL_Crlpath:  
                   Using_Gtid: No  
                  Gtid_IO_Pos:

“Seconds Behind Master”가 0이 아니면 슬레이브가 마스터로부터 모든 데이터를 읽을 때까지 기다립니다 (현재 값을 얻기 위해 명령을 반복합니다). server2가 올바른 마스터 로그 및 로그 위치를 사용하고 있는지 확인합니다.

server1에서 MySQL에서 다음을 실행합니다:

SHOW MASTER STATUS \G
*********************** 1. row *************************  
            File: mysql-bin.000991  
        Position: 69185362  
    Binlog_Do_DB:  
Binlog_Ignore_DB:  
1 row in set (0.00 sec)

그리고 복제 마스터 바이너리 로그 좌표를 비교합니다.

우리는 server1이 마스터이고 server2가 슬레이브인 MySQL 마스터-슬레이브 복제를 실행하고 있습니다.

5.5 MySQL 마스터-마스터 복제

복제를 위한 MySQL 사용자를 생성하고 MySQL에서 권한을 부여합니다:

CREATE USER 'slaveuser1'@'server1.example.tld' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser1'@'192.168.0.105' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser1'@'2001:db8::1' IDENTIFIED BY 'slave_user_password';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'server1.example.tld';   
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'192.168.0.105';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'2001:db8::1';  
QUIT;

server2의 MySQL-Config에 복제를 위해 몇 가지 변경을 합니다:

vi /etc/mysql/my.cnf

[mysqld]로 시작하는 섹션을 찾아 다음 옵션을 추가합니다 (모든 기존 충돌하는 옵션은 주석 처리합니다):

[...]  
[mysqld]  
[...]  
replicate-same-server-id = 0  
auto-increment-increment = 2  
auto-increment-offset    = 2  
relay-log                = slave-relay.log  
relay-log-index          = slave-relay-log.inde

그리고 MySQL을 재시작합니다:

service mysql restart

MySQL에 로그인하고 마스터 바이너리 로그 좌표를 가져옵니다:

SHOW MASTER STATUS \G
************************* 1. row *************************  
            File: mysql-bin.000002  
        Position: 326  
    Binlog_Do_DB:  
Binlog_Ignore_DB:  
1 row in set (0.00 sec)

server1에서 MySQL에 로그인하고 마스터 서버를 설정합니다:

CHANGE MASTER TO MASTER_HOST="server2.example.tld", MASTER_USER="slaveuser1", MASTER_PASSWORD="slave_user_password", MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=326;

슬레이브를 시작합니다:

START SLAVE;

슬레이브 상태를 확인합니다:

SHOW SLAVE STATUS \G

슬레이브가 실행 중인지 확인합니다:

Slave_IO_Running: Yes  
Slave_SQL_Running: Yes

복제가 작동을 멈추면 추가 정보를 찾을 수 있습니다:

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.