Проблема подключения 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
- Быстрая проверка MySQL и dbt debug
- Настройка profiles.yml для dbt-mysql
- Совместимость версий dbt-core и dbt-mysql
- Специфика MySQL: sql_mode и привилегии
- Глубокая диагностика mysql localhost подключение
- Пошаговые исправления и обходные пути
- Часто задаваемые вопросы (FAQ)
- Источники
- Заключение
Симптомы проблемы подключения 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:
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.
netstat -tlnp | grep 3306— слушает ли?mysql -h localhost -u user -p -e "SELECT 1"— прямая коннект.- Логи MySQL:
SET GLOBAL general_log=1; tail -f /var/log/mysql/mysql.logво времяdbt run. - dbt с verbose:
dbt run --debug. - 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.
Пошаговые исправления и обходные пути
- Debug и profiles:
dbt debug. Фикс yaml. - MySQL базовый: ping/telnet/status. my.cnf tweaks.
- Pin версии: requirements.txt + fresh venv.
- Права/sql_mode: GRANT + cnf.
- Сокет/TCP: localhost vs 127.0.0.1 + ssl_disabled.
- Кеш/переустановка:
dbt deps --upgrade,pip uninstall dbt-mysql; pip install .... - Альтернатива: Если не поможет, мигрируйте на 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.
Источники
- dbt-core having issues with establishing connection with mysql - dbt Community Forum
- MySQL setup | dbt Developer Hub
- dbt-mysql – Experimental MySQL/MariaDB Adapter for dbt-core
- Connection profiles | dbt Developer Hub
- Can’t connect to [local] MySQL server | MySQL Reference Manual
- 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 в помощь!