同步和扫描数据库
Metabase运行不同类型的查询以保持与数据库同步。
- 同步获取更新后的模式,以在数据浏览器中显示。
- 扫描获取列值的样本,以填充筛选下拉菜单并建议有用的可视化。Metabase不会存储数据库中的完整表。
- 指纹识别获取列值的额外样本,以帮助智能行为,例如条形图的自动分箱。
初始同步、扫描和指纹识别
当 Metabase 首次连接到您的数据库时,Metabase 会进行一个同步操作,以确定您表中列的元数据,并自动为每个列分配一个语义类型。一旦同步成功,Metabase 将对每个表进行扫描,以查找 URL、JSON、编码字符串等。同步完成后,将运行指纹查询。
您可以通过访问 管理 > 故障排除 > 日志 来跟踪这些查询的进度。
查询完成后,您可以通过访问 管理设置 > 表元数据 来查看和编辑同步的元数据。有关更多信息,请参阅编辑元数据。
选择 Metabase 同步和扫描的时间
- 转到 管理 > 数据库 > 您的数据库。
- 展开 显示高级选项。
- 开启 选择同步和扫描发生的时间。
安排数据库同步
如果您已开启选择同步和扫描发生的时间,您将能够设置
- 同步的频率:同步:每小时(默认)或每天。
- 同步的时间,以 Metabase 应用程序运行的服务器所在的时区为准。
安排数据库扫描
如果您已开启选择同步和扫描发生的时间,您将看到以下扫描选项
- 定期,按计划允许您以与数据库变化速率相匹配的频率运行扫描查询。时间是设置在 Metabase 应用程序运行的服务器所在的时区。这是小型数据库或经常更新的具有不同值的表的最好选项。
- 仅在添加新的筛选小部件时是一个很好的选项,如果您想按需运行扫描查询。开启此选项意味着 Metabase 仅在向仪表板或 SQL 问题添加新筛选时扫描和缓存字段(字段)的值。
- 从不,如果需要我会手动完成是针对要么非常大,要么几乎从未添加新值的数据库的选项。使用现在重新扫描字段值按钮来运行手动扫描并将筛选值更新到最新。
手动同步表和列
- 转到 管理设置 > 数据库 > 您的数据库。
- 点击 立即同步数据库架构。
手动扫描列值
要扫描表中所有列的值
- 转到 管理设置 > 表元数据 > 您的数据库。
- 选择您想更新与数据库的表的表。
- 点击页面顶部的 齿轮图标。
- 点击 重新扫描此表。
要扫描特定列的值
- 转到 管理设置 > 表元数据 > 您的数据库。
- 选择表。
- 找到您想更新与数据库的列。
- 点击该列面板中的 齿轮图标。
- 点击 重新扫描此字段。
清除表或字段的缓存值
要清除表中扫描的字段值
- 转到 管理设置 > 表元数据。
- 选择数据库和表。
- 点击右上角的 齿轮图标。
- 点击 丢弃缓存字段值。
您还可以通过在字段上点击 齿轮 图标,然后点击 丢弃缓存字段值 来告诉 Metabase 忘记单个字段的缓存值。
禁用特定表的同步和扫描
要防止 Metabase 对特定表运行同步和扫描,将 表可见性 更改为 隐藏
- 转到 管理设置 > 表元数据 > 您的数据库。
- 将鼠标悬停在侧边栏中的表名上。
- 点击 眼睛 图标。
使用 API 进行同步和扫描
Metabase 定期同步和扫描,但如果数据库管理员刚刚更改了数据库架构,或者如果数据在特定时间自动添加了很多,您可能需要编写一个使用 Metabase API 的脚本来强制同步或扫描。我们的 API 提供两种方式来启动数据库的同步或扫描。
- 使用会话令牌:使用
/api/database/:id/sync_schema
或api/database/:id/rescan_values
端点。这些端点与在管理员面板中进入数据库并选择 立即同步数据库架构 或 立即重新扫描字段值 分别执行相同的功能。要使用这些端点,您必须通过用户 ID 进行身份验证,并在请求头中传递会话令牌。 - 使用 API 密钥:使用
/api/notify/db/:id
。我们创建了这个端点,以便人们在 ETL 操作 完成后通知 Metabase 进行同步。要使用此端点,您必须通过定义MB_API_KEY
环境变量来传递 API 密钥。
数据库同步的工作原理
Metabase 的 同步 是一个查询,它从您的数据库中获取更新后的表名、视图名、列名和列数据类型列表
SELECT
TRUE
FROM
"your_schema"."your_table_or_view"
WHERE
1 <> 1
LIMIT 0
此查询在设置期间运行您的数据库,默认情况下每小时再次运行。这个扫描查询在大多数关系型数据库中运行得很快,但在 MongoDB 和一些 社区构建的数据库驱动程序 中可能会慢一些。同步不能完全关闭,否则 Metabase 不会工作。
数据库扫描的工作原理
Metabase 的 扫描 是一个查询,通过查看每个表的前 1,000 个不同的记录来缓存过滤下拉框的列值
SELECT
"your_table_or_view"."column" AS "column"
FROM
"your_schema"."your_table_or_view"
GROUP BY
"your_table_or_view"."column"
ORDER BY
"your_table_or_view"."column" ASC
LIMIT 1000
对于每条记录,Metabase 只存储前 100 千字节文本,所以如果您有每个包含 1,000 个字符的数据(如地址),并且您的列有超过 100 个独特的地址,Metabase 将只缓存扫描查询中的前 100 个值。
缓存的列值显示在过滤下拉菜单中。如果人们输入的过滤搜索框中的值不在前 1,000 个不同的记录或 100KB 文本中,Metabase 将实时在您的数据库中运行查询以查找这些值。
扫描比同步查询更密集,因此它只在设置期间运行一次,默认情况下每天运行一次。如果您 完全禁用扫描,您需要通过运行 手动扫描 来更新数据。
为了减少 Metabase 需要扫描以保持与连接的数据库同步的表和字段数量,Metabase 将只为过去十四天内有人查询的字段扫描值。
定期重新指纹表
定期重新指纹将增加您数据库的负载。
默认情况下,Metabase 仅在您首次连接数据库时运行指纹查询。
如果您想使 Metabase 在 UI 中提出建议时使用更大的列值样本,请启用此设置
- 转到 管理 > 数据库 > 您的数据库。
- 展开 显示高级选项。
- 启用 定期重新指纹表。
数据库指纹查询是如何工作的
指纹查询会查看数据库中给定表或视图的前 10,000 行
SELECT
*
FROM
"your_schema"."your_table_or_view"
LIMIT 10000
此查询的结果用于在 Metabase UI 中提供更好的建议(例如过滤器下拉列表和自动分箱)。为了避免对数据库造成压力,Metabase 仅在您首次设置数据库连接时运行指纹查询。要更改此默认设置,您可以启用 定期重新指纹表。
进一步阅读
在同步和扫描过程中,Metabase 不执行任何缓存或速率限制。如果您的数据看起来缺失或过时,请查看
阅读关于其他 Metabase 版本 的文档。