MySQL 데이터베이스 엔진
MySQL 데이터베이스 엔진
원격 MySQL 서버의 데이터베이스에 연결하고, ClickHouse와 MySQL 사이 데이터를 교환하기 위해 INSERT와 SELECT 쿼리를 수행할 수 있게 해주는 데이터베이스 엔진이에요. SHOW TABLES나 SHOW CREATE TABLE 같은 연산을 수행할 수 있게 쿼리를 MySQL 서버로 변환해줘요.
출처: 문서
본문
원격 MySQL 서버의 데이터베이스에 연결하고, ClickHouse와 MySQL 사이 데이터를 교환하기 위해 INSERT와 SELECT 쿼리를 수행할 수 있게 해줘요. MySQL 데이터베이스 엔진은 쿼리를 MySQL 서버로 변환하므로 SHOW TABLES나 SHOW CREATE TABLE 같은 연산을 수행할 수 있어요. 다음 쿼리는 수행할 수 없어요.
RENAMECREATE TABLEALTER
데이터베이스 만들기 (Creating a database)
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')
[SETTINGS enable_compression=0]
엔진 매개변수 (Engine Parameters)
host:port— MySQL 서버 주소.database— 원격 데이터베이스 이름.user— MySQL 사용자.password— 사용자 비밀번호.
설정 (Settings)
enable_compression
MySQL 프로토콜 연결에 zlib 압축을 켜요. 1로 설정하면 ClickHouse가 MySQL 서버에 프로토콜 수준 압축을 요청해요. 기본값: 0. 예시:
CREATE DATABASE mysql_db
ENGINE = MySQL('localhost:3306', 'test', 'my_user', 'user_password')
SETTINGS enable_compression = 1;
TLS/SSL
MySQL에 대한 암호화 연결의 자격 증명은 명명된 컬렉션(named collection) 키(또는 키-값 인자)로 전달돼요.
| 매개변수 | 설명 |
|---|---|
ssl_ca_pem |
MySQL 서버 인증서가 검증되는 CA 인증서의 내용. |
ssl_cert_pem |
인증서 기반 인증을 위한 클라이언트 인증서의 내용. |
ssl_key_pem |
ssl_cert_pem에 속하는 개인 키의 내용. |
값은 해당 PEM 파일의 내용이며, 명명된 컬렉션이나 쿼리에 복사할 수 있어요. 비밀번호와 같은 방식으로 로그와 SHOW 쿼리에서 마스킹돼요. 같은 자격 증명을 ssl_ca, ssl_cert, ssl_key의 서버 파일 경로로도 줄 수 있지만, 오직 서버 설정 파일에 정의된 명명된 컬렉션에서만, 그리고 그런 값은 쿼리에서 덮어쓸 수 없어요. 서버는 그 파일을 자신의 권한으로 열므로, SQL에서 경로를 받아들이게 하면 MySQL 소스를 정의할 수 있는 어떤 사용자든 로컬 파일시스템을 조사하고, 스스로 읽을 권한이 없는 인증서와 키로 인증할 수 있게 돼요.
데이터 타입 지원 (Data types support)
| MySQL | ClickHouse |
|---|---|
| UNSIGNED TINYINT | UInt8 |
| TINYINT | Int8 |
| UNSIGNED SMALLINT | UInt16 |
| SMALLINT | Int16 |
| UNSIGNED INT, UNSIGNED MEDIUMINT | UInt32 |
| INT, MEDIUMINT | Int32 |
| UNSIGNED BIGINT | UInt64 |
| BIGINT | Int64 |
| FLOAT | Float32 |
| DOUBLE | Float64 |
| DATE | Date |
| DATETIME, TIMESTAMP | DateTime |
| BINARY | FixedString |
| POINT | Point |
| LINESTRING | LineString |
| POLYGON | Polygon |
| MULTILINESTRING | MultiLineString |
| MULTIPOLYGON | MultiPolygon |
| MULTIPOINT | MultiPoint |
| GEOMETRY | Geometry |
공간 타입의 변환(POINT는 항상 변환됨)은 기본적으로 켜진 mysql_datatypes_support_level 설정의 geometry 플래그로 제어돼요. 일반 GEOMETRY 컬럼 타입은 포괄적인 Geometry 타입(구체적 기하 타입들에 대한 Variant)으로 매핑돼요. 그런 컬럼은 어떤 하위 타입의 값도 담을 수 있으므로, ClickHouse 대응 타입(GEOMETRYCOLLECTION)이 없는 하위 타입의 값을 읽으면 읽기 시점에 예외가 던져져요. 이 비호환은 적절한 기하 타입을 얻는 대가로 받아들여져요. GEOMETRYCOLLECTION 타입으로 선언된 컬럼은 다른 모든 MySQL 데이터 타입처럼 String으로 변환돼요.
Nullable은 지원돼요. 공간 컬럼은 세 가지 경우에 기하 타입 대신 String(Nullable이면 Nullable(String))으로 매핑돼요. GEOMETRYCOLLECTION으로 선언된 경우, geometry 플래그가 꺼져 있고 타입이 POINT가 아닌 경우, 또는 컬럼이 nullable이고 타입이 POINT가 아닌 경우(Point는 Nullable 안에 중첩될 수 있는 유일한 기하 타입이므로). 세 경우 모두 문자열은 MySQL이 반환하는 그대로 값을 담아요. 4바이트 SRID 접두사 뒤에 WKB 페이로드가 오므로, WKB 디코더에 전달하기 전에 그 4바이트를 잘라내야 해요.
전역 변수 지원 (Global variables support)
더 나은 호환성을 위해 MySQL 스타일인 @@identifier로 전역 변수를 지정할 수 있어요. 다음 변수가 지원돼요.
versionmax_allowed_packet
지금은 이 변수들이 스텁이며 어떤 것에도 대응하지 않아요. 예시:
SELECT @@version;
사용 예시 (Examples of use)
MySQL의 테이블:
mysql> USE test;
Database changed
mysql> CREATE TABLE `mysql_table` (
-> `int_id` INT NOT NULL AUTO_INCREMENT,
-> `float` FLOAT NOT NULL,
-> PRIMARY KEY (`int_id`));
Query OK, 0 rows affected (0,09 sec)
mysql> insert into mysql_table (`int_id`, `float`) VALUES (1,2);
Query OK, 1 row affected (0,00 sec)
mysql> select * from mysql_table;
+------+-----+
| int_id | value |
+------+-----+
| 1 | 2 |
+------+-----+
1 row in set (0,00 sec)
MySQL 서버와 데이터를 교환하는 ClickHouse의 데이터베이스:
CREATE DATABASE mysql_db ENGINE = MySQL('localhost:3306', 'test', 'my_user', 'user_password') SETTINGS read_write_timeout=10000, connect_timeout=100;
SHOW DATABASES
┌─name─────┐
│ default │
│ mysql_db │
│ system │
└──────────┘
SHOW TABLES FROM mysql_db
┌─name─────────┐
│ mysql_table │
└──────────────┘
SELECT * FROM mysql_db.mysql_table
┌─int_id─┬─value─┐
│ 1 │ 2 │
└────────┴───────┘
INSERT INTO mysql_db.mysql_table VALUES (3,4)
SELECT * FROM mysql_db.mysql_table
┌─int_id─┬─value─┐
│ 1 │ 2 │
│ 3 │ 4 │
└────────┴───────┘