> Markdown-версия страницы https://tuna.am/docs/tunnels/mysql/. Оглавление документации — [llms.txt](https://tuna.am/llms.txt), весь текст одним файлом — [llms-full.txt](https://tuna.am/llms-full.txt). Markdown-версия есть у любой страницы: добавьте `.md` к адресу без слеша на конце.

# MySQL туннель

> **К сведению.** Доступно только по [подписке](https://tuna.am/#pricing).

## Обзор

MySQL туннель открывает доступ к базе данных MySQL или MariaDB и показывает SQL-запросы в [инспекторе](https://tuna.am/docs/tunnels/inspect.md#mysql): сессии в виде `пользователь@база`, текстовые запросы, prepared statements (Prepare, Execute, Fetch, Close), `USE`, `CREATE DATABASE` и `DROP DATABASE`, `KILL`, `REFRESH`. Сессию можно скачать как SQL-файл.

Ответы сервера tuna не разбирает: числа строк в ответе и ошибок сервера, как у [Postgres туннеля](https://tuna.am/docs/tunnels/postgres.md), в инспекторе нет.

Аутентификация проходит через туннель как есть: работают все методы входа, включая `mysql_native_password`, `caching_sha2_password`, `ed25519` и `parsec` (MariaDB 11.6 и новее), а пароль tuna не видит.

> **Примечание.** MySQL туннели рассчитаны на отладку и работу локально или в тестовых окружениях и не поддерживают TLS. Мы не рекомендуем использовать этот тип туннелей в производственных средах.

Как и у Postgres и Redis, tuna показывает в терминале [полноэкранный интерфейс](https://tuna.am/docs/tunnels/tui.md) с сессиями и SQL-запросами.

## Подключение клиента

TLS туннель не поддерживает, поэтому отключите его в клиенте.

MySQL 8:

```shell
mysql -h <адрес> -P <порт> -u root -p --ssl-mode=DISABLED --get-server-public-key

```

MariaDB:

```shell
mariadb -h <адрес> -P <порт> -u root -p --skip-ssl

```

Без этих флагов клиент, который требует TLS, не подключится:

* MySQL с `--ssl-mode=REQUIRED` — `SSL is required but the server doesn't support it`;
* MariaDB 11.4 и новее требует TLS по умолчанию — `ERROR 2026 (HY000): SSL is required, but the server does not support it`.

Через туннель работают `mariadb-admin`, `mariadb-dump`, `LOAD DATA LOCAL INFILE` и пакетные запросы. Сжатие `--compress` клиент включить может, но через туннель запросы идут без него.

### MySQL 8 и caching_sha2_password

В MySQL 8 пользователи по умолчанию входят через плагин `caching_sha2_password`. Без TLS первый вход такого пользователя требует RSA-ключ сервера, поэтому клиенту нужен флаг `--get-server-public-key`. Без него вход завершится ошибкой:

```text
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

```

В драйверах то же самое включается параметром подключения, например `allowPublicKeyRetrieval=true` в Go-драйвере и JDBC.

После первого успешного входа сервер запоминает хеш пароля до перезапуска, и дальше вход проходит без ключа. Пользователям с `mysql_native_password` и серверу MariaDB флаг не нужен.

### Смена пользователя

Смену пользователя внутри соединения (`COM_CHANGE_USER`) туннель отклоняет. Чтобы войти другим пользователем, переподключитесь.

## Примеры

> **Примечание.** Все актуальные флаги, подсказки и примеры можно посмотреть вызвав справку:
>
> ```shell
> tuna mysql --help
>
> ```
>
> Почти для всех флагов есть аналогичные [переменные окружения](https://tuna.am/docs/guides/environment-variables.md).

### Базовый пример

Без аргументов туннель подключается к порту 3306:

```shell
tuna mysql

```

### С передачей IP-адреса

```shell
tuna mysql 10.0.0.1:3306

```

### С указанием API-ключа

Можно указать другой API-ключ через флаг `--api-key` или переменную окружения `TUNA_API_KEY`, у ключа должно быть право `tunnels:connect`. Переопределение происходит в соответствии с политикой [очерёдности конфигурации](https://tuna.am/docs/guides/config-ordering.md).

```shell
tuna mysql 3306 --api-key=tak_***

```

### Статичный порт

В качестве значения флага `--port`/`-p` может выступать алиас или назначенный порт. Порты можно резервировать в [личном кабинете](https://my.tuna.am/tcp_ports?lang=ru) и после перезапуска туннеля адрес останется прежним. Подробнее о портах читайте в отдельной [инструкции](https://tuna.am/docs/tunnels/ports.md).

```shell
tuna mysql 3306 --port=mysql
tuna mysql 3306 --port=35000

```

### Ограничение доступа по подсетям IP

Вы можете определить белый список [подсетей](https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B4%D1%81%D0%B5%D1%82%D1%8C) в CIDR-формате:

```shell
tuna mysql 3306 --cidr-allow="10.0.0.1/32"

```

Либо запретить доступ из определенных подсетей:

```shell
tuna mysql 3306 --cidr-deny="10.0.0.1/32"

```

Можно комбинировать, например указать широкую сеть и вычесть частные IP:

```shell
tuna mysql 3306 --cidr-allow="10.0.0.1/24" --cidr-deny="10.0.0.33/32"

```

### Фоновый сервис и несколько туннелей

MySQL туннель можно поставить [фоновым сервисом](https://tuna.am/docs/tunnels/guides/service.md):

```shell
tuna service install --name=db -- tuna mysql 3306 --port=mysql

```

И описать в `.tuna.yml` для [`tuna start`](https://tuna.am/docs/tunnels/guides/multi-tunnels.md):

```yaml
tunnels:
  mysql:
    commandLine: tuna mysql 3306 --port=mysql

```

## Инспектор запросов

Инспектор включён всегда и доступен по адресу `http://127.0.0.1:4040`: слева список сессий, справа запросы выбранной сессии с длительностью, результатом и ошибками. Следующий туннель займёт порт 4041, фиксированный порт задаётся флагом `--inspect-port` или переменной `TUNA_INSPECT_PORT`. Если инспектор не нужен, используйте [TCP туннель](https://tuna.am/docs/tunnels/tcp.md).

CLI пишет адрес инспектора в лог и показывает в шапке [интерфейса в терминале](https://tuna.am/docs/tunnels/tui.md). Подробнее — на странице [инспектора](https://tuna.am/docs/tunnels/inspect.md#databases).

![Сессия MySQL: PREPARE и EXECUTE с текстом запроса](/docs/img/inspect/my-execute.webp)
