Docker部署Grafana连接非容器化MySQL出现查询失败问题求解
Grafana 连接宿主机非容器部署 MySQL 故障排查方案
重复点击保存测试按钮触发的提示处理
页面弹出数据源已被其他人更新,请刷新后重试提示时,不需要做额外故障排查
- 这个是Grafana前端的乐观锁校验逻辑触发的提示:第一次点击「保存&测试」时,后端已经更新了当前数据源的配置版本号,后续重复提交时前端缓存的版本号和后端不匹配,就会弹出这个提示。
- 直接刷新当前数据源配置页面,重新填写配置后单次操作即可,不要连续快速点击保存测试按钮。
核心连接报错逐阶排查
针对连接时报查询失败,请查看Grafana服务日志获取详情的问题,结合Grafana Docker部署、MySQL宿主机部署的场景,按以下顺序排查:
1. 优先排查Docker网络连通性
- 这是该部署场景下最高发的故障点:Grafana运行在Docker容器内部,默认无法通过
127.0.0.1直接访问宿主机上的服务,哪怕MySQL已经将监听地址修改为0.0.0.0也无法连通。 - 正确的MySQL连接主机填写规则:
- Windows/macOS 环境使用Docker Desktop运行的场景:主机地址填
host.docker.internal,端口填MySQL实际监听的3306 - Linux 环境运行Docker的场景:要么给Grafana容器配置
--network host直接使用宿主机网络栈,要么填写宿主机在Docker网桥中的实际内网IP,不要填写容器内的回环地址。
- Windows/macOS 环境使用Docker Desktop运行的场景:主机地址填
- 连通性验证操作:
先进入Grafana运行容器,执行端口连通性测试:
若返回连接超时,代表网络层面未打通,无需继续排查应用层配置。# 替换为实际的Grafana容器ID docker exec -it <grafana-container-id> sh # 测试MySQL端口连通状态 nc -zv <mysql-actual-ip> 3306
2. 校验MySQL侧的访问授权范围
- 不要只确认创建的连接用户拥有全量权限,还要确认用户的授权来源IP范围覆盖Grafana容器的访问来源,不能仅允许
localhost来源连接。 - 校验操作:在MySQL宿主机上执行查询,确认用户的Host字段配置:
若Host字段仅配置了SELECT user, host FROM mysql.user WHERE user = 'grafana连接使用的用户名';localhost,即使MySQL监听地址为0.0.0.0,外部来源的连接也会被拒绝。临时测试可将Host调整为%放开所有来源,连通正常后再收紧到Grafana对应的固定IP段。
3. 抓取容器日志定位根因
- 查询失败的通用提示不包含具体错误原因,直接拉取Grafana容器的实时日志,在触发一次连接测试后定位具体错误:
常见日志报错对应场景:docker logs -f <grafana-container-id>- 日志返回
Access denied for user:对应上述的MySQL授权来源IP不匹配问题 - 日志返回
dial tcp xxx:3306: connect: connection refused:代表填写的MySQL地址错误,或MySQL未在对应IP上真实监听,可在MySQL宿主机执行ss -lntup | grep 3306确认监听状态 - 日志返回
Error 1044: Access denied to database:代表创建的连接用户对目标数据库的实际权限不足,重新给用户授予对应库的操作权限即可。
- 日志返回
内容的提问来源于stack exchange,提问作者Tomáš Mejzr
相关产品推荐
相关产品推荐

