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'
) >= (M
D
))는 비 돌이킬입니다.
, 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'
>M
BIT(
컬럼의 최상위 비트가 지워집니다 (제로로 설정됩니다),M'
)BIT(
값의M
)M
비트가BIT(
컬럼의 최하위 비트로 설정됩니다.M'
)소스
BIT(
컬럼에서 값을 대상M
)BIT(
컬럼에 삽입 할 때 (M'
)
),M' <
M
BIT(
열 수있는 최대 값이 할당됩니다. 즉, "모두가 설정된"값이 목표 컬럼에 할당됩니다.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
.