实时物化视图 MCP 使用指南
开发过程中,您可以通过 Cursor、Qoder 等 IDE,在编码环境中以自然语言调用 IMV MCP(Model Context Protocol)工具,完成云原生数据仓库 AnalyticDB for PostgreSQL 实例上增量物化视图(IMV,即实时物化视图)的创建、监控、诊断与优化,无需离开编码环境,显著提升开发与运维效率。
IMV MCP 简介
MCP(Model Context Protocol)是一种开放标准协议,旨在为大语言模型(LLM)提供标准化的外部工具和上下文集成方式。IMV MCP 工具将 AnalyticDB for PostgreSQL 的 IMV(Incremental Materialized View,增量物化视图)管理能力与大模型代理(Agent)结合,支持通过自然语言交互的方式,实现 IMV 全生命周期管理。核心优势如下:
自然语言交互:使用日常对话即可完成 IMV 的创建、查询、诊断与优化。
上下文感知:Agent 能够理解对话上下文,自动串联依赖分析、性能诊断等连续操作。
IDE 内一站式:无需在 IDE 和控制台之间频繁切换。
安全可控:只读诊断与写操作分离,删除等破坏性操作需用户确认后才执行。
准备工作
在您的 Cursor、Qoder、Codex、Claude Code 中具有能够调用 Agent 能力的模型。
安装 Node.js,推荐使用 26.0.0 版本,可通过
node -v检查是否已安装符合需求的版本。获取 AccessKey,并确保该账号拥有目标实例 DataAPI(
ExecuteStatement、CreateSecret、DeleteSecret、ListSecrets)的调用权限;如不配置IMV_REGION_ID,还需DescribeDBInstanceAttribute权限用于自动反查实例地域。建议使用最小权限的 RAM 子账号。AnalyticDB for PostgreSQL 实例默认开通实时物化视图能力,您还需提供目标数据库的账号密码(建议使用最小权限账号,避免使用超级用户)。
配置 IMV MCP 工具
IMV MCP 通过环境变量完成全部配置,各环境变量说明如下:
环境变量 | 是否必填 | 说明 |
| 是 | 阿里云 AccessKey ID |
| 是 | 阿里云 AccessKey Secret |
| 否 | STS 临时凭证 Token,仅使用临时凭证时需要 |
| 是 | AnalyticDB for PostgreSQL 实例 ID(如 |
| 是 | 数据库账号 |
| 是 | 数据库密码 |
| 否 | 默认目标数据库名。填写后作为缺省库;不填时每次工具调用需通过 database 参数指定目标库,同一实例下不同 IDE 窗口 / Agent 可操作不同数据库 |
Cursor
在 Cursor 中,导航至 Cursor Setting > Tools & Integrations > MCP Tools,单击 New MCP Server,打开
.cursor/mcp.json文件。复制以下内容到文件中,并将
<yourAccessKeyID>、<yourAccessKeySecret>等信息替换为实际值。{ "mcpServers": { "imv-mcp": { "command": "npx", "args": [ "-y", "@adbpg-imv/imv-mcp-server@latest" ], "env": { "ALIBABA_CLOUD_ACCESS_KEY_ID": "<yourAccessKeyID>", "ALIBABA_CLOUD_ACCESS_KEY_SECRET": "<yourAccessKeySecret>", "IMV_DB_INSTANCE_ID": "<your-instance-id>", "IMV_DB_USERNAME": "<your-db-user>", "IMV_DB_PASSWORD": "<your-db-password>" } } } }保存
.cursor/mcp.json文件。您将看到 imv-mcp 服务已成功添加到 MCP Tools 列表中,并包含一系列可用工具。
Qoder
在 Qoder 中,导航至 首选项(Preferences) > Qoder设置(Qoder Settings) > MCP 服务(MCP Server),单击 +ADD,打开
mcp.json文件。复制以下内容到文件中,并将
<yourAccessKeyID>、<yourAccessKeySecret>等信息替换为实际值。{ "mcpServers": { "imv-mcp": { "command": "npx", "args": [ "-y", "@adbpg-imv/imv-mcp-server@latest" ], "env": { "ALIBABA_CLOUD_ACCESS_KEY_ID": "<yourAccessKeyID>", "ALIBABA_CLOUD_ACCESS_KEY_SECRET": "<yourAccessKeySecret>", "IMV_DB_INSTANCE_ID": "<your-instance-id>", "IMV_DB_USERNAME": "<your-db-user>", "IMV_DB_PASSWORD": "<your-db-password>" } } } }保存
mcp.json文件。您将看到 imv-mcp 服务已成功添加到 MCP Server 列表中,并包含一系列可用工具。
Codex
安装 Codex 之后,在命令行执行下面的命令:
codex mcp add imv-mcp \
--env ALIBABA_CLOUD_ACCESS_KEY_ID="<yourAccessKeyID>" \
--env ALIBABA_CLOUD_ACCESS_KEY_SECRET="<yourAccessKeySecret>" \
--env IMV_DB_INSTANCE_ID="<your-instance-id>" \
--env IMV_DB_USERNAME="<your-db-user>" \
--env IMV_DB_PASSWORD="<your-db-password>" \
-- npx -y @adbpg-imv/imv-mcp-server@latest说明:如果数据库密码包含 *、$ 等特殊字符,请务必使用双引号包裹,避免被 Shell 展开。
Claude Code
安装 Claude Code 之后,在命令行执行下面的命令:
claude mcp add imv-mcp \
--env ALIBABA_CLOUD_ACCESS_KEY_ID="<yourAccessKeyID>" \
--env ALIBABA_CLOUD_ACCESS_KEY_SECRET="<yourAccessKeySecret>" \
--env IMV_DB_INSTANCE_ID="<your-instance-id>" \
--env IMV_DB_USERNAME="<your-db-user>" \
--env IMV_DB_PASSWORD="<your-db-password>" \
-- npx -y @adbpg-imv/imv-mcp-server@latest工具列表
IMV MCP 提供的工具按用途分为四类。其中监控诊断与元数据查询为只读工具;IMV 生命周期与DDL 相关操作为写工具,删除等破坏性操作执行前 Agent 会向用户确认。
监控诊断(只读)
工具 | 说明 |
| 查询各基表增量维护管道的延迟秒数与增量积压行数,诊断 IMV 数据新鲜度 |
| 返回最近的增量维护报错记录,用于定位 IMV 无法正常刷新的原因 |
| 增量维护性能统计(总时长 / 计算时长 / 应用时长 / delta 行数),支持按基表或 IMV 过滤 |
| 判断指定 IMV 最近一次创建 / 替换 / 刷新是否已完成、是否已就绪可查 |
| 检测单个对象的数据倾斜程度,对比各 segment 的大小分布 |
元数据查询(只读)
工具 | 说明 |
| 列出当前库中所有 IMV 名称(按创建时间倒序) |
| 获取单个 IMV 的大小、估算行数、存储类型、reloptions、创建时间、最近全量刷新时间及访问热度 |
| 查询指定对象的上游(基表)或下游(IMV)依赖图,支持嵌套 IMV 展开 |
| 获取 IMV 的 SQL 定义(原始创建定义或系统改写后的增量维护定义) |
| 列出指定表或物化视图的所有列(列名、类型、约束) |
| 列出指定对象上的所有索引及其定义 |
| 获取指定索引的完整 CREATE INDEX 语句 |
| 计算列(组合)的唯一度比值,支持统计估算与精确计算两种模式 |
| 对指定 IMV 做索引与分布键优化诊断,返回优化建议 |
IMV 生命周期(写操作)
工具 | 说明 |
| 初始化 DDL 环境(幂等),创建或替换 IMV 前需先调用一次 |
| 创建新的 IMV(异步下发,需配合 |
| 替换已有 IMV 的定义(CREATE OR REPLACE) |
| 对单个 IMV 执行 READABLE 全量刷新 |
| 删除物化视图(工具层已禁用 CASCADE,防止误删级联依赖) |
| 原子替换 IMV 的增量维护索引为指定列 |
DDL 相关操作(写操作)
工具 | 说明 |
| 在指定表或物化视图的指定列上创建 btree 索引 |
| 删除指定索引 |
| 修改表或物化视图的存储引擎(如 heap → beam) |
| 修改分布键或切换为 REPLICATED 分布 |
| 重命名 TABLE、MATERIALIZED VIEW 或 INDEX |
使用示例
配置 IMV MCP 工具后,您可以在 IDE 的 Agent 对话框中,通过自然语言管理 IMV。
创建一个 IMV
用户指令:给出建视图的 SQL 和目标 IMV 名称
Agent 会自动调用一系列创建相关 Tool,不仅可完成创建,也可以主动完成对分布键等配置的通用优化。
┌─ 用户 ───────────────────────────────────────────────
│ 帮我创建一个 IMV,名字叫 imv_order_summary,SQL 如下:
│
│ SELECT
│ o.order_id,
│ o.customer_id,
│ o.order_date,
│ SUM(l.quantity * l.price) AS total_amount
│ FROM orders o
│ JOIN lineitem l ON o.order_id = l.order_id
│ GROUP BY o.order_id, o.customer_id, o.order_date
└──────────────────────────────────────────────────────
┌─ Agent ──────────────────────────────────────────────
│ 我来为您创建这个 IMV。首先初始化 DDL 环境,然后创建视图。
│
│ ⚙ 调用工具: imv_init_ddl
│ ✓ DDL 环境已就绪。
│
│ ⚙ 调用工具: imv_create
│ 参数: name=imv_order_summary, sql=SELECT o.order_id, ...
│ ✓ 创建任务已下发,正在等待就绪...
│
│ ⚙ 调用工具: imv_is_ready
│ 参数: name=imv_order_summary
│ ✓ IMV 已就绪,可正常查询。
│
│ ⚙ 调用工具: imv_optimize
│ 参数: name=imv_order_summary
│ → 建议将分布键从默认随机分布调整为 (order_id),可提升增量
│ 维护的 JOIN 本地性。
│
│ 调用工具: adbpg_relation_alter_distributed
│ 参数: name=imv_order_summary, distributed_by=order_id
│ ✓ 分布键已调整为 (order_id)。
│
│ 总结:IMV imv_order_summary 已成功创建并完成分布键优化。
└──────────────────────────────────────────────────────查看当前库中有哪些 IMV
用户指令:列出当前库中所有的 IMV
Agent 会自动解析您的意图,调用 imv_list_all 工具,按创建时间倒序返回当前绑定数据库中的全部 IMV 名称。
┌─ 用户 ───────────────────────────────────────────────
│ 列出当前库中所有的 IMV
──────────────────────────────────────────────────────
┌─ Agent ──────────────────────────────────────────────
│ ⚙ 调用工具: imv_list_all
│
│ 当前数据库共有 4 个 IMV(按创建时间倒序):
│
│ # 名称 创建时间
│ 1 imv_order_summary 2025-06-15 14:30:00
│ 2 imv_daily_revenue 2025-05-20 09:15:00
│ 3 imv_customer_stats 2025-04-10 16:45:00
│ 4 imv_product_inventory 2025-03-01 11:00:00
──────────────────────────────────────────────────────查看单个 IMV 的运行状态
用户指令:看一下 imv_order_summary 这个视图多大、最近什么时候刷新的、访问频率
Agent 会调用 imv_stat_single 工具,返回该 IMV 的总大小、估算行数、创建时间、最近全量刷新时间及访问扫描次数。
┌─ 用户 ───────────────────────────────────────────────
│ 看一下 imv_order_summary 这个视图多大、最近什么时候
│ 刷新的、访问频率怎么样
└──────────────────────────────────────────────────────
┌─ Agent ──────────────────────────────────────────────
│ ⚙ 调用工具: imv_stat_single
│ 参数: name=imv_order_summary
│
│ imv_order_summary 的运行状态如下:
│
│ 总大小: 256 MB
│ 估算行数: 1,820,000 行
│ 存储引擎: heap
│ 创建时间: 2025-06-15 14:30:00
│ 最近全量刷新: 2025-07-01 02:00:00
│ 访问扫描次数: 3,472 次
│
│ 该视图体积适中,访问频率较高,增量维护正常运行中。
└──────────────────────────────────────────────────────诊断 IMV 刷新报错
用户指令:为什么我的 IMV 最近不刷新了
Agent 会调用 imv_error_log 获取最近的增量维护报错记录,并结合 imv_incremental_stat 的计算/应用时长统计定位瓶颈,以下是一个脏数据导致类型转换报错、阻塞增量维护的常见例子。
┌─ 用户 ──────────────────────────────────────────────
│ 为什么我的 imv_daily_revenue 最近不刷新了?
└──────────────────────────────────────────────────────
┌─ Agent ──────────────────────────────────────────────
│ 我来查一下报错日志和维护统计。
│
│ ⚙ 调用工具: imv_error_log
│ 参数: name=imv_daily_revenue
│
│ 发现最近的报错记录:
│
│ 时间: 2025-07-10 03:15:22
│ 错误: ERROR: invalid input syntax for type numeric:
│ "N/A" (基表 sales, 列 amount)
│ 影响: 增量维护管道自该时刻起阻塞
│
│ ⚙ 调用工具: imv_incremental_stat
│ 参数: name=imv_daily_revenue
│
│ 最近一次成功维护: 2025-07-10 03:00:05
│ 当前积压 delta: 48,350 行
│
│ 原因分析:基表 sales 的 amount 列写入了非法值 "N/A",
│ 导致增量维护在类型转换时报错并阻塞。建议修复脏数据后,
│ 使用 imv_refresh_self 全量刷新以恢复增量管道。
──────────────────────────────────────────────────────检查 IMV 数据是否延迟并优化
用户指令:帮我看看(某个或所有)IMV 的数据有没有延迟
Agent 会调用 imv_latency 工具,返回各基表增量维护管道的延迟秒数和未消费的增量积压行数;对于探测到延迟的 IMV,Agent 会先通过 imv_dependency 展开整棵依赖树(含嵌套子 IMV),再对树上每个 IMV 调用 imv_optimize 做诊断。诊断会按视图体积自动分流:小体积视图(单 segment 数据量 < 1GB)Agent 可自主完成候选索引的精确评估并直接给出推荐,此场景下索引与分布键的落地调整(imv_alter_maintain_index / adbpg_relation_alter_distributed)可由 Agent 直接执行;大体积视图会列出候选方案、告知评估耗时并征求您确认后才执行评估,落地调整同样必须经您同意。
┌─ 用户 ───────────────────────────────────────────────
│ 帮我看看所有 IMV 的数据有没有延迟
└──────────────────────────────────────────────────────
┌─ Agent ──────────────────────────────────────────────
│ ⚙ 调用工具: imv_latency
│
│ 检测到以下 IMV 存在延迟:
│
│ IMV 名称 基表 延迟 积压行数
│ imv_customer_stats customers 45s 12,300
│ imv_customer_stats orders 128s 85,600
│
│ 其余 IMV 延迟均在正常范围内(< 5s)。
│
│ 我来对 imv_customer_stats 做进一步诊断。
│
│ ⚙ 调用工具: imv_dependency
│ 参数: name=imv_customer_stats, depth=2
│ → 依赖树:
│ imv_customer_stats
│ ├── 基表: customers
│ ├── 基表: orders
│ └── 嵌套 IMV: imv_order_agg (子视图)
│ ── 基表: lineitem
│
│ ⚙ 调用工具: imv_optimize
│ 参数: name=imv_customer_stats
│ → 该视图单 segment 数据量 420 MB(< 1GB),自动进行
│ 精确评估...
│
│ 诊断结果:
│ 当前增量维护索引为 (customer_id),但增量 JOIN 关联键
│ 为 (order_id),导致每次维护全表扫描 orders 侧 delta。
│ 建议:将增量维护索引改为 (order_id),预计维护耗时降低
│ 约 70%。
│
│ ⚙ 调用工具: imv_alter_maintain_index
│ 参数: name=imv_customer_stats, columns=order_id
│ ✓ 增量维护索引已替换为 (order_id)。
│
│ ⚙ 调用工具: imv_optimize
│ 参数: name=imv_order_agg
│ → 子视图 imv_order_agg 当前配置已为最优,无需调整。
│
│ 总结:imv_customer_stats 的延迟根因是增量维护索引未对齐
│ JOIN 键,已完成优化。后续维护延迟预计恢复至正常水平。
└──────────────────────────────────────────────────────优势
IMV MCP 为数据开发者带来以下价值:
聚焦业务开发:从繁琐的巡检 SQL 中解放出来,专注于业务逻辑。
简化工作流:将跨多个工具的巡检与诊断,简化为 IDE 内的几轮自然语言对话。
杜绝误操作:只读与写操作分离,删除等破坏性操作必须经用户确认,保障业务连续性。
加速问题定位:延迟、报错、性能统计一站式获取,避免人工拼凑多条诊断 SQL 的结果。
常见问题
为什么配置后调用工具报错 "Instance.NotFound"?
该报错表示当前 AccessKey 所属账号在配置的地域下找不到目标实例,请按以下顺序排查:
如显式配置了
IMV_REGION_ID,确认其与实例实际所在地域完全一致;也可直接删除该配置,由 IMV MCP 按实例 ID 自动反查地域(需DescribeDBInstanceAttribute权限)。确认
ALIBABA_CLOUD_ACCESS_KEY_ID/ALIBABA_CLOUD_ACCESS_KEY_SECRET属于拥有该实例的阿里云账号。
为什么在命令行配置时密码不生效?
如果数据库密码以 * 开头或包含 $、! 等特殊字符,在 Codex、Claude Code 等命令行配置方式中,请务必用引号将密码包裹,避免被 Shell 展开或截断。
为什么修改配置文件后工具没有生效?
部分 IDE 不会在配置文件变更后自动重启 MCP 服务。请在 IDE 的 MCP 服务管理界面将 imv-mcp 服务禁用后再启用,使新配置生效。
如何确认 AccessKey 权限不足?
如果出现权限相关报错,请确保您的阿里云账号拥有目标实例 DataAPI(ExecuteStatement、CreateSecret、DeleteSecret、ListSecrets,未配置 IMV_REGION_ID 时还需 DescribeDBInstanceAttribute)的调用权限,建议使用 AliyunGPDBFullAccess 权限策略或更细粒度的自定义策略。