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 服务器失败,错误消息为“Looks like the username or password is incorrect”(用户名或密码不正确),但您确定用户名和密码是正确的。您可能在创建 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';

如果您无法连接到数据库,但用户、主机和密码都正确,请尝试在附加 JDBC 选项中添加 trustServerCertificate=true。此选项将告诉 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 数据库(如 Planetscale)时,应在每个子查询内部添加 LIMIT 子句。

    原因:通常,Metabase 会对最终查询结果应用限制(例如,2000 或 10000 行)。但由于 Vitess 中一个已知错误,Vitess 可能会将这些限制应用于子查询,这可能导致意外结果(例如,Metabase 中不会显示所有结果行)。解决方法是为每个子查询添加限制。

  • 您可能需要与托管该平台的供应商确认,因为 Vitess 在从信息模式返回元数据时可能会遇到问题。Metabase 需要这些元数据来填充其应用程序数据库;如果 Metabase 无法获取这些元数据,字段可能不会显示(或显示为空)。

模型功能

选择是否启用与Metabase 模型相关的功能。这些功能通常要求您用于连接数据库的数据库用户账户同时具有读写权限。

模型操作

开启此设置以允许运行由此数据创建的模型中的操作。操作能够读取、写入并可能删除数据。您的数据库用户将需要写入权限。

模型持久化

我们将创建包含模型数据的表,并按您定义的时间表刷新它们。要启用模型持久化,您需要授予此连接的凭据对 Metabase 提供的模式的读写权限。

数据库路由

请参阅数据库路由

危险区

请参阅危险区

延伸阅读

阅读其他Metabase 版本的文档。

© . All rights reserved.