MySQL
本页介绍如何将 MySQL 连接为数据仓库。有关将 MySQL 用作 Metabase 的应用程序数据库,请参阅配置 Metabase 应用程序数据库。
要添加数据库连接,请点击右上角的齿轮图标,然后导航至管理设置 > 数据库 > 添加数据库。
支持的版本
Metabase 支持最早支持的版本到最新的稳定版本。请参阅MySQL 生命周期终止日期。
设置
您可以随时编辑这些设置。请记住保存您的更改。
显示名称
数据库在 Metabase 界面中显示的名称。
主机
数据库的 IP 地址或域名(例如,esc.mydatabase.com)。
端口
数据库端口。例如,3306。
用户名
您想用于连接数据库的帐户的数据库用户名。您可以使用不同的用户帐户设置到同一数据库的多个连接,每个连接具有不同的权限集。
密码
您用于连接数据库的用户名的密码。
使用安全连接 (SSL)
您可以粘贴服务器的 SSL 证书链。
使用 SSH 隧道
请参阅我们的SSH 隧道指南。
展开 JSON 列
对于 MySQL 数据库,Metabase 可以将 JSON 列展开为组件字段,以生成一个表,其中每个 JSON 键都成为一列。默认情况下,JSON 展开处于启用状态,但如果性能缓慢,您可以关闭 JSON 展开。
如果启用 JSON 展开,您还可以在表元数据中切换单个列的展开。
其他 JDBC 连接字符串选项
您可以将选项附加到 Metabase 用于连接数据库的连接字符串。
重新运行简单探索的查询
如果用户希望在应用任何汇总或筛选器选择之前点击运行(播放按钮),请关闭此选项。
默认情况下,当您从汇总菜单中选择分组选项或从下钻菜单中选择筛选条件时,Metabase 将立即执行查询。如果您的数据库速度较慢,您可能需要禁用重新运行以避免每次点击都加载数据。
选择 Metabase 同步和扫描的时间
开启此选项以管理 Metabase 用于与数据库保持同步的查询。有关更多信息,请参阅同步和扫描数据库。
数据库同步
如果您已选择选择同步和扫描发生的时间 > 开启,您将能够设置
- 同步的频率:每小时(默认)或每天。
- 运行同步的时间,以 Metabase 应用运行的服务器的时区为准。
扫描筛选器值
Metabase 可以扫描此数据库中每个字段中存在的值,以在仪表盘和问题中启用复选框筛选器。这可能是一个相当消耗资源的过程,尤其是在您拥有非常大的数据库的情况下。
如果您已选择选择同步和扫描发生的时间 > 开启,您将在扫描筛选器值下看到以下选项
- 定期,按计划允许您以与数据库更改速率匹配的频率运行扫描查询。时间以 Metabase 应用运行的服务器的时区为准。对于小型数据库或经常更新的具有不同值的表,这是最佳选择。
- 如果您希望按需运行扫描查询,仅在添加新的筛选器小部件时是一个很好的选择。开启此选项意味着 Metabase 将仅扫描和缓存在向仪表盘或 SQL 问题添加新筛选器时使用的字段的值。
- 从不,如果需要我会手动执行此操作 适用于数据库非常大或从不真正添加新值的情况。使用立即重新扫描字段值按钮运行手动扫描并将您的筛选器值更新为最新。
定期重新指纹识别表
定期重新指纹识别会增加数据库的负载。
开启此选项以在 Metabase 每次运行同步时扫描值样本。
指纹识别查询检查每列的前 10,000 行,并使用该数据来估计每列有多少个唯一值,数字和时间戳列的最小值和最大值等等。如果您关闭此选项,Metabase 将仅在设置期间对您的列进行一次指纹识别。
连接到 MySQL 8+ 服务器
Metabase 使用 MariaDB 连接器连接到 MySQL 服务器。MariaDB 连接器不支持 MySQL 8 的默认身份验证插件。为了连接,您需要更改 Metabase 用户使用的插件
mysql_native_password`: `ALTER USER 'metabase'@'%' IDENTIFIED WITH mysql_native_password BY 'thepassword';
无法使用正确的凭据登录
如何检测到此问题: Metabase 无法连接到您的 MySQL 服务器,并显示错误消息“用户名或密码不正确”,但您确定用户名和密码是正确的。您可能创建了 MySQL 用户,但允许的主机不是您连接的主机。
例如,如果 MySQL 服务器在 Docker 容器中运行,并且您的 metabase
用户是使用 CREATE USER 'metabase'@'localhost' IDENTIFIED BY 'thepassword';
创建的,则 localhost
将解析为 Docker 容器,而不是主机,从而导致访问被拒绝。
您可以通过查看 Metabase 服务器日志中的错误消息来识别此问题
Access denied for user 'metabase'@'172.17.0.1' (using password: YES).
请注意主机名 172.17.0.1
(在本例中为 Docker 网络 IP 地址),以及末尾的 using password: YES
。
当尝试使用命令行客户端连接到 MySQL 服务器时,您将看到相同的错误消息:mysql -h 127.0.0.1 -u metabase -p
。
如何解决此问题: 使用正确的主机名重新创建 MySQL 用户
CREATE USER 'metabase'@'172.17.0.1' IDENTIFIED BY 'thepassword';
或者,如有必要,通配符可用于主机名
CREATE USER 'metabase'@'%' IDENTIFIED BY 'thepassword';
需要设置该用户的权限
GRANT SELECT ON targetdb.* TO 'metabase'@'172.17.0.1';
FLUSH PRIVILEGES;
记住删除旧用户
DROP USER 'metabase'@'localhost';
如果您无法连接到数据库,但用户、主机和密码都正确,请尝试将 trustServerCertificate=true
添加到其他 JDBC 选项。此选项将告诉 Metabase 驱动程序信任服务器证书,即使它没有安装根证书,并且应该建立安全连接。
同步包含 JSON 的记录
Metabase 将根据表的前五百行中的键推断 JSON“模式”。 MySQL JSON 字段缺少模式,因此 Metabase 无法依赖表元数据来定义 JSON 字段具有哪些键。为了解决缺少模式的问题,Metabase 将获取前五百条记录并解析这些记录中的 JSON,以推断 JSON 的“模式”。Metabase 将自身限制为五百条记录的原因是为了同步元数据不会给数据库带来不必要的压力。
问题是,如果 JSON 中的键在记录与记录之间有所不同,则前五百行可能无法捕获该 JSON 字段中 JSON 对象使用的所有键。要使 Metabase 推断出所有 JSON 键,您需要将其他键添加到前五百行中的 JSON 对象中。
启动 MySQL 8+ 的 MySQL Docker 容器
如果您正在启动新的 MySQL 容器,并且
- 您希望 Metabase 连接到容器,而无需手动创建用户或更改身份验证机制,
- 或者您遇到
RSA public key is not available client side (option serverRsaPublicKeyFile not set)
错误,
运行容器时,请使用 ['--default-authentication-plugin=mysql_native_password']
修饰符,如下所示
-
一个简单的 docker run:
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=xxxxxx mysql:8.xx.xx --default-authentication-plugin=mysql_native_password
-
或者在 docker-compose 中
mysql:
image: mysql:8.xx.xx
container_name: mysql
hostname: mysql
ports:
- 3306:3306
environment:
- "MYSQL_ROOT_PASSWORD=xxxxxx"
- "MYSQL_USER=metabase"
- "MYSQL_PASSWORD=xxxxxx"
- "MYSQL_DATABASE=metabase"
volumes:
- $PWD/mysql:/var/lib/mysql
command: ["--default-authentication-plugin=mysql_native_password"]
基于 Vitess 的数据库的限制
查询 Vitess 数据库时,您应该在每个子查询中添加 LIMIT
子句。
原因:通常,Metabase 会将限制(例如,2000 或 10000 行)应用于最终查询结果。但是,由于 Vitess 中的已知错误,Vitess 可能会将这些限制应用于子查询,这可能会导致意外结果。解决方法是在每个子查询中添加限制。
您可能需要咨询托管该平台的供应商,因为 Vitess 在从信息模式返回元数据时可能会遇到问题。Metabase 需要此元数据来填充其应用程序数据库;如果 Metabase 无法获取该元数据,则字段可能不会出现(或显示为空)。
延伸阅读
阅读其他Metabase 版本的文档。