Permite realizar consultas SELECT e INSERT sobre datos almacenados en un servidor MySQL remoto.
Sintaxis
mysql({host:port, database, table, user, password[, replace_query, on_duplicate_clause] | named_collection[, option=value [,..]]})Argumentos
| Argument | Descripción |
|---|---|
host:port |
Dirección del servidor MySQL. |
database |
Nombre de la base de datos remota. |
table |
Nombre de la tabla remota, o una consulta pasada a MySQL tal cual (consulta Pasar una consulta en lugar de un nombre de tabla). |
user |
Usuario de MySQL. |
password |
Contraseña del usuario. |
replace_query |
Indicador que convierte las consultas INSERT INTO en REPLACE INTO. Posibles valores:- 0 - La consulta se ejecuta como INSERT INTO.- 1 - La consulta se ejecuta como REPLACE INTO. |
on_duplicate_clause |
La expresión ON DUPLICATE KEY on_duplicate_clause que se añade a la consulta INSERT. Solo puede especificarse con replace_query = 0 (si se pasan simultáneamente replace_query = 1 y on_duplicate_clause, ClickHouse genera una excepción).Ejemplo: INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1;Aquí, on_duplicate_clause es UPDATE c2 = c2 + 1. Consulta la documentación de MySQL para ver qué on_duplicate_clause puedes usar con la cláusula ON DUPLICATE KEY. |
Los argumentos también pueden pasarse mediante colecciones con nombre. En este caso, host y port deben especificarse por separado. Este enfoque se recomienda para entornos de producción.
Las cláusulas WHERE simples, como =, !=, >, >=, <, <=, se ejecutan actualmente en el servidor MySQL.
El resto de las condiciones y la restricción de muestreo LIMIT se ejecutan en ClickHouse solo después de que termina la consulta a MySQL.
TLS/SSL
Las credenciales de una conexión cifrada a MySQL se proporcionan como claves de una colección con nombre (o como argumentos clave-valor):
| Parámetro | Descripción |
|---|---|
ssl_ca_pem |
Contenido del certificado de CA con el que se verifica el certificado del servidor MySQL. |
ssl_cert_pem |
Contenido del certificado del cliente para la autenticación basada en certificados. |
ssl_key_pem |
Contenido de la clave privada asociada a ssl_cert_pem. |
Los valores son el contenido de los archivos PEM correspondientes, que puede copiarse en una colección con nombre o en una consulta. Se enmascaran en los logs y en las consultas SHOW, del mismo modo que las contraseñas.
Las mismas credenciales también pueden proporcionarse como rutas a archivos en el servidor, mediante ssl_ca, ssl_cert y ssl_key, pero solo en una colección con nombre definida en el archivo de configuración del servidor; ese valor no puede sobrescribirse en una consulta. El servidor abre esos archivos con sus propios privilegios, por lo que aceptar una ruta desde SQL permitiría a cualquier usuario que pueda definir una fuente MySQL explorar el sistema de archivos local y autenticarse con un certificado y una clave que no tiene permiso para leer.
Pasar una consulta en lugar del nombre de una tabla
En lugar del nombre de una tabla, el tercer argumento puede ser una consulta SELECT que se pasa a MySQL tal cual. La estructura de la tabla resultante se infiere del resultado de la consulta. La consulta puede escribirse como una subconsulta o ir envuelta en la función query:
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');Esto es útil para hacer pushdown de joins, agregaciones o cualquier otro procesamiento a MySQL. Esta tabla es de solo lectura: no se permite hacer INSERT en ella. La misma sintaxis es compatible con el motor de tabla MySQL.
Admite varias réplicas que deben listarse con |. Por ejemplo:
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');Valor devuelto
Un objeto de tabla con las mismas columnas que la tabla original de MySQL.
Ejemplos
Tabla en 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 |
+--------+-------+Selección de datos de ClickHouse:
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');O bien, usando colecciones con nombre:
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
Habilita la compresión para la conexión mediante el protocolo MySQL.
Valor predeterminado: false.
Esta configuración se aplica a:
- la función de tabla
mysql; - el motor de tabla
MySQL; - el engine de base de datos
MySQL; - las colecciones con nombre usadas por las integraciones de MySQL.
Cuando está habilitada, ClickHouse solicita compresión para la conexión.
Ejemplo:
SELECT *
FROM mysql(
'mysql80:3306',
'clickhouse',
'test_table',
'root',
'password',
SETTINGS enable_compression = 1
);Reemplazo e inserción:
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 │
└────────┴───────┘Copiar datos desde una tabla de MySQL a una tabla de ClickHouse:
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');O, si copias solo un lote incremental desde MySQL tomando como referencia el id máximo actual:
INSERT INTO mysql_copy
SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password')
WHERE id > (SELECT max(id) FROM mysql_copy);