Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

mysql

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);
Navigation