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, 13965.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]:/root5.4 server2에서 덤프 가져오기
mysql -u root -p < /root/mysqldump.sqlserver2에서 mysql을 종료합니다:
service mysql stopserver1에서 server2로 MySQL의 기본 파일을 복사합니다. server1로 전환하고 다음을 실행합니다:
scp /etc/mysql/debian.cnf [email protected]:/etc/mysql/debian.cnfserver2에서 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 restartMySQL에 로그인하고 마스터 바이너리 로그 좌표를 가져옵니다:
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복제가 작동을 멈추면 추가 정보를 찾을 수 있습니다:
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.