Loading...
MySQL 9.5 Reference Manual 9.5의 18.6 The BLACKHOLE Storage Engine의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
BLACKHOLE storage engine은 데이터를 받아들이지만 이를 버리고 저장하지 않는 “블랙홀(black hole)”처럼 동작합니다. 조회는 항상 빈 결과를 반환합니다:
1mysql> CREATE TABLE test(i INT, c CHAR(10)) ENGINE = BLACKHOLE; 2Query OK, 0 rows affected (0.03 sec) 3 4mysql> INSERT INTO test VALUES(1,'record one'),(2,'record two'); 5Query OK, 2 rows affected (0.00 sec) 6Records: 2 Duplicates: 0 Warnings: 0 7 8mysql> SELECT * FROM test; 9Empty set (0.00 sec)
소스에서 MySQL을 빌드할 때 BLACKHOLE storage engine을 활성화하려면, CMake를 호출할 때
-DWITH_BLACKHOLE_STORAGE_ENGINE
옵션을 사용합니다.
BLACKHOLE engine의 소스를 확인하려면, MySQL 소스 배포본의 sql 디렉터리를 살펴보십시오.
BLACKHOLE 테이블을 생성하면, 서버는 global 데이터 딕셔너리에 테이블 정의를 생성합니다. 테이블과 연결된 파일은 존재하지 않습니다.
BLACKHOLE storage engine은 모든 종류의 인덱스를 지원합니다. 즉, 테이블 정의에 인덱스 선언을 포함할 수 있습니다.
최대 키 길이는 3072바이트입니다.
BLACKHOLE storage engine은 파티셔닝을 지원하지 않습니다.
BLACKHOLE storage engine이 사용 가능한지 확인하려면
SHOW ENGINES
문을 사용할 수 있습니다.
BLACKHOLE 테이블에 대한 insert는 아무 데이터도 저장하지 않지만, 문장 기반 바이너리 로깅이 활성화된 경우 SQL 문은 로그에 기록되고 replica 서버로 복제됩니다. 이는 반복자(repeater) 또는 필터 메커니즘으로 유용하게 사용될 수 있습니다.
애플리케이션에 replica 측 필터링 규칙이 필요하지만, 먼저 모든 바이너리 로그 데이터를 replica로 전송하면 트래픽이 너무 많아지는 상황을 가정해 봅시다.
이런 경우, replication source 서버에 기본 storage engine이 BLACKHOLE인 “dummy” replica 프로세스를 설정할 수 있으며, 이는 다음과 같이 나타낼 수 있습니다:
Figure 18.1 Replication using BLACKHOLE for Filtering

source는 자신의 바이너리 로그에 기록합니다. “dummy” mysqld 프로세스는 replica처럼 동작하여, 원하는 조합의 replicate-do-* 및 replicate-ignore-* 규칙을 적용하고, 자신의 새로운 필터링된 바이너리 로그를 기록합니다.
(Section 19.1.6, “Replication and Binary Logging Options and Variables”을 참조하십시오.) 이 필터링된 로그가 replica에 제공됩니다.
dummy 프로세스는 실제로 아무 데이터도 저장하지 않으므로, replication source 서버에서 추가 mysqld 프로세스를 실행하더라도 처리 오버헤드는 거의 없습니다. 이러한 종류의 설정은 추가 replica에 대해서도 반복할 수 있습니다.
BLACKHOLE 테이블에 대한
INSERT 트리거는 예상대로 동작합니다. 그러나 BLACKHOLE 테이블은 실제로 아무 데이터도 저장하지 않으므로,
UPDATE 및
DELETE 트리거는 활성화되지 않습니다. 트리거 정의의 FOR EACH ROW 절은 row가 없기 때문에 적용되지 않습니다.
BLACKHOLE storage engine의 다른 가능한 사용 사례는 다음과 같습니다:
덤프 파일 구문 검증.
바이너리 로깅이 활성화된 경우와 비활성화된 경우의
BLACKHOLE 사용 성능을 비교하여
바이너리 로깅으로 인한 오버헤드 측정.
BLACKHOLE은 본질적으로 “no-op” storage engine이므로, storage engine 자체와 관련 없는 성능 병목을 찾는 데 사용할 수 있습니다.
BLACKHOLE engine은 트랜잭션 인지형(transaction-aware)이며, 커밋된 트랜잭션은 바이너리 로그에 기록되고 롤백된 트랜잭션은 기록되지 않습니다.
Blackhole Engine and Auto Increment Columns
BLACKHOLE engine은 no-op engine입니다. BLACKHOLE을 사용하는 테이블에 대해 수행되는 어떤 연산도 효과를 내지 않습니다.
이는 auto increment되는 primary key 컬럼의 동작을 고려할 때 유념해야 합니다. 이 engine은 필드 값을 자동으로 증가시키지 않으며, auto increment 필드 상태를 보존하지도 않습니다. 이는 replication에서 중요한 의미를 가집니다.
다음 세 가지 조건이 모두 적용되는 replication 시나리오를 고려해 봅시다:
source 서버에는 auto increment 필드가 primary key인 blackhole 테이블이 있습니다.
replica에는 동일한 테이블이 존재하지만 MyISAM engine을 사용합니다.
source의 테이블에 대해 insert가 수행되는데, INSERT 문 자체에서 auto increment 값을 명시적으로 설정하지 않거나, SET INSERT_ID 문을 사용하지 않습니다.
이 시나리오에서 replication은 primary key 컬럼에서의 duplicate entry 오류로 실패합니다.
문장 기반 replication에서는 context 이벤트의 INSERT_ID 값이 항상 동일합니다. 따라서 primary key 컬럼에 대한 중복 값을 가진 row를 insert하려 하기 때문에 replication이 실패합니다.
row 기반 replication에서는, engine이 row에 대해 반환하는 값이 각 insert마다 항상 동일합니다. 그 결과 replica는 동일한 primary key 컬럼 값을 사용하여 두 개의 insert 로그 엔트리를 재생하려고 시도하게 되고, 따라서 replication이 실패합니다.
Column Filtering
row 기반 replication
(binlog_format=ROW)을 사용할 때, 테이블에서 마지막 컬럼이 빠져 있는 replica는 지원되며, 이에 대해서는
Section 19.5.1.9, “Replication with Differing Table Definitions on Source and Replica”
섹션에서 설명합니다.
이 필터링은 replica 측에서 동작하며, 즉 컬럼이 replica로 복사된 후에 필터링이 이루어집니다. 컬럼을 replica로 복사하는 것이 바람직하지 않은 경우가 최소 두 가지 있습니다:
데이터가 기밀이어서 replica 서버가 이에 접근해서는 안 되는 경우.
source에 많은 replica가 있어, replica로 전송하기 전에 필터링을 수행하면 네트워크 트래픽을 줄일 수 있는 경우.
source 컬럼 필터링은 BLACKHOLE engine을 사용하여 구현할 수 있습니다. 이는 source 테이블 필터링을 구현하는 방법과 유사하게 수행되며, BLACKHOLE engine과
--replicate-do-table 또는
--replicate-ignore-table
옵션을 사용합니다.
source에 대한 설정은 다음과 같습니다:
1CREATE TABLE t1 (public_col_1, ..., public_col_N, 2 secret_col_1, ..., secret_col_M) ENGINE=MyISAM;
trusted replica에 대한 설정은 다음과 같습니다:
1CREATE TABLE t1 (public_col_1, ..., public_col_N) ENGINE=BLACKHOLE;
untrusted replica에 대한 설정은 다음과 같습니다:
1CREATE TABLE t1 (public_col_1, ..., public_col_N) ENGINE=MyISAM;
18.5 The ARCHIVE Storage Engine
18.7 The MERGE Storage Engine