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 每次运行同步时扫描值的样本。
指纹查询检查每列的前 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“schema”。** MySQL JSON 字段缺少 schema,因此 Metabase 无法依赖表元数据来定义 JSON 字段具有哪些键。为了解决缺少 schema 的问题,Metabase 将获取前五百条记录并解析这些记录中的 JSON 以推断 JSON 的“schema”。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 运行:`
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 数据库(如 Planetscale)时,应在每个子查询中添加一个 `
LIMIT
` 子句。原因:通常,Metabase 会对最终查询结果应用限制(例如 2000 或 10000 行)。但由于 Vitess 中已知的一个错误,Vitess 可能会对子查询应用这些限制,这可能导致意外结果(例如,Metabase 中不会显示所有结果行)。解决方法是为每个子查询添加限制。
-
您可能需要与托管该平台的供应商核实,因为 Vitess 在从信息 schema 返回元数据时可能会遇到问题。Metabase 需要这些元数据来填充其应用程序数据库;如果 Metabase 无法获取这些元数据,字段可能不会出现(或显示为空)。
模型功能
选择是否启用与Metabase 模型相关的功能。这些功能通常要求您用于连接数据库的数据库用户帐户同时具有读写权限。
模型操作
开启此设置以允许运行由此数据创建的模型中的操作。操作能够读取、写入和可能删除数据。您的数据库用户将需要写入权限。
模型持久化
我们将创建包含模型数据的表,并按照您定义的时间表刷新它们。要启用模型持久性,您需要授予此连接的凭据对 Metabase 提供的 schema 的读写权限。
数据库路由
通过数据库路由,管理员可以使用一个数据库构建一次问题,然后根据查看问题的用户,该问题将在具有相同数据结构(schema)的不同数据库上运行查询。
请参阅 数据库路由。
危险区
请参阅危险区。
延伸阅读
阅读其他版本的 Metabase 的文档。