[MySQL][Master-Slave] 복제 필터링 - 명령문 및 적용방법
- Databases/MySQL
- 2020. 3. 28.
■ 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] 복제소개 및 사용방법
[Master-Slave] 복제환경에서의 바이너리 로그 특징
[Master-Slave] 복제환경 모니터링
[Master-Slave] 복제 필터링 - 복제평가방법
[Master-Slave] GTID를 이용한 복제 - 이론
[Master-Slave] GTID를 이용한 복제 - 구성방법
'Databases > MySQL' 카테고리의 다른 글
[MySQL][Master-Slave] GTID를 이용한 복제 - 이론 (0) | 2020.04.09 |
---|---|
[MySQL][Backup n Recovery] mysqldump 프로그램 제대로 파해치기 (0) | 2020.04.02 |
[MySQL][Master-Slave] 복제 필터링 - 복제평가방법 (0) | 2020.03.28 |
[MySQL][Master-Slave] 복제 환경 모니터링 (0) | 2020.03.20 |
[MySQL][Master-Slave] 복제 환경에서 Binary Log 특징 (0) | 2020.03.14 |