同步和扫描数据库
Metabase 会定期运行不同类型的查询,以使其数据库元数据保持最新。了解您的数据有助于 Metabase 自动显示正确的结果图表,并在筛选器小部件中填充下拉菜单。
Metabase 会执行以下几项操作:
- 同步获取更新的模式,以在数据浏览器中显示。
- 扫描获取列值的样本,以填充筛选器下拉菜单并建议有用的可视化。Metabase 不会存储数据库中的完整表格。
- 指纹识别会获取列值的额外样本,以帮助实现智能行为,例如柱状图的自动分箱。
初始同步、扫描和指纹识别
当 Metabase 首次连接到您的数据库时,它会执行同步来确定表格中列的元数据,并自动为每列分配一个语义类型。
您可以从管理 > 故障排除 > 日志中查看这些查询的进度。
查询运行完成后,您可以从管理设置 > 表元数据中查看和编辑同步的元数据。更多信息,请参阅编辑元数据。
选择同步和扫描发生的时间
默认情况下,Metabase 会执行轻量级的每小时同步和密集的每日字段值扫描。如果您有一个大型数据库,您可能需要选择同步和扫描发生的时间
数据库同步
如果您已选择选择同步和扫描发生的时间 > 开启,您将能够设置:
- 同步的频率:每小时(默认)或每天。
- 同步运行的时间,以运行 Metabase 应用程序的服务器时区为准。
扫描筛选器值
Metabase 可以扫描并缓存字段中存在的值,以便在仪表盘和问题中显示复选框筛选器等内容。Metabase 只会扫描您在 Metabase 中实际使用的字段。因此,如果用户在仪表盘上使用筛选器小部件,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 使用此查询的结果在 Metabase UI 中提供更好的建议(例如筛选器下拉列表和自动分箱)。为避免对数据库造成压力,Metabase 仅在您首次设置数据库连接时运行指纹识别查询。要更改此默认设置,您可以开启定期重新指纹识别表格。
延伸阅读
Metabase 在同步和扫描过程中不进行任何缓存或速率限制。如果您的数据似乎丢失或已过期,请查看:
阅读其他Metabase 版本的文档。