• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 1. Replication 구성
    2. Replication 구현
    3. Replication 솔루션
    4. Replication Notes and Tips
    1. Replication 기능과 이슈
    1. Replication and AUTO_INCREMENT
    2. Replication and BLACKHOLE 테이블
    3. Replication and Character Sets
    4. CREATE ... IF NOT EXISTS 문 복제
    5. CREATE TABLE ... SELECT 문 복제
    6. CREATE SERVER, ALTER SERVER 및 DROP SERVER 복제
    7. CURRENT_USER ()의 복제
    8. DROP ... IF EXISTS 문 복제
    9. 테이블 정의가 다른 마스터와 슬레이브에 복제
    10. Replication and DIRECTORY Table Options
    11. 호출되는 기능의 복제
    12. 복제 및 부동 소수점 값
    13. 복제 및 소수 초 지원
    14. 복제 및 FLUSH
    15. 복제와 시스템 함수
    16. 복제 및 LIMIT
    17. 복제 및 LOAD DATA INFILE
    18. 복제 및 REPAIR TABLE
    19. 복제 및 마스터 또는 슬레이브 Shutdowns
    20. 복제와 max_allowed_pa​​cket
    21. 복제 및 MEMORY 테이블
    22. 복제 및 임시 테​​이블
    23. mysql 시스템 데이터베이스의 복제
    24. 복제 및 쿼리 최적화
    25. 복제 및 예약어
    26. 복제중인 슬레이브 오류
    27. 서버 측 도움말 테이블의 복제
    28. Replication 및 서버 SQL 모드
    29. Replication 시도 및 시간 제한
    30. Replication 및 Time Zones
    31. Replication 및 트랜잭션
    32. Replication 및 트리거
    33. Replication 및 TRUNCATE TABLE
    34. Replication 및 변수
    35. Replication 및 Views
    2. MySQL 버전 간의 복제 호환성
    3. Replication 설정 업그레이드
    4. Replication 문제 해결
    5. Replication 버그 또는 문제를보고하는 방법
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

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

이 모드에서는 정보의 손실을 의미하는 형식 변환이 허용됩니다.

이것은 비 돌이킬 변환이 허용되는 것을 암시하지 않고, 돌이킬 수없는 변환을 필요로한다 또는 변환을 전혀 필요로하지 않는 경우 만 허용되는 것만을 암시합니다. 예를 들어,이 모드 만 사용했을 경우, INT 컬럼이 TINYINT 로 변환 될 (비가역 변환)은 허용되지만, TINYINT 컬럼이 INT 열로 변환되는 (비 돌이킬)은 허용되지 않습니다. 이 경우 후자의 변환을 시도하면 복제가 슬레이브에서 오류로 중지합니다.

ALL_NON_LOSSY

이 모드는 소스 값 잘림 또는 특별한 처리가 필요없는 변환을 허용합니다. 즉, 타겟 형의 범위가 소스 형보다 넓은 변환을 허용합니다.

이 모드를 설정하는 것은 돌이킬 수없는 변환이 허용되는지 여부에 관계 없습니다. 이것은 ALL_LOSSY 모드에서 제어됩니다. ALL_NON_LOSSY 만 설정되어 ALL_LOSSY 는되지 않을 경우 데이터가 손실 변환하려고하면 ( INT 에서 TINYINT 로, CHAR(25) 에서 VARCHAR(20) 에 등), 슬레이브는 오류로 중지합니다.

ALL_LOSSY,ALL_NON_LOSSY

이 모드가 설정되면 지원되는 모든 형식 변환이 비가역 변환 여부에 관계없이 허용됩니다.

ALL_SIGNED

승격되는 정수를 부호있는 값으로 취급합니다 (기본 동작).

ALL_UNSIGNED

승격되는 정수를 부호없는 값으로 취급합니다.

ALL_SIGNED,ALL_UNSIGNED

승격되는 정수형을 가능하면 부호로, 그렇지 않은 경우는 부호 없음으로 처리합니다.

[empty]

slave_type_conversions 가 설정되어 있지 때에는 속성 승격 또는 강등은 허용되지 않습니다. 이것은 소스 및 대상 테이블의 모든 컬럼이 동일한 유형이어야 함을 의미합니다.

이 모드가 기본입니다.

정수형 상승 될 때 부호있는 또는 부호 없음인지는 유지되지 않습니다. 기본적으로 슬레이브는 이러한 값을 부호로 처리합니다. 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 ))는 비 돌이킬입니다. M' < M , D 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 .


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved