MySQL 데이터베이스 엔진

MySQL 데이터베이스 엔진

원격 MySQL 서버의 데이터베이스에 연결하고, ClickHouse와 MySQL 사이 데이터를 교환하기 위해 INSERTSELECT 쿼리를 수행할 수 있게 해주는 데이터베이스 엔진이에요. SHOW TABLESSHOW CREATE TABLE 같은 연산을 수행할 수 있게 쿼리를 MySQL 서버로 변환해줘요.

출처: 문서

본문

원격 MySQL 서버의 데이터베이스에 연결하고, ClickHouse와 MySQL 사이 데이터를 교환하기 위해 INSERTSELECT 쿼리를 수행할 수 있게 해줘요. MySQL 데이터베이스 엔진은 쿼리를 MySQL 서버로 변환하므로 SHOW TABLESSHOW CREATE TABLE 같은 연산을 수행할 수 있어요. 다음 쿼리는 수행할 수 없어요.

  • RENAME
  • CREATE TABLE
  • ALTER

데이터베이스 만들기 (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가 아닌 경우(PointNullable 안에 중첩될 수 있는 유일한 기하 타입이므로). 세 경우 모두 문자열은 MySQL이 반환하는 그대로 값을 담아요. 4바이트 SRID 접두사 뒤에 WKB 페이로드가 오므로, WKB 디코더에 전달하기 전에 그 4바이트를 잘라내야 해요.

전역 변수 지원 (Global variables support)

더 나은 호환성을 위해 MySQL 스타일인 @@identifier로 전역 변수를 지정할 수 있어요. 다음 변수가 지원돼요.

  • version
  • max_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 │
└────────┴───────┘

더 알아보기 (Learn more)