[MySQL][Master-Slave] 복제 필터링 - 명령문 및 적용방법

■ Replication Filtering Rule 사용 적용방법

이전 챕터에서 복제 룰에 대해서 평가하는 방법을 배웠습니다. 이번엔 실제 복제필터링을 적용하는 명령과 환경설정 옵션에서 어떻게 적용하는지에 대해 알아봅니다.

 

복제 필터링을 하는 방법은 3가지가 있습니다.

+ MySQL서버를 시작할 관련 옵션을 주고 시작하는 방법

서버를 시작할 필요한 필터링 옵션을 주고 실행합니다. 스크립트나 기타 관리방법을 만들어야 합니다.

+ CHANGE REPLICATION 명령어를 이용하는 방법

서버를 시작 명령어를 이용해서 필터링을 적용합니다. 서버를 중지하면 설정이 사라집니다. 아래에서 설명합니다.

+ my.cnf 환경파일에 옵션을 이용해서 설정하는 방법

my.cnf안에 옵션을 설정하여 필터링합니다. 환경파일을 이용하는것이기 때문에 삭제하지 않는한 영구적으로 적용됩니다. my.cnf 이용하는 방법은 아래에서 다루도록 하겠습니다.

 

▶ CHANGE REPLICATION FILTER 명령 형식

CHANGE REPLICATION FILTER filter[, filter][, ...]

filter:
    REPLICATE_DO_DB = (db_list)
  | REPLICATE_IGNORE_DB = (db_list)
  | REPLICATE_DO_TABLE = (tbl_list)
  | REPLICATE_IGNORE_TABLE = (tbl_list)
  | REPLICATE_WILD_DO_TABLE = (wild_tbl_list)
  | REPLICATE_WILD_IGNORE_TABLE = (wild_tbl_list)
  | REPLICATE_REWRITE_DB = (db_pair_list)

db_list:
    db_name[, db_name][, ...]

tbl_list:
    db_name.table_name[, db_table_name][, ...]

wild_tbl_list:
    'db_pattern.table_pattern'[, 'db_pattern.table_pattern'][, ...]

db_pair_list:
    (db_pair)[, (db_pair)][, ...]

db_pair:
    from_db, to_db

 

CHANGE REPLICATION FILTER --replicate-do-db 또는 --replicate-wild-ignore-table 같은 복제 필터링 옵션을 사용하여 슬레이브 mysqld 시작하는 것과 같은 방식으로 슬레이브에서 하나 이상의 복제 필터링 규칙을 설정합니다. 서버 옵션의 경우와 달리, 명령문은 서버를 다시 시작할 필요가 없으며, 먼저 STOP SLAVE SQL_THREAD 사용하여 슬레이브 SQL 스레드를 중지 다음 START SLAVE SQL_THREAD 다시 시작해야합니다. CHANGE REPLICATION FILTER에는 SUPER 권한이 필요합니다.

 

다음 목록은 CHANGE REPLICATION FILTER 옵션과이 옵션이 --replicate- * 서버 옵션과 관련되는 방법을 보여줍니다.

+ REPLICATE_DO_DB : 데이터베이스 이름을 기반으로 업데이트를 포함합니다. --replicate-do-db 같습니다.

+ REPLICATE_IGNORE_DB : 데이터베이스 이름을 기반으로 업데이트를 제외합니다. --replicate-ignore-db 같습니다.

+ REPLICATE_DO_TABLE : 테이블 이름을 기반으로 업데이트를 포함하십시오. --replicate-do-table 같습니다.

+ REPLICATE_IGNORE_TABLE : 테이블 이름을 기반으로 업데이트를 제외합니다. --replicate-ignore-table 같습니다.

+ REPLICATE_WILD_DO_TABLE : 와일드 카드 패턴 일치 테이블 이름을 기반으로하는 업데이트를 포함합니다. --replicate-wild-do-table 같습니다.

+ REPLICATE_WILD_IGNORE_TABLE : 와일드 카드 패턴 일치 테이블 이름을 기반으로하는 업데이트를 제외합니다. --replicate-wild-ignore-table 같습니다.

+ REPLICATE_REWRITE_DB : master 지정된 데이터베이스에 대해 슬레이브에서 이름을 대체 슬레이브에서 업데이트를 수행합니다. --replicate-rewrite-db 같습니다.

 

REPLICATE_DO_DB REPLICATE_IGNORE_DB 필터의 정확한 효과는 명령문 기반 복제가 유효한지 여부에 따라 다릅니다. 자세한 내용은 다음 포스트를 참고하세요

https://myinfrabox.tistory.com/26?category=804725

 

다음과 같이 규칙을 쉼표로 구분하여 단일 CHANGE REPLICATION FILTER 문에서 여러 복제 필터링 규칙을 작성할 있습니다.

mysql> CHANGE REPLICATION FILTER REPLICATE_DO_DB=(d1), REPLICATE_IGNORE_DB=(d2);

방금 표시된 명령문을 실행하는 것은 --replicate-do-db=d1 --replicate-ignore-db=d2 옵션을 사용하여 슬레이브 mysqld 시작하는 것과 같습니다.

여러 데이터베이스를 설정하고 싶은경우 다음과 같이 입력합니다. 필요한 데이터베이스를 () 묶고 데이터베이스를 나열합니다. 나열하고 싶다면 뒤에 REPLICATE_DO_DB 입력하여 설정해 줍니다.

mysql> CHANGE REPLICATION FILTER REPLICATE_DO_DB = (mydb1, mydb2), REPLICATE_DO_DB = (userdb3, userdb4);

 

 

 

동일한 필터링 규칙이 여러 지정된 경우 실제로 마지막 규칙만 사용됩니다.

mysql> CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db1, db2), REPLICATE_DO_DB = (db3, db4);
mysql> CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db1,db2);

위의 명령어는 무시되고 아래 명령이 적용되어 db3,db4 복제대상에서 제외가 됩니다.

 

특정 테이블에 대해 복제필터링 규칙(특정테이블 복제) 작성하고 싶다면 다음과 같이 작성합니다.

mysql> CHANGE REPLICATION FILTER REPLICATE_DO_TABLE = (db1.tb1);

여러개를 적용하고 싶다면 다음과 같이 합니다.

mysql> CHANGE REPLICATION FILTER REPLICATE_DO_TABLE = (db1.tb1, db2.tb2);

 

특정 테이블에 대해 복제필터링 규칙(특정테이블 복제 제외) 작성하고 싶다면 다음과 같이 작성합니다.

mysql> CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE = (db1.tb1);

여러개를 적용하고 싶다면 다음과 같이 합니다.

mysql> CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE = (db1.tb1, db2.tb2);

 

특수 문자를 포함하지 않는 테이블 데이터베이스 이름은 인용 필요가 없습니다. REPLICATION_WILD_TABLE REPLICATION_WILD_IGNORE_TABLE 함께 사용되는 값은 문자열 표현식이며 (특수) 와일드 카드 문자를 포함 있으므로 따옴표로 묶어야합니다. 이것은 아래 예제 문장에 나와 있습니다.

mysql> CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('db1%.old%');
mysql> CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE = ('db1%.new%', 'db2%.new%');

REPLICATE_REWRITE_DB 함께 사용되는 값은 데이터베이스 이름 쌍을 나타냅니다. 이러한 값은 괄호로 묶어야합니다. 다음 명령문은 마스터의 데이터베이스 db1에서 발생하는 명령문을 슬레이브의 데이터베이스 db2 다시 작성합니다.

 

mysql> CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB = ((db1, db2));

방금 표시된 명령문에는 개의 괄호 세트가 있습니다. 하나는 데이터베이스 이름 쌍을 묶고 다른 하나는 전체 목록을 묶습니다.

다음 예에서 쉽게 있습니다. 개의 rewrite-db 규칙, 하나는 데이터베이스 DBA dbB, 다른 하나는 데이터베이스 dbC dbD 다시 작성합니다.

mysql> CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB = ((dbA, dbB), (dbC, dbD));

Master dbA데이터베이스에서 나오는 이벤트를 Slave에서는 dbB데이터베이스에 적용을 합니다. 뒤는 dbC데이터베이스에서 나오는 이벤트를 Slave에서는 dbD데이터베이스에 적용을 합니다.

 

문은 기존 복제 필터링 규칙을 변경하지 않은 채로 둡니다. 주어진 유형의 모든 필터를 설정 해제하려면이 예제와 같이 필터 값을 명시 적으로 비어있는 목록으로 설정하십시오. 이렇게하면 기존의 모든 REPLICATE_DO_DB REPLICATE_IGNORE_DB 규칙이 제거됩니다.

mysql> CHANGE REPLICATION FILTER REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();

방법으로 필터를 비우면 기존의 모든 규칙이 제거되고 새로운 규칙이 생성되지 않으며 명령 또는 구성 파일의 --replicate- * 옵션을 사용하여 mysqld 시작시 설정된 규칙이 복원되지 않습니다.

 

REPLICATE_WILD_DO_TABLE REPLICATE_WILD_IGNORE_TABLE 함께 사용되는 값은 db_name.tbl_name 형식이어야합니다. MySQL 5.7.5 이전에는 이러한 옵션에 부적합한 값을 사용하면 잘못된 결과를 초래할 있지만 (이는 버그 # 18095449) 엄격하게 적용되지 않았습니다.

 

▶ my.cnf에서 설정하는 방법

MySQL서버를 시작할 필터링을 거는 옵션을 입력하는데 명령옵션과 동일합니다. 똑같이 사용하면 됩니다. 옵션에 대한 설명은 위에 나와 있습니다.

[mysqld] 섹션에 입력합니다.

 

[mysqld]

replicate-do-db=db1

replicate-ignore-db=db1

replicate-do-table=db_name.tbl_name

replicate-ignore-table=db_name.tbl_name

replicate-wild-do-table=db1%.new%

replicate-wild-ignore-table=db2%.new%

replicate-rewrite-db=dbA, dbB

 

특정 필터링에 대해 여러개 지정하고 싶다면 옵션을 여러개 나열해서 입력합니다.

복제 대상 db 여러개 적용하고 싶다면 다음과 같이 입력합니다.

replicate-do-db=db1

replicate-do-db=db2

replicate-do-db=db3

 

복제 제외db 여러개 적용하고 싶다면 다음과 같이 합니다.

replicate-ignore-db=db1

replicate-ignore-db=db2

replicate-ignore-db=db3

 

아래 두개 옵션은 위에 명령문에서는 따옴표(') 묶었지만 my.cnf에서는 사용하지 않습니다.

replicate-wild-do-table=db1%.new%

replicate-wild-ignore-table=db2%.new%

 

 Master-Slave 복제 환경 관련 참고글

[Master-Slave] 복제소개 및 사용방법

 

[MySQL][Master-Slave] 복제소개 및 사용방법

MySQL은 여러형태의 복제 솔루션과 HA, 분산기능, 그리고 클러스터링을 지원합니다. Master-Slave구조 + MHA, Multi Master for MySQL, Galera Cluster, MaxScale(MariaDB), Sharding등 참 많은 기능들을 제공한다..

myinfrabox.tistory.com

[Master-Slave] 복제환경에서의 바이너리 로그 특징

 

[MySQL][Master-Slave] 복제 환경에서 Binary Log 특징

복제를 사용할 때 이진 로그에 대해 어떤 타입을 선택할지 정해야 하는데 이때 아래 내용들을 참고해서 설정하시면 도움이 됩니다. 복제를 할 때 safe(안전한), unsafe(안전하지 않은) 쿼리가 있는데 이것을 알면..

myinfrabox.tistory.com

[Master-Slave] 복제환경 모니터링

 

[MySQL][Master-Slave] 복제 환경 모니터링

Replication 상태에서 모니터링을 하는 방법에 대해 알아봅니다. 모니터링에서 표시해주는 상태에 따라 그에 맞는 대처를 해서 복제가 지속적으로 이루어 지도록 합니다. ■ Slave 상태 확인 mysql 클라이언트에서..

myinfrabox.tistory.com

[Master-Slave] 복제 필터링 - 복제평가방법

 

[MySQL][Master-Slave] 복제 필터링 - 복제평가방법

■ 서버가 복제 필터링 규칙을 평가하는 방법 복제를 구성할때 전체 데이터베이스를 대상으로 하는 방법도 있지만 원하는 데이터베이스만을 선택해서 복제할 수도 있습니다. 반대로 원하는 데이터베이스만을 복제..

myinfrabox.tistory.com

[Master-Slave] GTID를 이용한 복제 - 이론

 

[MySQL][Master-Slave] GTID를 이용한 복제 - 이론

이 섹션에서는 GTID (Global Transaction Identifier)를 사용한 트랜잭션 기반 복제에 대해 설명합니다. GTID를 사용할 때 각 트랜잭션은 원래 서버에서 커밋되고 슬레이브에 의해 적용될 때 식별되고 추적 될 수..

myinfrabox.tistory.com

[Master-Slave] GTID를 이용한 복제 - 구성방법

 

[MySQL][Master-Slave] GTID를 이용한 복제 - 구성방법

■ GTID를 이용한 복제 설정. 이 섹션에서는 MySQL 5.7에서 GTID 기반 복제를 구성하고 시작하는 프로세스에 대해 설명합니다. 이는 처음으로 복제 마스터를 시작하거나 중지 할 수 있다고 가정하는 "콜드 스타트"..

myinfrabox.tistory.com

Designed by JB FACTORY