14.17 InnoDB와 MySQL 복제
MySQL 복제는 MyISAM
테이블에서 작동하는 것과 같이 InnoDB
테이블에서 작동합니다. 또한 슬레이브의 스토리지 엔진 마스터의 원래의 스토리지 엔진과 동일 않은 상황에서 복제를 사용할 수 있습니다. 예를 들어 마스터에서 InnoDB
테이블에 변경을 슬레이브에서 MyISAM
테이블에 복제 할 수 있습니다.
마스터에 새로운 슬레이브를 설정하려면 InnoDB
테이블 스페이스 및 로그 파일 이외에 InnoDB
테이블의 .frm
파일의 사본을 만들고 그 사본을 노예로 이동합니다. innodb_file_per_table
옵션이 활성화되어있는 경우 .ibd
파일도 복사합니다. 이렇게 올바른 지침은 섹션 14.16 "InnoDB 백업 및 복구" 를 참조하십시오.
마스터 또는 기존의 슬레이브를 중단하지 않고 새로운 슬레이브를 작성하려면 MySQL Enterprise Backup 제품을 사용합니다. 마스터 또는 기존의 슬레이브를 종료 할 경우, InnoDB
테이블 스페이스 및 로그 파일의 콜드 백업 을 만들고 그것을 사용하여 슬레이브를 설정합니다.
마스터에 실패한 트랜잭션 복제에 영향을주지 않습니다. MySQL 복제는 데이터를 변경하는 SQL 문을 MySQL에 의해 기록 된 바이너리 로그를 기반으로합니다. 실패한 트랜잭션 (예를 들어, 외부 키 위반으로 인해 또는 롤백되어 있기 때문에)는 바이너리 로그에 기록되지 않기 때문에 슬레이브에 전송되지 않습니다. 섹션 13.3.1 "START TRANSACTION, COMMIT 및 ROLLBACK 구문" 을 참조하십시오.
복제와 CASCADE 마스터에서 InnoDB
테이블에 대한 연쇄 작업은 외부 키 관계를 공유하는 테이블이 마스터와 슬레이브에서 InnoDB
를 사용하는 경우에만 슬레이브에 복제됩니다. 이것은 문 기반 복제 및 행 기반 복제의 어느 쪽을 사용하는 경우에도 적용됩니다. 복제를 시작한 후에 다음 CREATE TABLE
문을 사용하여 마스터에 두 테이블을 만들었다 고합니다.
CREATE TABLE fc1 ( i INT PRIMARY KEY, j INT ) ENGINE = InnoDB; CREATE TABLE fc2 ( m INT PRIMARY KEY, n INT, FOREIGN KEY ni (n) REFERENCES fc1 (i) ON DELETE CASCADE ) ENGINE = InnoDB;
슬레이브는 InnoDB
지원이 활성화되어 있지 않다고 가정합니다. 이 경우, 슬레이브에 테이블이 만들어집니다 만, 그 테이블은 MyISAM
스토리지 엔진을 사용하여 FOREIGN KEY
옵션은 무시됩니다. 다음은 마스터 테이블에 필요한 내용을 삽입합니다.
master>INSERT INTO fc1 VALUES (1, 1), (2, 2);
Query OK, 2 rows affected (0.09 sec) Records : 2 Duplicates : 0 Warnings : 0 master>INSERT INTO fc2 VALUES (1, 1), (2, 2), (3, 1);
Query OK, 3 rows affected (0.19 sec) Records : 3 Duplicates : 0 Warnings : 0
이 시점에서 다음과 같이 마스터와 슬레이브에서 테이블 fc1
에는 두 줄이 포함 테이블 fc2
에는 3 줄이 포함되어 있습니다.
master>SELECT * FROM fc1;
+---+------+ | i | j | +---+------+ | 1 | 1 | | 2 | 2 | +---+------+ 2 rows in set (0.00 sec) master>SELECT * FROM fc2;
+---+------+ | m | n | +---+------+ | 1 | 1 | | 2 | 2 | | 3 | 1 | +---+------+ 3 rows in set (0.00 sec) slave>SELECT * FROM fc1;
+---+------+ | i | j | +---+------+ | 1 | 1 | | 2 | 2 | +---+------+ 2 rows in set (0.00 sec) slave>SELECT * FROM fc2;
+---+------+ | m | n | +---+------+ | 1 | 1 | | 2 | 2 | | 3 | 1 | +---+------+ 3 rows in set (0.00 sec)
여기서 마스터에서 다음 DELETE
문을 실행했다고합니다.
master> DELETE FROM fc1 WHERE i=1;
Query OK, 1 row affected (0.09 sec)
캐스케이드 위해, 마스터 테이블 fc2
1 행만 포함되지 않습니다했습니다.
master> SELECT * FROM fc2;
+---+---+
| m | n |
+---+---+
| 2 | 2 |
+---+---+
1 row in set (0.00 sec)
그러나 슬레이브는 fc1
에 대한 DELETE
의해 fc2
에서 행이 삭제되지 않기 때문에, 캐스케이드 슬레이브에 전달되지 않습니다. 노예 fc2
사본은 계속 먼저 삽입 된 모든 행이 포함되어 있습니다.
slave> SELECT * FROM fc2;
+---+---+
| m | n |
+---+---+
| 1 | 1 |
| 3 | 1 |
| 2 | 2 |
+---+---+
3 rows in set (0.00 sec)
이러한 차이는 계단식 삭제가 실제로는 InnoDB
스토리지 엔진에서 내부적으로 처리되기 때문에오고있다. 즉, 어떤 변화가 기록되지 않습니다.