Permite executar consultas SELECT e INSERT em dados armazenados em um servidor MySQL remoto.
Sintaxe
mysql({host:port, database, table, user, password[, replace_query, on_duplicate_clause] | named_collection[, option=value [,..]]})Argumentos
| Argument | Descrição |
|---|---|
host:port |
Endereço do servidor MySQL. |
database |
Nome do banco de dados remoto. |
table |
Nome da tabela remota ou uma consulta passada ao MySQL como está (consulte Passando uma consulta em vez de um nome de tabela). |
user |
Usuário do MySQL. |
password |
Senha do usuário. |
replace_query |
Sinalizador que converte consultas INSERT INTO em REPLACE INTO. Valores possíveis:- 0 - A consulta é executada como INSERT INTO.- 1 - A consulta é executada como REPLACE INTO. |
on_duplicate_clause |
A expressão ON DUPLICATE KEY on_duplicate_clause adicionada à consulta INSERT. Ela só pode ser especificada com replace_query = 0 (se você passar replace_query = 1 e on_duplicate_clause ao mesmo tempo, o ClickHouse gerará uma exceção).Exemplo: INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1;Aqui, on_duplicate_clause é UPDATE c2 = c2 + 1. Consulte a documentação do MySQL para ver quais valores de on_duplicate_clause podem ser usados com a cláusula ON DUPLICATE KEY. |
Os argumentos também podem ser passados usando coleções nomeadas. Nesse caso, host e port devem ser especificados separadamente. Essa abordagem é recomendada para ambientes de produção.
Cláusulas WHERE simples, como =, !=, >, >=, <, <=, atualmente são executadas no servidor MySQL.
O restante das condições e a restrição de amostragem LIMIT são executados no ClickHouse somente após a conclusão da consulta ao MySQL.
TLS/SSL
As credenciais de uma conexão criptografada com o MySQL são fornecidas como chaves de coleção nomeada (ou como argumentos de chave-valor):
| Parâmetro | Descrição |
|---|---|
ssl_ca_pem |
Conteúdo do certificado de CA usado para verificar o certificado do servidor MySQL. |
ssl_cert_pem |
Conteúdo do certificado do cliente, para autenticação baseada em certificado. |
ssl_key_pem |
Conteúdo da chave privada associada a ssl_cert_pem. |
Os valores correspondem ao conteúdo dos respectivos arquivos PEM, que pode ser copiado para uma coleção nomeada ou para uma consulta. Eles são mascarados nos logs e em consultas SHOW, da mesma forma que as senhas.
As mesmas credenciais também podem ser fornecidas como caminhos para arquivos no servidor, em ssl_ca, ssl_cert e ssl_key — mas somente em uma coleção nomeada definida no arquivo de configuração do servidor, e esse valor não pode ser substituído em uma consulta. O servidor abre esses arquivos com seus próprios privilégios. Portanto, aceitar um caminho via SQL permitiria que qualquer usuário capaz de definir uma fonte MySQL sondasse o sistema de arquivos local e se autenticasse com um certificado e uma chave que não tem permissão para ler.
Passando uma consulta em vez de um nome de tabela
Em vez de um nome de tabela, o terceiro argumento pode ser uma consulta SELECT passada ao MySQL como está. A estrutura da tabela resultante é inferida a partir do resultado da consulta. A consulta pode ser escrita como uma subconsulta ou encapsulada na função 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');Isso é útil para executar junções, agregações ou qualquer outro processamento no MySQL. Essa tabela é somente leitura: não é permitido fazer INSERT nela. A mesma sintaxe é compatível com o motor de tabela MySQL.
Compatível com várias réplicas, que devem ser listadas com |. Por exemplo:
SELECT name FROM mysql(`mysql{1|2|3}:3306`, 'mysql_database', 'mysql_table', 'user', 'password');ou
SELECT name FROM mysql(`mysql1:3306|mysql2:3306|mysql3:3306`, 'mysql_database', 'mysql_table', 'user', 'password');Valor retornado
Um objeto de tabela com as mesmas colunas da tabela MySQL original.
Exemplos
Tabela no 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 |
+--------+-------+Selecionar dados do ClickHouse:
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');Ou usando coleções nomeadas:
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 a compressão para a conexão via protocolo MySQL.
Valor padrão: false.
Esta configuração se aplica a:
- a função de tabela
mysql; - o motor de tabela
MySQL; - o mecanismo de banco de dados
MySQL; - coleções nomeadas usadas por integrações com MySQL.
Quando habilitada, o ClickHouse solicita compressão para a conexão.
Exemplo:
SELECT *
FROM mysql(
'mysql80:3306',
'clickhouse',
'test_table',
'root',
'password',
SETTINGS enable_compression = 1
);Substituição e inserção:
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 │
└────────┴───────┘Copiando dados da tabela do MySQL para a tabela do 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');Ou, se estiver copiando apenas um lote incremental do MySQL com base no ID máximo atual:
INSERT INTO mysql_copy
SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password')
WHERE id > (SELECT max(id) FROM mysql_copy);