17.4.1.9 테이블 정의가 다른 마스터와 슬레이브에 복제
복제의 소스 및 대상 테이블은 동일한 일 필요는 없습니다. 마스터 테이블의 컬럼 수가 테이블의 노예 복사의 것보다 많아도 적어도 상관 없습니다. 또한 마스터 및 슬레이브의 해당 테이블 컬럼이 특정 조건이 적용되지만 다른 데이터 형식을 사용 있어도 괜찮습니다.
소스 및 대상 테이블의 정의가 동일하지 않은 경우에도 데이터베이스 및 테이블 이름은 마스터와 슬레이브 모두에서 동일해야합니다. 다음 두 섹션에서 추가 조건에 대한 예제와 설명합니다.
17.4.1.9.1 마스터 또는 슬레이브에 열이 많은 경우 복제
마스터와 슬레이브 복사 테이블의 컬럼 수가 다른 경우에도 다음의 조건에 따라 테이블을 마스터에서 슬레이브에 복제 할 수 있습니다.
두 버전의 테이블에 일반 컬럼은 마스터와 슬레이브로 동일한 순서로 정의해야합니다.
(이것은 두 테이블의 컬럼 수가 같은 경우에도 마찬가지입니다.)
두 버전의 테이블에 일반 컬럼 추가 컬럼 전에 정의해야합니다.
그것은 노예에서
ALTER TABLE문을 실행하여 새로운 컬럼이 두 테이블에 일반 컬럼의 범위 내에 테이블에 삽입되는 경우는 다음의 예와 같이 복제가 실패하는 것을 의미 합니다.테이블
t가 마스터 및 슬레이브에 있으며 다음의CREATE TABLE문에 정의되어 있다고합니다.CREATE TABLE t ( c1 INT, c2 INT, c3 INT );여기에 표시된
ALTER TABLE문이 슬레이브에서 실행된다고합니다.ALTER TABLE t ADD COLUMN cnew1 INT AFTER c3;
위의
ALTER TABLE은 슬레이브에서 허용됩니다. 테이블t의 두 버전으로 일반 컬럼c1,c2및c3이 두 버전의 테이블에 놓은 상태이며, 공통 않은 컬럼은 그 후에 오는 것입니다.그러나 다음
ALTER TABLE문을 슬레이브에서 실행하면 복제는 반드시 실패합니다.ALTER TABLE t ADD COLUMN cnew2 INT AFTER c2;
여기에 표시된
ALTER TABLE문을 슬레이브에서 실행하면 새로운 컬럼cnew2이 두 버전의t에 일반 컬럼 사이에오고 복제가 실패합니다.열 수가 많은 버전 테이블의 "추가"컬럼에 대해 기본값이 필요합니다.
컬럼의 기본값은 그 형태,
DEFAULT옵션으로 정의되어 있는지,NULL로 선언되어 있는지, 작성시에 유효했던 서버 SQL 모드 등 여러 가지 요인에 의해 결정됩니다. 자세한 내용은 섹션 11.6 "데이터 유형 기본값" 을 참조하십시오).
또한 테이블의 노예 복사가 마스터 복사본보다 열 수가 많을 때, 테이블에 공통되는 각 컬럼은 두 테이블에서 같은 데이터 형식을 사용해야합니다.
다음 예제는 유효 및 무효 테이블 정의를 일부 보여줍니다.
마스터의 컬럼 수가 많은 다음 테이블 정의는 유효 제대로 복제됩니다.
master>CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);slave>CREATE TABLE t1 (c1 INT, c2 INT);
다음 테이블 정의는 두 버전의 테이블에 일반 컬럼 정의가 슬레이브와 마스터와의 순서가 다르기 때문에 오류 1532 ( ER_BINLOG_ROW_RBR_TO_SBR )가 발생합니다.
master>CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);slave>CREATE TABLE t1 (c2 INT, c1 INT);
다음 테이블 정의에서 두 버전의 테이블에 일반 컬럼의 정의 전에 마스터의 추가 컬럼의 정의가 있기 때문에 오류 1532가 발생합니다.
master>CREATE TABLE t1 (c3 INT, c1 INT, c2 INT);slave>CREATE TABLE t1 (c1 INT, c2 INT);
슬레이브의 컬럼 수가 많은 다음 테이블 정의는 유효 제대로 복제됩니다.
master>CREATE TABLE t1 (c1 INT, c2 INT);slave>CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);
다음 정의는 두 버전의 테이블에 일반 컬럼이 마스터와 슬레이브 모두 같은 순서로 정의되어 있지 않기 때문에 오류 1532가 발생합니다.
master>CREATE TABLE t1 (c1 INT, c2 INT);slave>CREATE TABLE t1 (c2 INT, c1 INT, c3 INT);
다음 테이블 정의에서 두 버전의 테이블에 공통의 컬럼의 정의 전에 슬레이브 버전 테이블의 추가 열 정의가 있기 때문에 오류 1532가 발생합니다.
master>CREATE TABLE t1 (c1 INT, c2 INT);slave>CREATE TABLE t1 (c3 INT, c1 INT, c2 INT);
다음 테이블 정의는 슬레이브 버전의 테이블은 마스터 버전에 비해 열 수가 많은 두 버전의 테이블에 일반 컬럼 c2 가 사용하는 데이터 형식이 다르기 때문에 실패합니다.
master>CREATE TABLE t1 (c1 INT, c2 BIGINT);slave>CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);
17.4.1.9.2 데이터 유형이 다른 컬럼의 복제
같은 테이블의 마스터 복사본과 노예 복사의 해당 컬럼은 이상적으로는 동일한 데이터 형식이어야합니다. 그러나 MySQL 5.1.21 이후에는 일정한 조건이 충족되는 한, 이것은 반드시 엄격하게 적용되지 않습니다.
다른 모든 것이 동일한 경우, 데이터 형식의 열에서 같은 형태, 같은 크기 또는 폭 (해당하는 경우는, 그것보다 큰)의 다른 컬럼에 복제하는 것은 항상 가능합니다. 예를 들어, CHAR(10) 컬럼에서 다른 CHAR(10) 에 또는 CHAR(10) 컬럼에서 CHAR(25) 컬럼에 문제없이 복제 할 수 있습니다. 경우에 따라서는 특정 데이터 유형을 가진 컬럼 (마스터)에서 다른 데이터 형식을 갖는 열 (슬레이브)에 복제 할 수 있습니다. 마스터 버전 컬럼의 데이터 유형이 동일한 크기 또는 큰 형으로 승격 될 때, 이것은 속성 승격이라고합니다.
속성 승격은 명령문 기반 및 열 기반 리플리케이션에서 사용할 수 마스터 또는 슬레이브로 사용되는 스토리지 엔진에 의존하지 않습니다. 그러나 로깅 형식의 선택은 허용되는 형식 변환에 영향을줍니다. 자세한 내용은이 섹션 뒷부분합니다.
명령문 기반 또는 행 기반의 두 복제를 사용하는 경우에도 속성 승격을 사용하면 테이블의 노예 복사의 컬럼 수를 마스터 복사본보다 많은 수 없습니다.
문 기반 복제 문 기반 복제를 사용할 때 따라야 간단한 어림짐작은 "마스터에서 실행되는 명령문이 슬레이브에서도 성공적으로 실행되는 경우 복제도 성공하는 것"이라는 것입니다. 즉, 슬레이브에있는 컬럼의 형태와 호환되는 값을 문을 사용하는 경우, 그 문은 복제 할 수 있습니다. 예를 들어, TINYINT 컬럼에 적합한 값을 BIGINT 컬럼에 삽입 할 수 있습니다. 이것은 테이블의 노예 복사의 TINYINT 컬럼의 형태를 BIGINT 로 변경하는 경우에도 마스터에서 성공하는 컬럼에 삽입은 슬레이브에서도 성공할 것이다라는 것을 따릅니다 ( BIGINT 컬럼 를 넘을만큼 큰 정당한 TINYINT 값을 가질 수 없기 때문에).
MySQL 5.6.10 이전에는 문 기반 복제를 사용하면 AUTO_INCREMENT 컬럼은 마스터와 슬레이브 모두에서 동일해야했습니다. 그렇지 않은 경우, 슬레이브의 잘못된 테이블에 업데이트가 적용될 수있었습니다 (Bug # 12669186)
열 기반 리플리케이션 : 속성 승격과 강등 MySQL 5.6의 열 기반 리플리케이션은 작은 데이터 형과 큰 데이터 형식 사이의 속성 승격 및 강등을 지원합니다. 이 섹션에서는 후술하는 바와 같이 강등되는 컬럼 값의 비가 역적 (잘라 내기) 또는 비 돌이킬 변환을 허용할지 여부를 지정할 수 있습니다.
돌이킬 수없고 비 돌이킬 변환 대상 유형이 삽입되는 값을 표현할 수없는 경우 변환을 어떻게 처리할지에 대한 결정이 필요합니다. 변환을 허용하지만 타겟 컬럼에서 "적합"을 실현하기 위해 소스 값을 잘라야 (또는 변경) 경우 돌이킬 수없는 변환이라고도합니다. 소스 컬럼 값을 대상 컬럼을 준수하기 위해 잘라 내기 또는 유사한 변경을 필요로하지 않는 변환은 비 돌이킬 변환합니다.
형식 변환 모드 (slave_type_conversions 변수) slave_type_conversions 글로벌 서버 변수의 설정은 슬레이브에서 사용되는 형식 변환 모드를 제어합니다. 이 변수는 다음의 표 (슬레이브 형식 변환 동작에 대한 각 모드의 영향을 나타내는)에서의 값 세트를 취합니다.
| 모드 | 영향 |
|---|---|
ALL_LOSSY | 이 모드에서는 정보의 손실을 의미하는 형식 변환이 허용됩니다. 이것은 비 돌이킬 변환이 허용되는 것을 암시하지 않고, 돌이킬 수없는 변환을 필요로한다 또는 변환을 전혀 필요로하지 않는 경우 만 허용되는 것만을 암시합니다. 예를 들어,이 모드 만 사용했을 경우, |
ALL_NON_LOSSY | 이 모드는 소스 값 잘림 또는 특별한 처리가 필요없는 변환을 허용합니다. 즉, 타겟 형의 범위가 소스 형보다 넓은 변환을 허용합니다. 이 모드를 설정하는 것은 돌이킬 수없는 변환이 허용되는지 여부에 관계 없습니다. 이것은 |
ALL_LOSSY,ALL_NON_LOSSY | 이 모드가 설정되면 지원되는 모든 형식 변환이 비가역 변환 여부에 관계없이 허용됩니다. |
ALL_SIGNED | 승격되는 정수를 부호있는 값으로 취급합니다 (기본 동작). |
ALL_UNSIGNED | 승격되는 정수를 부호없는 값으로 취급합니다. |
ALL_SIGNED,ALL_UNSIGNED | 승격되는 정수형을 가능하면 부호로, 그렇지 않은 경우는 부호 없음으로 처리합니다. |
| [empty] | 이 모드가 기본입니다. |
정수형 상승 될 때 부호있는 또는 부호 없음인지는 유지되지 않습니다. 기본적으로 슬레이브는 이러한 값을 부호로 처리합니다. MySQL 5.6.13 이후에서는 ALL_SIGNED , ALL_UNSIGNED 또는 둘 모두를 사용하여이 동작을 제어 할 수 있습니다. (Bug # 15831300) ALL_SIGNED 승격되는 모든 정수를 부호로 처리하도록 슬레이브에 지시합니다. ALL_UNSIGNED 이들을 부호 없음으로 처리하도록 지시합니다. 모두 지정하면 슬레이브는 가능하면 값을 부호로 처리하고 그렇지 않은 경우는 부호 없음으로 처리합니다. 나열된 순서는 중요하지 않습니다. 적어도 ALL_LOSSY 또는 ALL_NONLOSSY 중 하나가 사용되지 않으면 ALL_SIGNED 도 ALL_UNSIGNED 도 효과가 없습니다.
형식 변환 모드를 변경하려면 새로운 slave_type_conversions 설정에서 슬레이브를 다시 시작해야합니다.
지원되는 변환 다르지만 비슷한 데이터 유형 사이에서 지원되는 변환을 다음의 목록입니다.
정수형
TINYINT,SMALLINT,MEDIUMINT,INT및BIGINT중 하나 사이.여기에는 이러한 형태의 부호 및 부호없는 버전 사이의 변환이 포함됩니다.
돌이킬 수없는 변환은 소스 값을 대상 컬럼에서 허용되는 최대 값 (또는 최소값)로 잘리는 것으로 이루어집니다. 부호의 부호 형에 비 돌이킬 변환을 보장하려면 대상 컬럼이 소스 컬럼의 값의 범위를 받아들이는 데 충분한 크기이어야합니다. 예를 들어,
TINYINT UNSIGNED가 아닌 돌이킬에SMALLINT로 강등 할 수 있지만TINYINT는 없습니다.소수점
DECIMAL,FLOAT,DOUBLE및NUMERIC중 하나 사이.FLOAT에서DOUBLE로는 비 돌이킬 변환합니다.DOUBLE에서FLOAT에 돌이킬 밖에 취급 할 수 없습니다.DECIMAL(에서M,D)DECIMAL(로 변환 (M',D')및D'>=D(-M'-D') >= (MD))는 비 돌이킬입니다., DM' <M또는 둘 다의 경우 돌이킬 수없는 변환만을 할 수 있습니다.D' < D하나의 소수점 형의 경우 저장되는 값을 타겟 형에 적용 할 수없는 경우에는이 문서의 다른 위치에서 서버에 정의 된 반올림 규칙에 따라 값이 잘립니다. 소수점 형에서 이것이 어떻게 수행되는지에 대해서는 섹션 12.20.4 「둥근 동작」 을 참조하십시오.
문자열
CHAR,VARCHAR및TEXT중 하나 사이 (다른 폭 사이의 변환을 포함한다).CHAR,VARCHAR, 또는TEXT에서 동일하거나 더 큰 크기의CHAR,VARCHAR, 또는TEXT컬럼으로 변환은 결코 돌이킬 수는 없습니다. 돌이킬 수없는 변환은 슬레이브에서 문자열의 첫 번째N문자를 삽입하는 것으로 처리됩니다. 여기서N은 대상 컬럼의 폭입니다.중요다른 문자 집합을 사용하는 열 사이의 복제는 지원되지 않습니다.
이진 데이터 형식
BINARY,VARBINARY, 그리고BLOB중 하나 사이 (다른 폭 사이의 변환을 포함한다).BINARY,VARBINARY또는BLOB에서 동일하거나 더 큰 크기의BINARY,VARBINARY또는BLOB컬럼으로 변환은 결코 돌이킬 수는 없습니다. 돌이킬 수없는 변환은 슬레이브에서 문자열의 첫 번째N바이트를 삽입하는 것으로 간주됩니다. 여기서N은 대상 컬럼의 폭입니다.임의의 2 개 크기의 임의의 2 개의
BIT컬럼 사이.BIT(컬럼에서 값을M)BIT(컬럼에 삽입 할 때 (M')),M'>MBIT(컬럼의 최상위 비트가 지워집니다 (제로로 설정됩니다),M')BIT(값의M)M비트가BIT(컬럼의 최하위 비트로 설정됩니다.M')소스
BIT(컬럼에서 값을 대상M)BIT(컬럼에 삽입 할 때 (M')),M' <MBIT(열 수있는 최대 값이 할당됩니다. 즉, "모두가 설정된"값이 목표 컬럼에 할당됩니다.M')
이전 목록에없는 형식 사이의 변환은 허용되지 않습니다.
MySQL 5.5.3 이전의 복제 형 변환 MySQL 5.5.3 이전 행 기반 바이너리 로깅에서 TINYINT 에서 BIGINT 에 등 다른 INT 하위 유형 사이에서 복제 할 수 없습니다. 행 기반 로깅을 사용하면 이러한 유형의 컬럼에 변경이 바이너리 로그에서 서로 다른 방식으로 표현되어 있었기 때문입니다. (단, 열 기반 리플리케이션을 사용하여 BLOB 에서 TEXT 를 복제 할 수있었습니다. BLOB 및 TEXT 컬럼에 변경이 바이너리 로그에서 동일한 형식을 사용하여 표현되어 있었기 때문입니다.)
MySQL 5.5.3 이전 열 기반 리플리케이션을 사용하면 속성 승격에 지원되는 변환을 다음 표에 나타냅니다.
| 변환 전 (마스터) | 변환 후 (슬레이브) |
|---|---|
BINARY | CHAR |
BLOB | TEXT |
CHAR | BINARY |
DECIMAL | NUMERIC |
NUMERIC | DECIMAL |
TEXT | BLOB |
VARBINARY | VARCHAR |
VARCHAR | VARBINARY |
모든 경우에 슬레이브에서 컬럼의 크기 또는 폭은 마스터에서 열 것 이상으로 할 필요가 있습니다. 예를 들어 마스터에서 CHAR(10) 컬럼에서 슬레이브에서 BINARY(10) 또는 BINARY(25) 을 사용하는 컬럼에 복제 할 수 있었지만, 마스터에서 CHAR(10) 컬럼에서 슬레이브에서 BINARY(5) 컬럼에 복제 할 수 없습니다.
프리픽스를 갖는 고유 인덱스 (기본 키 포함)는 마스터와 슬레이브 모두에 동일한 길이의 프리픽스를 사용해야합니다. 이런 경우 다른 프리픽스 길이는 허용되지 않습니다. 프리픽스 길이가 마스터와 슬레이브로 다른 고유하지 않은 인덱스를 사용하는 것은 가능하지만, 이는 심각한 성능 문제가 발생할 수 있습니다 (특히 마스터에서 사용되는 프리픽스의 길이 더 멀 때). 이것은 어떤 길이의 2 개의 고유 접두어가 길이가 짧아지면 고유하지 않을 수 있다는 사실에 더합니다. 예를 들어, 단어 catalogue과 catamount은 각각 5 자 프리픽스 catal과 catam을 갖지만 4 문자의 동일한 프리픽스 (cata)을 공유합니다. 따라서 이러한 인덱스를 사용하는 쿼리가 동일한 인덱스 슬레이브 정의 마스터의 것보다 짧은 접두어가 사용되는 경우, 슬레이브에서 실행 효율이 저하 될 수 있습니다.
DECIMAL 및 NUMERIC 컬럼의 경우 가수 (M)와 소수 자릿수 (D) 모두가 마스터에 비해 슬레이브에서 동일하거나 커야 할 필요가 있습니다. 예를 들어, NUMERIC(5,4) 에서 DECIMAL(6,4) 에 대한 복제가 작동했지만, NUMERIC(5,4) 에서 DECIMAL(5,3) 로 복제하지 않았습니다.
MySQL 5.5.3 이전 버전에서는 열 기반 리플리케이션을 사용하면 MySQL 복제는 다음 데이터 유형과 다른 데이터 유형 사이에서 속성 승격을 지원하지 않았습니다.
INT(TINYINT,SMALLINT,MEDIUMINT,BIGINT포함).INT하위 유형 사이의 승격 (예를 들어,SMALLINT에서BIGINT로)도 MySQL 5.5.3 이전에는 지원되지 않았습니다.SET또는ENUM.FLOAT또는DOUBLE.날짜, 시간 또는 둘 모두에 대한 데이터 유형의 모든 :
DATE,TIME,DATETIME,TIMESTAMP및YEAR.