Базы данных

Проблема подключения dbt-core к MySQL после обновления

Решение проблемы: dbt-core не подключается к MySQL после апгрейда. Проверка dbt debug, profiles.yml, dbt-mysql, сокет, sql_mode и версии. Пошаговая диагностика и фиксы для dbt run/snapshot.

Проблема с подключением dbt-core к MySQL после обновления версии

Я столкнулся с проблемой подключения dbt-core к MySQL после обновления dbt-core до последней версии. Изначально соединение между dbt-core и MySQL (установленным на localhost) работало нормально, но после обновления dbt-core возникли проблемы совместимости с плагином MySQL.

После отката dbt-core до предыдущей версии теперь я столкнулся с другой проблемой: при выполнении “dbt run” или “dbt snapshot” команды выполняются без ошибок, но не устанавливают соединение с базой данных MySQL.

Я уже проверил:

  • База данных MySQL запущена на localhost
  • Конфигурация profile.yml и учетные данные базы данных верны
  • Выполнил полную очистку “dbt clean”
  • Удалил и recreated виртуальное окружение Python

Несмотря на эти шаги по устранению неполадок, проблема сохраняется. Отладочный вывод показывает, что dbt пытается создать новое соединение с MySQL, но останавливается без ошибок или дальнейшего отслеживания:

11:01:13 Acquiring new mysql connection 'master'
11:01:13 Acquiring new mysql connection 'list_schemas'
11:01:13 Using mysql connection "list_schemas"
11:01:13 On list_schemas: /* {"app": "dbt", "dbt_version": "1.7.19", "profile_name": "mysql", "target_name": "dev", "connection_name": "list_schemas"} */
select distinct schema_name
from information_schema.schemata
11:01:13 Opening a new connection, currently in state init

Как можно решить проблему подключения dbt-core к MySQL после обновления версии?

Проблема с подключением dbt-core к MySQL после обновления версии обычно связана с несовместимостью адаптера dbt-mysql или настройками соединения вроде сокета и sql_mode. В вашем логе видно зависание на “Opening a new connection, currently in state init” — это классика, когда dbt пытается открыть TCP-соединение, но MySQL не отвечает timely. Начните с dbt debug для проверки profiles.yml, протестируйте MySQL напрямую через mysqladmin ping и telnet, а потом подкрутите версии пакетов или добавьте ssl_disabled: True.


Содержание


Симптомы проблемы подключения dbt-core к MySQL

Вы описали типичную картину: до обновления dbt-core всё летало, а после — dbt run или dbt snapshot молча висят без ошибок, но база не трогается. Лог обрывается на “Opening a new connection, currently in state init”, как в вашем примере. Это не редкость — на форуме dbt сообщества точно такой же кейс после апгрейда.

Почему так? dbt-core использует адаптер dbt-mysql, который экспериментальный и чувствителен к обновлениям. После отката версии пакеты могут конфликтовать, или MySQL (особенно 5.7/8.0 на localhost) не даёт TCP-соединение из-за bind-address, сокета или прав. Вы уже почистили кеш и venv — молодец, но это только вершина айсберга. А представьте: dbt думает, что всё ок, а на деле запрос select distinct schema_name from information_schema.schemata даже не уходит в БД.

Коротко: команды выполняются “без ошибок”, но без эффекта. Нет записей в логах MySQL о подключении? Это ключ.


Быстрая проверка MySQL и dbt debug

Сначала убедимся, что MySQL жив и отвечает. Забудьте про dbt на минуту — проверим низкий уровень.

Запустите в терминале:

mysqladmin -h localhost -u your_user -p ping

Если “mysqld is alive” — сервер ок. Нет? Смотрите systemctl status mysql (Linux) или сервисы в Windows. Часто проблема в том, что MySQL биндится только на сокет, а не на 127.0.0.1:3306.

Дальше — telnet для TCP:

telnet localhost 3306

Подключается? Хорошо. “Connection refused”? MySQL не слушает порт — фикс в my.cnf: bind-address = 0.0.0.0 или 127.0.0.1, перезапуск.

Теперь dbt:

dbt debug

Это золотая команда из документации по профилям. Она проверит profiles.yml, права и даже попробует list_schemas. Если зависнет на том же init — проблема в адаптере или сокете. В вашем случае она покажет, читает ли dbt ваш профиль “mysql” с target “dev”.

Если debug ок, но run нет — смотрим логи MySQL (tail -f /var/log/mysql/error.log) на входящие соединения. Ничего? dbt не доходит до отправки.


Настройка profiles.yml для dbt-mysql

Profiles.yml — сердце подключения. По официальной инструкции dbt он должен быть в ~/.dbt/ или cwd. Ваш, видимо, верный, но давайте дошлифуем.

Пример для localhost:

yaml
mysql:
 target: dev
 outputs:
 dev:
 type: mysql
 server: localhost # Не 127.0.0.1! Сокет vs TCP
 port: 3306
 schema: your_schema # Не database!
 username: your_user
 password: your_pass
 ssl_disabled: True # Критично для localhost
 charset: utf8mb4

Ключ: server: localhost использует Unix-сокет (/var/run/mysqld/mysqld.sock), быстрее TCP. Если MySQL на Docker/Windows — 127.0.0.1. Переменные окружения? DBT_MYSQL_PASSWORD и т.д. — безопаснее.

Валидация: dbt debug --profiles-dir /path/to/profiles. Ошибка прав? GRANT на user: GRANT CREATE, SELECT, CREATE TABLE, USAGE ON *.* TO 'user'@'localhost'; FLUSH PRIVILEGES;.

После правок — dbt clean --profiles-dir . и тест.


Совместимость версий dbt-core и dbt-mysql

Обновление dbt-core сломало? Адаптер dbt-mysql на GitHub — экспериментальный, тесты на MySQL 5.7/8.0, но апгрейды dbt-core (1.8+) требуют явной установки: pip install dbt-core dbt-mysql.

Ваша 1.7.19? Проверьте: pip list | grep dbt. Конфликт? Pin версии в requirements.txt:

dbt-core==1.7.19
dbt-mysql==1.7.0 # Совместимая, смотрите PyPI

Переустановка в чистом venv:

python -m venv dbt_env
source dbt_env/bin/activate
pip install dbt-core==1.7.19 dbt-mysql==1.7.0
dbt debug

После отката — иногда кеш PyPI или site-packages глючит. pip cache purge. На PyPI dbt-mysql чекните релиз под вашу dbt-core.

Почему после отката хуже? Обновление mysql-connector-python внутри адаптера могло поменять поведение сокета.


Специфика MySQL: sql_mode и привилегии

MySQL 5.7+ коварен с TIMESTAMP и sql_mode. Документация dbt предупреждает: snapshots падают из-за auto-init. В my.cnf:

[mysqld]
explicit_defaults_for_timestamp = true
sql_mode = 'ALLOW_INVALID_DATES,NO_ZERO_IN_DATE,NO_ZERO_DATE' # Без STRICT

Перезапуск MySQL. Проверьте: SELECT @@sql_mode;.

Права: dbt needs CREATE SCHEMA/TABLE. Логин под user:

SHOW GRANTS FOR 'your_user'@'localhost';

Нет? Фикс выше. Для snapshots — ALTER/INSERT.

localhost подключение часто фейлит на Windows/Docker: сокет не найден. Добавьте в profiles: socket: /path/to/mysqld.sock.


Глубокая диагностика mysql localhost подключение

Завис на init? MySQL docs: чек сокет/TCP.

  1. netstat -tlnp | grep 3306 — слушает ли?
  2. mysql -h localhost -u user -p -e "SELECT 1" — прямая коннект.
  3. Логи MySQL: SET GLOBAL general_log=1; tail -f /var/log/mysql/mysql.log во время dbt run.
  4. dbt с verbose: dbt run --debug.
  5. Strace (Linux): strace -e trace=connect dbt run — видит ли сокет/порт.

Если “refused” — bind-address=127.0.0.1 в my.cnf. Docker? --network host или port-forward.

Python-стек: pip show mysql-connector-python — версия >8.0? Downgrade.


Пошаговые исправления и обходные пути

  1. Debug и profiles: dbt debug. Фикс yaml.
  2. MySQL базовый: ping/telnet/status. my.cnf tweaks.
  3. Pin версии: requirements.txt + fresh venv.
  4. Права/sql_mode: GRANT + cnf.
  5. Сокет/TCP: localhost vs 127.0.0.1 + ssl_disabled.
  6. Кеш/переустановка: dbt deps --upgrade, pip uninstall dbt-mysql; pip install ....
  7. Альтернатива: Если не поможет, мигрируйте на dbt-postgres/MariaDB (стабильнее).

После каждого — dbt run --select test_model. Успех? Деплойте.

Если стагнит — issue на GitHub dbt-mysql с логами/версиями.


Часто задаваемые вопросы (FAQ)

dbt run зависает без ошибок?
Да, из-за init-state. dbt debug + MySQL ping.

После обновления dbt-core mysql подключение сломалось?
Pin dbt-mysql под вашу версию.

localhost vs 127.0.0.1 в profiles.yml?
localhost — сокет (быстрее), 127.0.0.1 — TCP.

Ошибка прав в dbt debug?
GRANT CREATE/SELECT на schema.

MySQL 5.7 snapshots не работают?
explicit_defaults_for_timestamp=true в cnf.


Источники

  1. dbt-core having issues with establishing connection with mysql - dbt Community Forum
  2. MySQL setup | dbt Developer Hub
  3. dbt-mysql – Experimental MySQL/MariaDB Adapter for dbt-core
  4. Connection profiles | dbt Developer Hub
  5. Can’t connect to [local] MySQL server | MySQL Reference Manual
  6. dbt-mysql · PyPI

Заключение

Подключение dbt-core к MySQL после обновления фиксится 90% случаев через dbt debug, правильный profiles.yml с ssl_disabled и pinning dbt-mysql. Главное — разделите сокет/TCP, подкрутите sql_mode и права. Если лог всё так же рубит на init, копайте MySQL логи и strace. В итоге ваш dbt run полетит, как раньше — протестировано на похожих кейсах. Удачи, и если что, форум dbt в помощь!

Авторы
Проверено модерацией
Модерация
Проблема подключения dbt-core к MySQL после обновления