> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Источник словаря MySQL

> Настройка MySQL в качестве источника словаря в ClickHouse.

Пример настроек:

<Tabs>
  <Tab title="DDL">
    ```sql theme={null}
    SOURCE(MYSQL(
        port 3306
        user 'clickhouse'
        password 'qwerty'
        replica(host 'example01-1' priority 1)
        replica(host 'example01-2' priority 1)
        db 'db_name'
        table 'table_name'
        where 'id=10'
        invalidate_query 'SQL_QUERY'
        fail_on_connection_loss 'true'
        query 'SELECT id, value_1, value_2 FROM db_name.table_name'
        enable_compression 1
    ))
    ```
  </Tab>

  <Tab title="Файл конфигурации">
    ```xml theme={null}
    <source>
      <mysql>
          <port>3306</port>
          <user>clickhouse</user>
          <password>qwerty</password>
          <replica>
              <host>example01-1</host>
              <priority>1</priority>
          </replica>
          <replica>
              <host>example01-2</host>
              <priority>1</priority>
          </replica>
          <db>db_name</db>
          <table>table_name</table>
          <where>id=10</where>
          <invalidate_query>SQL_QUERY</invalidate_query>
          <fail_on_connection_loss>true</fail_on_connection_loss>
          <query>SELECT id, value_1, value_2 FROM db_name.table_name</query>
          <enable_compression>1</enable_compression>
      </mysql>
    </source>
    ```
  </Tab>
</Tabs>

<br />

Поля настроек:

| Параметр | Описание |
| - | - |
| `port` | Порт сервера MySQL. Его можно указать для всех реплик или для каждой по отдельности (внутри `<replica>`). |
| `user` | Имя пользователя MySQL. Его можно указать для всех реплик или для каждой по отдельности (внутри `<replica>`). |
| `password` | Пароль пользователя MySQL. Его можно указать для всех реплик или для каждой по отдельности (внутри `<replica>`). |
| `replica` | Раздел с конфигурациями реплик. Таких разделов может быть несколько. |
| `replica/host` | Хост MySQL. |
| `replica/priority` | Приоритет реплики. При попытке подключения ClickHouse перебирает реплики в порядке приоритета. Чем меньше число, тем выше приоритет. |
| `db` | Имя базы данных. |
| `table` | Имя таблицы. |
| `where` | Условие выборки. Синтаксис условий такой же, как в `WHERE` в MySQL, например `id > 10 AND id < 20`. Необязательно. |
| `invalidate_query` | Запрос для проверки состояния словаря. Необязательно. Подробнее см. в разделе [Обновление данных словаря с помощью LIFETIME](/ru/reference/statements/create/dictionary/lifetime). |
| `fail_on_connection_loss` | Управляет поведением сервера при потере соединения. Если значение `true`, исключение генерируется немедленно, если соединение между клиентом и сервером было потеряно. Если значение `false`, сервер повторяет попытку получить данные не менее трёх раз, прежде чем сообщить об ошибке. Обратите внимание, что повторные попытки увеличивают время ответа. Значение по умолчанию: `false`. |
| `query` | Пользовательский запрос. Необязательно. |
| `enable_compression` | Включает сжатие zlib для соединения по протоколу MySQL. Если установлено значение `1`, ClickHouse запрашивает сжатие на уровне протокола у сервера MySQL. Также может быть задано отдельно для каждой реплики внутри `<replica>`. Значение по умолчанию: `0`. |
| `enable_local_infile` | Позволяет серверу MySQL запрашивать у ClickHouse содержимое локального файла (`LOAD DATA LOCAL INFILE`). Включить его может только словарь, определённый в файле конфигурации сервера; в запросе `CREATE DICTIONARY` его можно не задавать или задать значение `0`. Также может быть задано отдельно для каждой реплики внутри `<replica>`, причём `<replica>`, где оно не задано, наследует значение, указанное выше. Значение по умолчанию: `0`. |
| `ssl_ca_pem` | Содержимое CA‑сертификата, по которому проверяется сертификат сервера MySQL. Необязательно. |
| `ssl_cert_pem` | Содержимое клиентского сертификата для аутентификации на основе сертификата. Необязательно. |
| `ssl_key_pem` | Содержимое закрытого ключа, принадлежащего `ssl_cert_pem`. Необязательно. |
| `ssl_ca`, `ssl_cert`, `ssl_key` | Те же учётные данные в виде путей к файлам на сервере. Разрешено только для словаря, определённого в файле конфигурации сервера или через определённую там именованную коллекцию; см. ниже. Необязательно. |

<Note>
  Поля `table` и `where` нельзя использовать вместе с полем `query`. При этом должно быть объявлено либо поле `table`, либо поле `query`.
</Note>

<Note>
  `ssl_ca`, `ssl_cert` и `ssl_key` задают имена файлов, которые сервер открывает со своими собственными привилегиями, поэтому они принимаются только для словаря, определённого в файле конфигурации сервера или через определённую там именованную коллекцию. Запрос `CREATE DICTIONARY`, в котором учётные данные TLS указываются напрямую, должен вместо этого передавать их содержимое в `ssl_ca_pem`, `ssl_cert_pem` и `ssl_key_pem`. Эти значения маскируются в логах и в запросах `SHOW`, так же как пароли.
</Note>

<Note>
  `enable_local_infile` позволяет серверу MySQL запрашивать у ClickHouse содержимое выбранного им файла, который сервер читает со своими собственными привилегиями, поэтому этот параметр принимается только для словаря, определённого в файле конфигурации сервера. Запрос `CREATE DICTIONARY`, который включает его — в источнике или в одной из его записей `<replica>`, — отклоняется с ошибкой `BAD_ARGUMENTS`.
</Note>

<Note>
  Отдельного параметра `secure` не существует. При установлении SSL‑соединения безопасность является обязательной.
</Note>

К MySQL можно подключиться на локальном хосте через сокеты. Для этого задайте `host` и `socket`.

Пример настроек:

<Tabs>
  <Tab title="DDL">
    ```sql theme={null}
    SOURCE(MYSQL(
        host 'localhost'
        socket '/path/to/socket/file.sock'
        user 'clickhouse'
        password 'qwerty'
        db 'db_name'
        table 'table_name'
        where 'id=10'
        invalidate_query 'SQL_QUERY'
        fail_on_connection_loss 'true'
        query 'SELECT id, value_1, value_2 FROM db_name.table_name'
    ))
    ```
  </Tab>

  <Tab title="Файл конфигурации">
    ```xml theme={null}
    <source>
      <mysql>
          <host>localhost</host>
          <socket>/path/to/socket/file.sock</socket>
          <user>clickhouse</user>
          <password>qwerty</password>
          <db>db_name</db>
          <table>table_name</table>
          <where>id=10</where>
          <invalidate_query>SQL_QUERY</invalidate_query>
          <fail_on_connection_loss>true</fail_on_connection_loss>
          <query>SELECT id, value_1, value_2 FROM db_name.table_name</query>
      </mysql>
    </source>
    ```
  </Tab>
</Tabs>
