Allows SELECT and INSERT queries to be performed on data that are stored on a remote MySQL server.
Syntax
mysql({host:port, database, table, user, password[, replace_query, on_duplicate_clause] | named_collection[, option=value [,..]]})Arguments
| Argument | Description |
|---|---|
host:port |
MySQL server address. |
database |
Remote database name. |
table |
Remote table name, or a query passed to MySQL as is (see Passing a query instead of a table name). |
user |
MySQL user. |
password |
User password. |
replace_query |
Flag that converts INSERT INTO queries to REPLACE INTO. Possible values:- 0 - The query is executed as INSERT INTO.- 1 - The query is executed as REPLACE INTO. |
on_duplicate_clause |
The ON DUPLICATE KEY on_duplicate_clause expression that is added to the INSERT query. Can be specified only with replace_query = 0 (if you simultaneously pass replace_query = 1 and on_duplicate_clause, ClickHouse generates an exception).Example: INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1;on_duplicate_clause here is UPDATE c2 = c2 + 1. See the MySQL documentation to find which on_duplicate_clause you can use with the ON DUPLICATE KEY clause. |
Arguments also can be passed using named collections. In this case host and port should be specified separately. This approach is recommended for production environment.
Simple WHERE clauses such as =, !=, >, >=, <, <= are currently executed on the MySQL server.
The rest of the conditions and the LIMIT sampling constraint are executed in ClickHouse only after the query to MySQL finishes.
TLS/SSL
The credentials of an encrypted connection to MySQL are passed as named collection keys (or as key-value arguments):
| Parameter | Description |
|---|---|
ssl_ca_pem |
Contents of the CA certificate that the MySQL server certificate is verified against. |
ssl_cert_pem |
Contents of the client certificate, for certificate-based authentication. |
ssl_key_pem |
Contents of the private key belonging to ssl_cert_pem. |
The values are the contents of the corresponding PEM files, which can be copied into a named collection or into a query. They are masked in logs and in SHOW queries, the same way passwords are.
The same credentials can also be given as paths to files on the server, in ssl_ca, ssl_cert and ssl_key — but only in a named collection defined in the server configuration file, and such a value cannot be overridden in a query. The server opens those files with its own privileges, so accepting a path from SQL would let any user who is able to define a MySQL source probe the local filesystem, and authenticate with a certificate and key they are not allowed to read themselves.
Passing a query instead of a table name
Instead of a table name, the third argument can be a SELECT query that is passed to MySQL as is. The structure of the resulting table is inferred from the query result. The query can be written either as a subquery, or wrapped into the query function:
SELECT * FROM mysql('localhost:3306', 'test', (SELECT a, b FROM t1 JOIN t2 USING (id) WHERE a > 0), 'user', 'password');
SELECT * FROM mysql('localhost:3306', 'test', query('SELECT a, b FROM t1 JOIN t2 USING (id) WHERE a > 0'), 'user', 'password');This is useful to push down joins, aggregations or any other processing to MySQL. Such a table is read-only: INSERT into it is not allowed. The same syntax is supported by the MySQL table engine.
Supports multiple replicas that must be listed by |. For example:
SELECT name FROM mysql(`mysql{1|2|3}:3306`, 'mysql_database', 'mysql_table', 'user', 'password');or
SELECT name FROM mysql(`mysql1:3306|mysql2:3306|mysql3:3306`, 'mysql_database', 'mysql_table', 'user', 'password');Returned value
A table object with the same columns as the original MySQL table.
Examples
Table in MySQL:
mysql> CREATE TABLE `test`.`test` (
-> `int_id` INT NOT NULL AUTO_INCREMENT,
-> `float` FLOAT NOT NULL,
-> PRIMARY KEY (`int_id`));
mysql> INSERT INTO test (`int_id`, `float`) VALUES (1,2);
mysql> SELECT * FROM test;
+--------+-------+
| int_id | float |
+--------+-------+
| 1 | 2 |
+--------+-------+Selecting data from ClickHouse:
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');Or using named collections:
CREATE NAMED COLLECTION creds AS
host = 'localhost',
port = 3306,
database = 'test',
user = 'bayonet',
password = '123';
SELECT * FROM mysql(creds, table='test');┌─int_id─┬─float─┐
│ 1 │ 2 │
└────────┴───────┘enable_compression
Enables compression for the MySQL protocol connection.
Default value: false.
This setting applies to:
- the
mysqltable function; - the
MySQLtable engine; - the
MySQLdatabase engine; - named collections used by MySQL integrations.
When enabled, ClickHouse requests compression for the connection.
Example:
SELECT *
FROM mysql(
'mysql80:3306',
'clickhouse',
'test_table',
'root',
'password',
SETTINGS enable_compression = 1
);Replacing and inserting:
INSERT INTO FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 1) (int_id, float) VALUES (1, 3);
INSERT INTO TABLE FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 0, 'UPDATE int_id = int_id + 1') (int_id, float) VALUES (1, 4);
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');┌─int_id─┬─float─┐
│ 1 │ 3 │
│ 2 │ 4 │
└────────┴───────┘Copying data from MySQL table into ClickHouse table:
CREATE TABLE mysql_copy
(
`id` UInt64,
`datetime` DateTime('UTC'),
`description` String,
)
ENGINE = MergeTree
ORDER BY (id,datetime);
INSERT INTO mysql_copy
SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password');Or if copying only an incremental batch from MySQL based on the max current id:
INSERT INTO mysql_copy
SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password')
WHERE id > (SELECT max(id) FROM mysql_copy);