수색…


비고

복제는 하나의 MySQL 데이터베이스 서버에서 하나 이상의 MySQL 데이터베이스 서버로 [백업] 데이터를 복사하는 데 사용됩니다.

마스터 - 복사 할 데이터를 제공하는 MySQL 데이터베이스 서버

슬레이브 - MySQL 데이터베이스 서버는 마스터가 제공하는 데이터를 복사합니다.

MySQL의 경우 기본적으로 복제는 비동기입니다. 이것은 슬레이브가 마스터로부터 업데이트를 받기 위해 영구적으로 연결될 필요가 없다는 것을 의미합니다. 예를 들어, 슬레이브가 꺼져 있거나 마스터와 연결되어 있지 않고 나중에 슬레이브를 켜거나 마스터와 연결하면 마스터와 자동으로 동기화됩니다.

구성에 따라 모든 데이터베이스, 선택한 데이터베이스 또는 데이터베이스 내의 선택된 테이블을 복제 할 수 있습니다.

복제 형식

복제 형식에는 두 가지 핵심 유형이 있습니다

Statement Based Replication (SBR) - 전체 SQL 문을 복제합니다. 여기서 마스터는 SQL 문을 2 진 로그에 기록합니다. 슬레이브에서 마스터의 복제는 슬레이브에서 해당 SQL 문을 실행하여 작동합니다.

Row Based Replication (RBR) - 변경된 행만 복제합니다. 이 경우, 마스터는 개별 테이블 행이 변경되는 방법을 나타내는 이벤트를 2 진 로그에 기록합니다. 마스터의 슬레이브로의 복제는 테이블 행에 대한 변경을 나타내는 이벤트를 슬레이브로 복사하여 작동합니다.

MBR (혼합 된 기반 복제) 의 세 번째 종류를 사용할 수도 있습니다. 이 경우 명령문 기반 및 행 기반 로깅이 모두 사용됩니다. 변경에 가장 적합한 것에 따라 로그가 작성됩니다.

5.7.7보다 오래된 MySQL 버전에서는 명령문 기반 형식이 기본으로 사용되었습니다. MySQL 5.7.7 및 이후 버전에서는 행 기반 형식이 기본값입니다.

마스터 - 슬레이브 복제 설정

복제 설정을 위해 2 개의 MySQL 서버를 고려하십시오. 하나는 마스터이고 다른 하나는 슬레이브입니다.

우리는 마스터가 수행 한 모든 작업에 대한 로그를 유지해야한다는 것을 마스터에게 설정하려고합니다. 우리는 슬레이브 서버가 마스터의 로그를 볼 수 있도록 구성 할 것이며 마스터의 로그에서 변경이 일어날 때마다 동일한 작업을 수행해야합니다.

마스터 구성

먼저 마스터에 사용자를 만들어야합니다. 이 사용자는 슬레이브에서 마스터와의 연결을 생성하는 데 사용됩니다.

CREATE USER 'user_name'@'%' IDENTIFIED BY 'user_password';
GRANT REPLICATION SLAVE ON *.* TO 'user_name'@'%';
FLUSH PRIVILEGES;

Username과 Password에 따라 user_nameuser_password 변경하십시오.

이제 my.inf (Linux의 my.cnf) 파일을 편집해야합니다. [mysqld] 섹션에 다음 행을 추가하십시오.

server-id = 1
log-bin = mysql-bin.log
binlog-do-db = your_database

첫 번째 줄은이 MySQL 서버에 ID를 할당하는 데 사용됩니다.

두 번째 행은 MySQL에게 지정된 로그 파일에 로그 쓰기를 시작하도록 알려줍니다. 리눅스에서는 log-bin = /home/mysql/logs/mysql-bin.log 처럼 설정할 수 있습니다. 복제가 이미 사용 된 MySQL 서버에서 복제를 시작하려면이 디렉토리가 모든 복제 로그에서 비어 있는지 확인하십시오.

세 번째 줄은 로그를 작성할 데이터베이스를 구성하는 데 사용됩니다. your_database 를 데이터베이스 이름으로 바꿔야합니다.

skip-networking 이 활성화되지 않았는지 확인하고 MySQL 서버를 다시 시작하십시오 (마스터).

슬레이브 구성

my.inf 파일은 Slave에서도 편집해야합니다. [mysqld] 섹션에 다음 행을 추가하십시오.

server-id = 2
master-host = master_ip_address
master-connect-retry = 60

master-user = user_name
master-password = user_password
replicate-do-db = your_database

relay-log = slave-relay.log
relay-log-index = slave-relay-log.index

첫 번째 줄은이 MySQL 서버에 ID를 할당하는 데 사용됩니다. 이 ID는 고유해야합니다.

두 번째 줄은 마스터 서버의 IP 주소입니다. 마스터 시스템 IP에 따라 변경하십시오.

세 번째 줄은 초 단위로 재시도 제한을 설정하는 데 사용됩니다.

다음 두 줄은 마스터에 연결하는 데 사용하여 슬레이브에 대한 사용자 이름과 암호를 알려줍니다.

다음 줄은 복제 할 데이터베이스를 설정합니다.

relay-logrelay-log-index 파일 이름을 할당하는 데 사용되는 마지막 두 줄.

skip-networking 이 활성화되지 않았는지 확인하고 MySQL 서버를 다시 시작하십시오 (슬레이브)

슬레이브에 데이터 복사

데이터가 지속적으로 마스터에 추가되는 경우 마스터의 모든 데이터베이스 액세스가 금지되어 아무 것도 추가 할 수 없게됩니다. 마스터에서 다음 명령문을 실행하면이 작업을 수행 할 수 있습니다.

FLUSH TABLES WITH READ LOCK;

서버에 데이터가 추가되지 않으면 위의 단계를 건너 뛸 수 있습니다.

우리는 mysqldump 를 사용하여 마스터의 데이터 백업을 할 것이다.

mysqldump your_database -u root -p > D://Backup/backup.sql;

설정에 따라 your_database 및 백업 디렉토리를 변경 your_database . 이제 지정된 위치에 backup.sql 이라는 파일이 backup.sql .

슬레이브에 데이터베이스가 없다면 다음을 실행하여 데이터베이스를 생성하십시오.

CREATE DATABASE `your_database`;

이제 슬레이브 MySQL 서버로 백업을 가져와야합니다.

mysql -u root -p your_database  <D://Backup/backup.sql
--->Change `your_database` and backup directory according to your setup

복제 시작

복제를 시작하려면 마스터에서 로그 파일 이름과 로그 위치를 찾아야합니다. 그래서, 마스터에서 다음을 실행하십시오.

SHOW MASTER STATUS;

이렇게하면 아래와 같은 결과가 나옵니다.

+---------------------+----------+-------------------------------+------------------+
| File                | Position | Binlog_Do_DB                  | Binlog_Ignore_DB |
+---------------------+----------+-------------------------------+------------------+
| mysql-bin.000001    | 130      | your_database                 |                  |
+---------------------+----------+-------------------------------+------------------+

그런 다음 슬레이브에서 다음을 실행하십시오.

SLAVE STOP;
CHANGE MASTER TO MASTER_HOST='master_ip_address', MASTER_USER='user_name', 
   MASTER_PASSWORD='user_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=130;
SLAVE START;

먼저 슬레이브를 중지합니다. 그런 다음 마스터 로그 파일의 위치를 ​​정확히 알려줍니다. MASTER_LOG_FILE 이름과 MASTER_LOG_POSSHOW MASTER STATUS 에서 SHOW MASTER STATUS 명령을 실행하여 얻은 값을 사용하십시오.

MASTER_HOST 에서 마스터의 IP를 변경하고 이에 따라 사용자와 비밀번호를 변경해야합니다.

슬레이브가 대기 중입니다. 슬레이브의 상태는 다음을 실행하여 볼 수 있습니다.

SHOW SLAVE STATUS;

이전에 Master에서 FLUSH TABLES WITH READ LOCK 하여 FLUSH TABLES WITH READ LOCK 를 실행 한 경우 다음을 실행하여 테이블을 잠금에서 해제하십시오

UNLOCK TABLES;

이제 마스터는 수행되는 모든 작업에 대한 로그를 보관하고 슬레이브 서버는 마스터의 로그를 확인합니다. 마스터 로그온시 변경 사항이 발생할 때마다 슬레이브는이를 복제합니다.

복제 오류

슬레이브에서 쿼리를 실행하는 동안 오류가 발생할 때마다 MySQL은 자동으로 복제를 중지하여 문제를 확인하고 수정합니다. 이는 주로 이벤트로 인해 중복 키가 발생했거나 행을 찾지 못하여 업데이트 또는 삭제할 수 없기 때문입니다. 권장하지 않는 경우에도 이러한 오류는 건너 뛸 수 있습니다.

슬레이브가 걸려있는 쿼리 하나만 건너 뛰려면 다음 구문을 사용하십시오

SET GLOBAL sql_slave_skip_counter = N;

이 문은 마스터에서 다음 N 이벤트를 건너 뜁니다. 이 명령문은 슬레이브 스레드가 실행되고 있지 않을 때에 만 유효합니다. 그렇지 않으면 오류가 발생합니다.

STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;

어떤 경우에는 괜찮습니다. 그러나 명령문이 다중 명령문 트랜잭션의 일부인 경우 오류 생성 명령문을 건너 뛰면 전체 트랜잭션이 건너 뜁니다.

같은 에러 코드를 생성하는 더 많은 쿼리를 건너 뛰고 싶다면 그 에러를 건너 뛰어도 슬레이브가 일관성을 잃지 않고 모두 건너 뛰길 원한다면 my.cnf 에서 해당 에러 코드를 건너 뛰는 라인을 추가하면된다. .

예를 들어, 중복되는 모든 오류를 건너 뛰고 싶을 수 있습니다.

1062 | Error 'Duplicate entry 'xyz' for key 1' on query

그런 다음 my.cnf 다음을 추가하십시오 my.cnf

slave-skip-errors = 1062

다른 유형의 오류 또는 모든 오류 코드는 건너 뛸 수 있지만 이러한 오류를 건너 뛰어도 슬레이브가 일관성을 잃지는 않는지 확인하십시오. 다음은 구문과 예제입니다.

slave-skip-errors=[err_code1,err_code2,...|all]

slave-skip-errors=1062,1053
slave-skip-errors=all
slave-skip-errors=ddl_exist_errors


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow