MySQL туннель
Доступно только по подписке.
Обзор
MySQL туннель открывает доступ к базе данных MySQL или MariaDB и показывает SQL-запросы в инспекторе: сессии в виде пользователь@база, текстовые запросы, prepared statements (Prepare, Execute, Fetch, Close), USE, CREATE DATABASE и DROP DATABASE, KILL, REFRESH. Сессию можно скачать как SQL-файл.
Ответы сервера tuna не разбирает: числа строк в ответе и ошибок сервера, как у Postgres туннеля, в инспекторе нет.
Аутентификация проходит через туннель как есть: работают все методы входа, включая mysql_native_password, caching_sha2_password, ed25519 и parsec (MariaDB 11.6 и новее), а пароль tuna не видит.
MySQL туннели рассчитаны на отладку и работу локально или в тестовых окружениях и не поддерживают TLS. Мы не рекомендуем использовать этот тип туннелей в производственных средах.
Как и у Postgres и Redis, tuna показывает в терминале полноэкранный интерфейс с сессиями и SQL-запросами.
Подключение клиента
TLS туннель не поддерживает, поэтому отключите его в клиенте.
MySQL 8:
mysql -h <адрес> -P <порт> -u root -p --ssl-mode=DISABLED --get-server-public-key
MariaDB:
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. Без него вход завершится ошибкой:
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) туннель отклоняет. Чтобы войти другим пользователем, переподключитесь.
Примеры
Все актуальные флаги, подсказки и примеры можно посмотреть вызвав справку:
tuna mysql --help
Почти для всех флагов есть аналогичные переменные окружения.
Базовый пример
Без аргументов туннель подключается к порту 3306:
tuna mysql
С передачей IP-адреса
tuna mysql 10.0.0.1:3306
С указанием API-ключа
Можно указать другой API-ключ через флаг --api-key или переменную окружения TUNA_API_KEY, у ключа должно быть право tunnels:connect. Переопределение происходит в соответствии с политикой очерёдности конфигурации.
tuna mysql 3306 --api-key=tak_***
Статичный порт
В качестве значения флага --port/-p может выступать алиас или назначенный порт.
Порты можно резервировать в личном кабинете и после перезапуска туннеля адрес останется прежним.
Подробнее о портах читайте в отдельной инструкции.
tuna mysql 3306 --port=mysql
tuna mysql 3306 --port=35000
Ограничение доступа по подсетям IP
Вы можете определить белый список подсетей в CIDR-формате:
tuna mysql 3306 --cidr-allow="10.0.0.1/32"
Либо запретить доступ из определенных подсетей:
tuna mysql 3306 --cidr-deny="10.0.0.1/32"
Можно комбинировать, например указать широкую сеть и вычесть частные IP:
tuna mysql 3306 --cidr-allow="10.0.0.1/24" --cidr-deny="10.0.0.33/32"
Фоновый сервис и несколько туннелей
MySQL туннель можно поставить фоновым сервисом:
tuna service install --name=db -- tuna mysql 3306 --port=mysql
И описать в .tuna.yml для tuna start:
tunnels:
mysql:
commandLine: tuna mysql 3306 --port=mysql
Инспектор запросов
Инспектор включён всегда и доступен по адресу http://127.0.0.1:4040: слева список сессий, справа запросы выбранной сессии с длительностью, результатом и ошибками. Следующий туннель займёт порт 4041, фиксированный порт задаётся флагом --inspect-port или переменной TUNA_INSPECT_PORT. Если инспектор не нужен, используйте TCP туннель.
CLI пишет адрес инспектора в лог и показывает в шапке интерфейса в терминале. Подробнее — на странице инспектора.
