Устранение неполадок источника данных MySQL
В этом документе приведены решения распространённых проблем, с которыми вы можете столкнуться при настройке или использовании источника данных MySQL в Grafana.
Ошибки подключения
Эти ошибки возникают, когда Grafana не может установить или поддерживать соединение с сервером MySQL.
Не удаётся подключиться к серверу
Сообщение об ошибке: “dial tcp: connection refused” или “Could not connect to MySQL”
Причина: Grafana не может установить сетевое соединение с сервером MySQL.
Решение:
- Убедитесь, что сервер MySQL запущен и доступен.
- Проверьте, что хост и порт указаны верно в конфигурации источника данных. Порт MySQL по умолчанию —
3306. - Убедитесь, что нет правил межсетевого экрана, блокирующих соединение между Grafana и MySQL.
- Проверьте, что MySQL настроен на разрешение удалённых подключений, посмотрев параметр
bind-addressв вашей конфигурации MySQL. - Для Grafana Cloud убедитесь, что вы настроили Private data source connect, если ваш экземпляр MySQL не доступен публично.
Тайм-аут соединения
Сообщение об ошибке: “Connection timed out” или “I/O timeout”
Причина: Соединение с MySQL истекло по тайм-ауту до получения ответа.
Решение:
- Проверьте сетевую задержку между Grafana и MySQL.
- Убедитесь, что MySQL не перегружен и не испытывает проблем с производительностью.
- Проверьте, не разрывают ли соединение по тайм-ауту какие-либо сетевые устройства (балансировщики нагрузки, прокси).
- Увеличьте параметр
wait_timeoutв MySQL, если соединения обрываются по тайм-ауту в периоды простоя.
Сбои соединения TLS/SSL
Ошибки TLS возникают, когда сервер MySQL требует или ожидает зашифрованные соединения, а источник данных Grafana настроен на несоответствующий режим. Типичные сообщения об ошибках:
- “TLS handshake failed” или “x509: certificate verify failed”
- “Connection refused” или соединение сбрасывается немедленно
- “Error 3159: Connections using insecure transport are prohibited while –require_secure_transport=ON”
Возможные причины и решения:
Note
Skip TLS Verification и With CA Cert оба устанавливают зашифрованные соединения. Use TLS Client Auth не нужен, если ваша конфигурация не требует взаимного TLS. Для большинства подключений к AWS RDS и RDS Proxy достаточно With CA Cert с корневым CA Amazon.
Для провижиненных источников данных включите TLS в jsonData:
jsonData:
tlsAuthWithCACert: true
secureJsonData:
tlsCACert: ${CA_CERT}
Чтобы вместо этого пропустить проверку сертификата, используйте:
jsonData:
tlsSkipVerify: true
Все доступные параметры провижининга TLS см. в разделе TLS provisioning examples.
Соединение сброшено удалённой стороной
Сообщение об ошибке: “Connection reset by peer” или “EOF”
Причина: Сервер MySQL неожиданно закрыл соединение.
Решение:
- Проверьте параметр
max_connectionsна сервере MySQL, чтобы убедиться, что он не превышается. - Убедитесь, что параметры
wait_timeoutиinteractive_timeoutв MySQL не заданы слишком низко. - Увеличьте параметр Max lifetime в конфигурации источника данных Grafana, чтобы он был ниже, чем
wait_timeoutв MySQL. - Проверьте журналы сервера MySQL на наличие ошибок или сообщений, связанных с соединениями.
Ошибки аутентификации
Эти ошибки возникают при проблемах с учётными данными аутентификации или разрешениями.
Доступ запрещён для пользователя
Сообщение об ошибке: “Access denied for user ‘username’@‘host’” или “Authentication failed”
Причина: Учётные данные аутентификации недействительны, или у пользователя нет разрешения на подключение с хоста сервера Grafana.
Решение:
-
Убедитесь, что имя пользователя и пароль верны.
-
Проверьте, что пользователь существует в MySQL и включён.
-
Убедитесь, что у пользователя есть разрешение подключаться с IP-адреса сервера Grafana. MySQL ограничивает доступ в зависимости от подключающегося хоста:
SELECT user, host FROM mysql.user WHERE user = 'your_user'; -
При необходимости создайте пользователя, который может подключаться с сервера Grafana:
CREATE USER 'grafana'@'grafana_server_ip' IDENTIFIED BY 'password'; -
Если используется плагин аутентификации
mysql_native_password, убедитесь, что он включён на сервере.
Нет доступа к базе данных
Сообщение об ошибке: “Access denied for user ‘username’@‘host’ to database ‘dbname’”
Причина: У аутентифицированного пользователя нет разрешения на доступ к указанной базе данных.
Решение:
-
Убедитесь, что имя базы данных указано верно в конфигурации источника данных.
-
Убедитесь, что у пользователя есть необходимые разрешения на базе данных:
GRANT SELECT ON your_database.* TO 'grafana'@'grafana_server_ip'; FLUSH PRIVILEGES; -
Для продуктивных сред предоставляйте разрешения только на конкретные таблицы:
GRANT SELECT ON your_database.your_table TO 'grafana'@'grafana_server_ip';
Проблемы с аутентификацией PAM
Сообщение об ошибке: “Authentication plugin ‘auth_pam’ cannot be loaded” или ошибки пароля в открытом виде
Причина: Аутентификация PAM (Pluggable Authentication Modules) требует передачи пароля в открытом виде.
Решение:
- Включите Allow Cleartext Passwords в конфигурации источника данных, если используется аутентификация PAM.
- Убедитесь, что TLS включён для защиты передачи пароля при использовании паролей в открытом виде.
- Проверьте, что плагин PAM корректно установлен и настроен на сервере MySQL.
Ошибки запросов
Эти ошибки возникают при проблемах с синтаксисом или конфигурацией запросов.
Столбец времени не найден или некорректен
Сообщение об ошибке: “Could not find time column” или визуализация временных рядов не отображает данные
Причина: Запрос не возвращает корректно отформатированный столбец time для визуализации временных рядов.
Решение:
- Убедитесь, что ваш запрос включает столбец с именем
timeпри использовании формата Time series. - Используйте макрос
$__time()для преобразования столбца даты:$__time(your_date_column). - Проверьте, что столбец времени имеет допустимый тип даты/времени MySQL (
DATETIME,TIMESTAMP,DATE) или содержит значения Unix epoch. - Убедитесь, что результирующий набор отсортирован по столбцу времени с помощью
ORDER BY.
Ошибки раскрытия макросов
Сообщение об ошибке: “Error parsing query” или макросы отображаются в запросе нераскрытыми
Причина: Макросы Grafana используются неправильно.
Решение:
- Проверьте синтаксис макроса: используйте
$__timeFilter(column), а не$_timeFilter(column). - Проверьте, что имя столбца, передаваемое в макросы, существует в вашей таблице.
- Просмотрите раскрытый запрос, нажав Generated SQL после выполнения запроса, чтобы отладить раскрытие макросов.
- Убедитесь, что для зарезервированных слов или специальных символов в именах столбцов используются обратные кавычки:
$__timeFilter(\time-column`)`.
Символ # в строках в кавычках вызывает ошибки запросов
Сообщение об ошибке: Запрос возвращает неожиданные результаты или ошибки, когда строковые значения содержат #
Причина: В версиях до Grafana 13.0 логика удаления комментариев SQL ошибочно воспринимала # внутри строк в кавычках (например, WHERE color = '#FF0000') как разделитель комментария, что удаляло остаток строки.
Решение:
- Обновитесь до Grafana 13.0 или более поздней версии, где
#внутри строк в кавычках сохраняется. - Как обходной путь в старых версиях используйте функцию
CONCATили шестнадцатеричный литерал, чтобы избежать символа#в строковых литералах.
Проблемы с часовым поясом и смещением времени
Причина: Данные временных рядов выглядят смещёнными или не совпадают с ожидаемым временем.
Решение:
-
Храните отметки времени в UTC в вашей базе данных, чтобы избежать проблем с часовым поясом.
-
Макросы времени (
$__time,$__timeFilterи т. д.) всегда раскрываются в значения UTC. -
Задайте Session Timezone в конфигурации источника данных в соответствии с часовым поясом ваших данных или используйте
+00:00для UTC. -
Если ваши отметки времени хранятся в местном времени, преобразуйте их в UTC в запросе:
SELECT CONVERT_TZ(your_datetime_column, 'Your/Timezone', 'UTC') AS time, value FROM your_table
Запрос возвращает слишком много строк
Сообщение об ошибке: “Result set too large” или браузер перестаёт отвечать
Причина: Запрос возвращает больше данных, чем можно эффективно обработать.
Решение:
- Добавьте фильтры по времени с помощью
$__timeFilter(column), чтобы ограничить данные временным диапазоном дашборда. - Используйте агрегации (
AVG,SUM,COUNT) сGROUP BYвместо возврата необработанных строк. - Добавьте условие
LIMIT, чтобы ограничить результаты:SELECT ... LIMIT 1000. - Используйте макрос
$__timeGroup(), чтобы агрегировать данные по временным интервалам.
Синтаксическая ошибка в инструкции SQL
Сообщение об ошибке: “You have an error in your SQL syntax” с последующими подробностями об ошибке
Причина: SQL-запрос содержит недопустимый синтаксис.
Решение:
- Проверьте наличие пропущенных или лишних запятых, скобок или кавычек.
- Убедитесь, что зарезервированные слова, используемые как идентификаторы, заключены в обратные кавычки:
`table`,`select`. - Убедитесь, что синтаксис переменных шаблонов верен:
$variableили${variable}. - Протестируйте запрос напрямую в клиенте MySQL, чтобы изолировать проблемы, специфичные для Grafana.
Неизвестный столбец в списке полей
Сообщение об ошибке: “Unknown column ‘column_name’ in ‘field list’”
Причина: Указанный столбец не существует в таблице или его имя написано с ошибкой.
Решение:
- Проверьте, что имя столбца написано правильно.
- Проверьте, что столбец существует в указанной таблице.
- Если имя столбца содержит специальные символы или пробелы, заключите его в обратные кавычки:
`column-name`. - Убедитесь, что выбрана правильная база данных, если вы ссылаетесь на столбцы без полного пути к таблице.
Выражение CASE даёт сбой на нестандартных строковых типах столбцов
Сообщение об ошибке: Запрос с CASE WHEN возвращает ошибку или неожиданные результаты в Grafana, но работает в других клиентах MySQL
Причина: Драйвер MySQL в Grafana не обрабатывает все подтипы строк MySQL (такие как ENUM, SET, TINYTEXT или MEDIUMTEXT) в выражениях CASE. Драйвер может неправильно вывести тип результата.
Решение:
-
Используйте
CAST()для нормализации столбца кCHARперед использованием в выраженииCASE:SELECT CASE WHEN CAST(status_column AS CHAR) = 'active' THEN 1 ELSE 0 END AS is_active FROM my_table -
Это известное ограничение драйвера Go MySQL, используемого Grafana. Явное приведение к
CHARобеспечивает согласованную обработку типов.
Проблемы с производительностью
Эти проблемы связаны с медленными запросами или высоким потреблением ресурсов.
Медленное выполнение запросов
Причина: Запросы выполняются долго.
Решение:
-
Сократите временной диапазон дашборда, чтобы ограничить объём данных.
-
Добавьте индексы к столбцам, используемым в условиях
WHEREи фильтрах по времени:CREATE INDEX idx_time ON your_table(time_column); -
Используйте агрегации вместо возврата отдельных строк.
-
Увеличьте параметр Min time interval, чтобы уменьшить количество точек данных.
-
Изучите план выполнения запроса с помощью
EXPLAIN, чтобы выявить узкие места:EXPLAIN SELECT * FROM your_table WHERE time_column > NOW() - INTERVAL 1 HOUR;
Исчерпание пула соединений
Сообщение об ошибке: “Too many connections” или “Connection pool exhausted”
Причина: Слишком много одновременных соединений с базой данных.
Решение:
-
Увеличьте лимит соединений Max open в конфигурации источника данных.
-
Включите Auto (max idle) для автоматического управления неактивными соединениями.
-
Уменьшите количество панелей, одновременно запрашивающих один и тот же источник данных.
-
Проверьте наличие длительно выполняющихся запросов, которые могут удерживать соединения.
-
Увеличьте параметр
max_connectionsв MySQL при необходимости:SHOW VARIABLES LIKE 'max_connections'; SET GLOBAL max_connections = 200;
Тайм-аут запроса
Сообщение об ошибке: “Query execution was interrupted” или “Lock wait timeout exceeded”
Причина: Запрос выполняется слишком долго и превышает настроенный тайм-аут.
Решение:
- Оптимизируйте запрос, добавив подходящие индексы.
- Сократите объём запрашиваемых данных, сузив временной диапазон.
- Используйте агрегации, чтобы уменьшить размер результирующего набора.
- Проверьте наличие блокировок таблиц, которые могут задерживать запрос.
Другие распространённые проблемы
Приведённые ниже проблемы не выдают конкретных сообщений об ошибках, но встречаются часто.
Сбои запросов переменных шаблонов
Причина: Запросы переменных возвращают неожиданные результаты или ошибки.
Решение:
- Убедитесь, что синтаксис запроса переменной — это допустимый SQL, возвращающий один столбец.
- Проверьте, что соединение с источником данных работает.
- Убедитесь, что у пользователя есть разрешение на доступ к таблицам, указанным в запросе переменной.
- Протестируйте запрос в редакторе запросов, прежде чем использовать его как запрос переменной.
Данные выглядят некорректно или смещённо
Причина: Проблемы с форматированием данных или преобразованием типов.
Решение:
- Используйте явные псевдонимы столбцов, чтобы обеспечить согласованность имён:
SELECT value AS metric. - Проверьте, что числовые столбцы действительно имеют числовые типы, а не строковые.
- Проверьте наличие значений
NULL, которые могут повлиять на агрегации. - Используйте параметр
FILLв макросе$__timeGroup()для обработки пропущенных точек данных.
Специальные символы в именах баз данных или таблиц
Причина: Запросы дают сбой, когда таблицы или базы данных содержат зарезервированные слова или специальные символы.
Решение:
- Заключайте идентификаторы со специальными символами в обратные кавычки:
`my-database`.`my-table`. - Редактор запросов обрабатывает это автоматически для выборок, но ручные запросы требуют обратных кавычек.
- По возможности избегайте использования зарезервированных слов в качестве идентификаторов.
Кэширование запросов нельзя включить для провижиненного источника данных
Причина: Когда источник данных MySQL провижинится через YAML, переключатель кэширования запросов в интерфейсе неактивен. Провижининг через YAML в настоящее время не поддерживает настройку кэширования.
Решение:
-
Используйте HTTP API Grafana, чтобы включить кэширование запросов для провижиненного источника данных. Отправьте запрос
PUT, чтобы обновить источник данных с включённым кэшированием:curl -X PUT -H "Content-Type: application/json" \ -H "Authorization: Bearer <API_TOKEN>" \ "https://<GRAFANA_URL>/api/datasources/<DATASOURCE_ID>" \ -d '{ "jsonData": { "queryCachingTTL": 300 } }'Замените
<API_TOKEN>на действительный API-токен Grafana,<GRAFANA_URL>на URL вашего экземпляра Grafana, а<DATASOURCE_ID>на числовой идентификатор источника данных. УстановитеqueryCachingTTLв желаемую длительность кэша в секундах. -
Получите идентификатор источника данных, вызвав
GET /api/datasources/name/<DATA_SOURCE_NAME>. -
Настройка кэширования через YAML — это открытый запрос на функцию. Проверяйте текущий статус в Grafana GitHub issues.
Note
Кэширование запросов доступно в Grafana Enterprise и Grafana Cloud. Подробнее см. в разделе Query and resource caching.
Произошла неожиданная ошибка
Сообщение об ошибке: “An unexpected error happened”
Причина: Произошла общая ошибка, для которой нет конкретного сообщения.
Решение:
- Проверьте журналы сервера Grafana, чтобы получить больше сведений об ошибке.
- Убедитесь, что все параметры конфигурации источника данных верны.
- Проверьте соединение с помощью кнопки Save & test.
- Убедитесь, что сервер MySQL доступен и отвечает на запросы.
- Клиентам Grafana Cloud: обратитесь в службу поддержки за помощью.
Получение дополнительной помощи
Если проблемы сохраняются после выполнения рекомендаций этого руководства:
- Проверьте форумы сообщества Grafana на наличие похожих проблем.
- Изучите Grafana GitHub issues на наличие известных ошибок.
- Включите отладочное логирование в Grafana, чтобы получить подробную информацию об ошибках.
- Проверьте журналы ошибок MySQL для получения дополнительных сведений.
- Обратитесь в службу поддержки Grafana, если вы клиент Enterprise или Cloud.
При сообщении о проблемах указывайте:
- Версию Grafana
- Версию плагина источника данных MySQL, которую можно найти на странице Administration > Plugins. Плагин обновляется независимо от релизов Grafana.
- Версию MySQL
- Сообщения об ошибках (удалите конфиденциальную информацию)
- Шаги воспроизведения
- Соответствующие примеры запросов (удалите конфиденциальные данные)