暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

那个凌晨还在写SQL的DBA,现在用自然语言“指挥”数据库了

原创 shunwahⓂ️ 2026-07-18
823

KingbaseES MCP Server 让 AI Agent 成为国产数据库专属 DBA

作者: ShunWah
公众号: "shunwah星辰数智社"主理人。

持有认证: OceanBase、MySQL、OpenGauss、崖山、金仓KingBase、KaiwuDB、亚信AntDBCA、翰高、GBase、Galaxybase、Neo4j、NebulaGraph、东方通TongTech、TiDB 等多项权威认证。

获奖经历: 崖山YashanDB YVP、浪潮KaiwuDB MVP、墨天轮 MVP、金仓社区KVA、TiDB社区MVA、NebulaGraph社区之星、IFClub星珩联盟·智库星系技术专家、ITPUB 技术专家、GBase 8a开发者联盟成员、腾讯云架构师上海同盟等社区版主及布道师。在OceanBase&墨天轮征文大赛、OpenGauss、TiDB、YashanDB、Kingbase、KWDB、Navicat 征文等赛事中多次斩获一、二、三等奖,原创技术文章常年被墨天轮、CSDN、ITPUB 等平台首页推荐。

公众号封面文案生成.jpg

前言

做 DBA 这几年,我养成了一个不算好也不算坏的习惯——遇到新工具总想亲手折腾一遍。倒不是有多爱钻研技术,纯粹是觉得:只有自己踩过坑、跑通过,写出来的东西才有底气。

AI Agent 已经从单纯对话工具进化为可自主完成业务、运维全链路的智能助手。但长期以来,大模型和数据库之间存在一道鸿沟:AI 看不到真实库表结构,手写 SQL 极易脱离实际业务;开发者要在 IDE、数据库客户端、AI 窗口反复切换;直接开放数据库权限又存在删改、拖垮实例的巨大风险。

国产数据库如何适配 AI 原生开发生态?金仓开源的 KingbaseES MCP Server 给出了一套标准化落地方案。

6 月 25 日 19:00,金仓社区通过【金仓数据库】视频号带来了一场主题为 【金仓数据库 x AI Agent 实战】 的线上直播。看完直播后,我第一时间打开了终端。原因很简单:让 AI 用自然语言直接操作数据库——这个场景太诱人了。但我也见过太多“演示型”翻车现场:AI 瞎猜字段名、生成的 SQL 性能拉胯、上下文切来切去……

MCP(Model Context Protocol)的出现改变了这一切。它就像是 AI 的 “USB-C 接口” ,让大模型能标准化地连接外部数据源。而金仓做的,就是给 KingbaseES 数据库装上了这个接口——让 AI 能实时“看见”表结构、索引、执行计划,不再盲写 SQL

本文将以 Windows 环境下的 Trae CN 和 Cursor 为例,完整记录从零安装、配置到实战体验的全过程。

微信图片_20260714_230323_111.png

一、项目基础与前置环境准备

1.1 动手之前:MCP 到底解决了什么问题?

在开始安装之前,我觉得有必要先说清楚一件事:我们为什么需要 MCP Server?

想象一下这个场景:你让 AI 帮你写一条查询 SQL。如果 AI 对你的数据库一无所知——不知道有哪些表、不知道字段类型、不知道有没有索引——它只能“盲写”。写出来的 SQL 要么字段名不存在,要么性能惨不忍睹。

传统做法是什么?你先把表结构复制出来贴给 AI,再把执行计划贴回去问它怎么优化。IDE、客户端、AI 对话窗口来回切换,上下文反复丢失

MCP Server 做的事情就是把这条路彻底打通。AI 助手通过 MCP 协议直接连接到数据库,能实时查看表结构、索引信息、执行计划——相当于给 AI 配了一双“数据库的眼睛”

image.png

1.2 Kingbase MCP Server 核心定位

Kingbase MCP Server 是金仓在 Gitee 开源的 MIT 协议中间服务,核心作用是标准化打通 AI 客户端与 KingbaseES 数据库,把库表查询、SQL 执行、性能诊断、运维巡检封装成 AI 可自动调用的标准化 Tools,无需重复开发对接逻辑。

image.png

配套开源工具生态:

  1. kes-skills:适配 V8/V9 的 Claude Code 技能包,AI 可精准识别金仓专属语法、部署调优方案;
  2. ksycopg2:官方 Python 驱动,支持异步、批量 COPY,兼容绝大多数金仓独有数据类型。

金仓这套方案覆盖了从结构探索、SQL 生成、执行计划分析,到慢查询诊断、全维度健康巡检、索引优化推荐的全链路场景。而且是在 IDE 内一步完成,不用切来切去。

听起来很美好,对吧?下面开始实战。

1.3 硬性环境要求

项目 要求
数据库 KingbaseES V8R6 及以上版本,需提前手动安装(暂不支持容器快速部署)
Python 版本 3.12~3.13
系统支持 Linux x86/Aarch64、Windows;Mac/Alpine 无官方 ksycopg2 驱动,可临时用 psycopg2 兼容
必备工具 Git、uv 包管理器
可选扩展 sys_hypo(索引模拟)、sys_stat_statements(慢查询统计)

1.4 连接数据库并安装扩展

首先连接到 KingbaseES 数据库,确认版本和兼容模式:

[kingbase@openeuler-server bin]$ /redo/Kingbase/ES/V9R3/Server/bin/ksql -U system -p 54321 -d test 授权类型: 企业版. 输入 "help" 来获取帮助信息. test=#

image.png

查看版本和兼容模式:

test=# SELECT version(); version ------------------------- KingbaseES V009R003C018 (1 行记录) test=# SHOW database_mode; database_mode --------------- mysql (1 行记录) test=#

image.png

可选数据库扩展(解锁性能模拟、慢查询统计):
– 索引模拟功能依赖
– 慢查询负载统计依赖(库已预装无需重建)

test=# CREATE EXTENSION sys_hypo; CREATE EXTENSION test=# CREATE EXTENSION IF NOT EXISTS sys_stat_statements; NOTICE: 扩展 "sys_stat_statements" 已经存在,跳过 CREATE EXTENSION test=#

image.png

二、完整部署实操(Linux 端)

2.1 拉取官方开源仓库

打开终端执行克隆命令:

test=# exit [kingbase@openeuler-server ~]$ cd /data/ [kingbase@openeuler-server data]$ sudo git clone https://gitee.com/king-db/kingbase-mcp.git 正克隆到 'kingbase-mcp'... remote: Enumerating objects: 241, done. remote: Counting objects: 100% (241/241), done. remote: Compressing objects: 100% (223/223), done. remote: Total 241 (delta 105), reused 0 (delta 0), pack-reused 0 (from 0) 接收对象中: 100% (241/241), 664.00 KiB | 2.80 MiB/s, 完成. 处理 delta 中: 100% (105/105), 完成. [kingbase@openeuler-server data]$ cd kingbase-mcp/ [kingbase@openeuler-server kingbase-mcp]$ pwd /data/kingbase-mcp [kingbase@openeuler-server kingbase-mcp]$ ls imgs justfile LICENSE pyproject.toml README.md src tests [kingbase@openeuler-server kingbase-mcp]$

image.png

2.2 安装 uv 包管理器

uv 是一个用 Rust 写的超快 Python 包管理工具,比传统的 pip 快几十倍。

curl -LsSf https://astral.sh/uv/install.sh | sh

实际执行:

[kingbase@openeuler-server kingbase-mcp]$ curl -LsSf https://astral.sh/uv/install.sh | sh downloading uv 0.11.28 x86_64-unknown-linux-gnu installing to /home/kingbase/.local/bin uv uvx everything's installed! To add $HOME/.local/bin to your PATH, either restart your shell or run: source $HOME/.local/bin/env (sh, bash, zsh) source $HOME/.local/bin/env.fish (fish) [kingbase@openeuler-server kingbase-mcp]$

image.png

2.3 踩坑实录①:Permission Denied

第一次克隆时就遇到了权限问题:

[kingbase@openeuler-server bin]$ cd /data/ [kingbase@openeuler-server data]$ git clone https://gitee.com/king-db/kingbase-mcp.git fatal: 不能创建工作区目录 'kingbase-mcp': Permission denied

image.png

  • 原因/data/ 目录归 root 用户所有,普通用户 kingbase 没有写权限。
  • 解决:使用 sudo 执行克隆。

sudo 成功克隆后,代码完整躺在了 /data/kingbase-mcp 里。

image.png

2.4 踩坑实录②:Python 版本不匹配

查看当前 Python 版本:

[kingbase@openeuler-server kingbase-mcp]$ python --version Python 3.9.9 [kingbase@openeuler-server kingbase-mcp]$

系统默认 Python 是 3.9.9,但项目需要 3.12 以上。用 uv 指定版本即可解决。

image.png

2.5 踩坑实录③:虚拟环境创建权限问题

刚才用了 sudo git clone/data/kingbase-mcp 文件夹的所有权是 root。直接用 kingbase 用户执行 uv venv 会报错:

[kingbase@openeuler-server kingbase-mcp]$ uv venv --python 3.12 Using CPython 3.12.13 Creating virtual environment at: .venv error: Failed to create virtual environment Caused by: failed to create directory `/data/kingbase-mcp/.venv`: Permission denied (os error 13) [kingbase@openeuler-server kingbase-mcp]$

image.png

解决办法:将文件夹所有权还给 kingbase 用户:

[kingbase@openeuler-server kingbase-mcp]$ sudo chown -R kingbase:kingbase /data/kingbase-mcp/ [sudo] kingbase 的密码: [kingbase@openeuler-server kingbase-mcp]$

image.png

2.6 补全 PATH 并验证 uv

# 补全 uv 命令到当前终端
[kingbase@openeuler-server kingbase-mcp]$ source $HOME/.local/bin/env
[kingbase@openeuler-server kingbase-mcp]$

image.png

# 验证安装
[kingbase@openeuler-server kingbase-mcp]$ uv --version
uv 0.11.28 (x86_64-unknown-linux-gnu)
[kingbase@openeuler-server kingbase-mcp]$

image.png

2.7 创建虚拟环境并安装依赖

[kingbase@openeuler-server kingbase-mcp]$ uv venv --python 3.12 Using CPython 3.12.13 Creating virtual environment at: .venv Activate with: source .venv/bin/activate [kingbase@openeuler-server kingbase-mcp]$ source .venv/bin/activate (kingbase-mcp) [kingbase@openeuler-server kingbase-mcp]$

image.png

一键安装全部项目依赖:

(kingbase-mcp) [kingbase@openeuler-server kingbase-mcp]$ uv pip install . Resolved 60 packages in 5m 17s Built kingbase-mcp @ file:///data/kingbase-mcp ksycopg2 ------------------------------ 272.00 KiB/4.22 MiB pglast ------------------------------ 272.00 KiB/5.62 MiB warning: Failed to hardlink files; falling back to full copy. This may lead to degraded performance. If the cache and target directories are on different filesystems, hardlinking may not be supported. If this is intentional, set `export UV_LINK_MODE=copy` or use `--link-mode=copy` to suppress this warning. Installed 60 packages in 199ms + aiohappyeyeballs==2.7.1 + yarl==1.24.2 省略 (kingbase-mcp) [kingbase@openeuler-server kingbase-mcp]$

image.png

2.8 踩坑实录④:数据库未配置信任认证

CheckGeneral —— 运行健康检查工具时遇到连接失败:

image.png

报错unable to connect to the database without a password

原因kbinspect 尝试用空密码连接本地数据库,但 sys_hba.conf 未配置信任认证。

解决步骤一:修改数据库密码

[kingbase@openeuler-server V9R3]$ /redo/Kingbase/ES/V9R3/Server/bin/ksql -U system -p 54321 -d test 授权类型: 企业版. 输入 "help" 来获取帮助信息. test=# ALTER USER system WITH PASSWORD 'Us&SmMNl#5H6'; ALTER ROLE test=#

image.png

解决步骤二:修改 sys_hba.conf

[kingbase@openeuler-server V9R3]$ pwd /data/Kingbase/ES/V9R3 [kingbase@openeuler-server V9R3]$ vim sys_hba.conf

image.png

image.png

在文件开头加入:

local   all             all                                     scram-sha-256
host    all             all             127.0.0.1/32            scram-sha-256

然后重载配置:

[kingbase@openeuler-server V9R3]$ /redo/Kingbase/ES/V9R3/Server/bin/sys_ctl -D /data/Kingbase/ES/V9R3 -l /data/Kingbase/ES/V9R3/logfile reload 服务器进程发出信号 [kingbase@openeuler-server V9R3]$

image.png

验证密码生效:

[kingbase@openeuler-server V9R3]$ /redo/Kingbase/ES/V9R3/Server/bin/ksql -U system -p 54321 -d test 用户 system 的口令: 授权类型: 企业版. 输入 "help" 来获取帮助信息. test=#

image.png

2.9 创建专属数据库 mcp_demo

默认的 test 数据库主要是用来做连接测试的。建议新建一个专属数据库,避免实验数据与系统对象混在一起。

连接数据库:

[kingbase@openeuler-server kingbase-mcp]$ /redo/Kingbase/ES/V9R3/Server/bin/ksql -U system -p 54321 -d test 用户 system 的口令: 授权类型: 企业版. 输入 "help" 来获取帮助信息. test=#

image.png

执行建库命令:

test=# CREATE DATABASE mcp_demo OWNER system; CREATE DATABASE test=#

image.png

验证新库:

test=# \q [kingbase@openeuler-server kingbase-mcp]$ /redo/Kingbase/ES/V9R3/Server/bin/ksql -U system -p 54321 -d mcp_demo 用户 system 的口令: 授权类型: 企业版. 输入 "help" 来获取帮助信息. mcp_demo=#

image.png

2.10 配置 .env 文件

mcp_demo=# \q [kingbase@openeuler-server kingbase-mcp]$ ls imgs justfile LICENSE pyproject.toml README.md src tests [kingbase@openeuler-server kingbase-mcp]$ vim .env

image.png

填入以下内容(注意密码中的特殊字符):

DB_HOST=127.0.0.1
DB_PORT=54321
DB_USER=system
DB_PASSWORD=Us&SmMNl#5H6
DB_NAME=mcp_demo
DB_SCHEMA=public
ACCESS_MODE=readonly

image.png

说明ACCESS_MODE=readonly 表示只读模式,AI 只能执行查询,无法修改数据。这是安全的第一道防线。

三、三种传输模式与 IDE 配置

image.png

MCP 提供 Stdio(本地开发)、SSE(老旧远程方案)、Streamable HTTP(推荐远程)三种传输方式。对于本地体验,我们直接选择最常用的 Stdio 模式。

3.1 环境变量配置方式

MCP Server 有两种读取配置的方式:

方式 配置位置 适用场景
.env 文件 项目根目录 命令行直接运行
env 字段 IDE 的 MCP 配置 JSON 通过 IDE 启动

建议:如果通过 IDE(Cursor/Trae)启动,把连接信息直接写在 JSON 的 env 字段里更可靠。

3.2 Windows 端安装 uv

由于 Trae CN 运行在 Windows 上,需要在 Windows 端也安装 uv

image.png

以管理员身份打开 PowerShell,执行:

Set-ExecutionPolicy RemoteSigned -scope CurrentUser powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

如果遇到执行策略限制:

PS C:\Users\linkinip> powershell -c "irm https://astral.sh/uv/install.ps1 | iex" Error: PowerShell requires an execution policy in [Unrestricted, RemoteSigned, Bypass] to run uv. For example, to set the execution policy to 'RemoteSigned' please run: Set-ExecutionPolicy RemoteSigned -scope CurrentUser

按提示设置后再安装:

PS C:\Users\linkinip> Set-ExecutionPolicy RemoteSigned -scope CurrentUser PS C:\Users\linkinip> powershell -c "irm https://astral.sh/uv/install.ps1 | iex" downloading uv 0.11.28 (x86_64-pc-windows-msvc) installing to C:\Users\linkinip\.local\bin uv.exe uvx.exe uvw.exe everything's installed!

image.png

验证安装(重启终端后):

PS C:\Users\linkinip> uv --version uv 0.11.28 (ebf0f43d7 2026-07-07 x86_64-pc-windows-msvc) PS C:\Users\linkinip>

image.png

3.3 克隆代码到 Windows 本地

PS C:\Users\linkinip> git clone https://gitee.com/king-db/kingbase-mcp.git D:\code\kingbase-mcp Cloning into 'D:\code\kingbase-mcp'... remote: Enumerating objects: 241, done. remote: Counting objects: 100% (241/241), done. remote: Compressing objects: 100% (223/223), done. remote: Total 241 (delta 105), reused 0 (delta 0), pack-reused 0 (from 0) Receiving objects: 100% (241/241), 664.00 KiB | 1.07 MiB/s, done. Resolving deltas: 100% (105/105), done. PS C:\Users\linkinip>

image.png

3.4 Trae CN 配置 MCP Server

登录 Trae CN:

image.png

image.png

image.png

image.png

进入设置 → MCP Server,点击“添加服务器”,填入以下 JSON 配置:

{ "mcpServers": { "kingbase-mcp": { "command": "uv", "args": [ "--directory", "D:/code/kingbase-mcp", "run", "kingbase-mcp", "--access-mode", "restricted" ], "env": { "DATABASE_URI": "kingbase://system:Us&SmMNl%235H6@172.20.2.121:54321/mcp_demo", "ACCESS_MODE": "readonly" } } } }

image.png

⚠️ 关键点

  • --directory 必须指向 Windows 上克隆的实际路径,用正斜杠 /(如 D:/code/kingbase-mcp
  • DATABASE_URI 中密码的特殊字符必须 URL 编码(#%23
  • DB_HOST 填远程 KingbaseES 服务器 IP

保存配置后,重启 Trae CN。打开 MCP 面板,看到 kingbase-mcp 状态变为 绿色(已连接) 就成功了。

image.png

3.5 Trae CN 中测试对话

在 Trae CN 的 AI 对话窗口输入:

“mcp_demo 数据库里有哪些表?给我看看结构”

AI 通过 MCP 协议调用数据库工具,返回结果:

已查询 mcp_demo 数据库。

## 结论
public schema 下目前没有用户业务表,是空的。

若只看用户可创建的普通表(BASE TABLE,排除系统 schema),数据库里只有以下 4 张:

| Schema | 表名 |
|--------|------|
| mysql | help_topic |
| SYS_HM | CHECK_PARAM |
| SYS_HM | CHECK_TYPE |
| SYS_HM | HM_RUN_T |

## Schema 列表
anon, dbms_job, dbms_scheduler, information_schema, kdb_schedule, mysql, perf, public, src_restrict, sys, sys_catalog, SYS_HM, sysaudit, sysmac, xlog_record_read

image.png

如果 AI 正常返回了表列表,说明整套链路已经打通!

image.png

环境差异说明:MCP Server 运行在 IDE 所在的操作系统上。如果 IDE(如 Trae CN/Cursor)安装在 Windows,请使用 Windows 路径(如 D:/code/kingbase-mcp);如果 IDE 在 Linux 上,则用 /data/kingbase-mcp。本文操作环境为 Windows IDE + 远程 Linux 数据库,请根据实际情况调整路径。

3.6 用自然语言进行各种查询分析了:

示例查询 :最近 7 天订单金额排名前 5 的用户

“帮我查一下最近 7 天订单金额排名前 5 的用户,显示用户姓名、订单笔数、总金额。”

我来帮你查询最近7天订单金额排名前5的用户。首先回顾一下相关经验。

现在我来查询最近7天订单金额排名前5的用户:
          
## 查询结果:最近7天订单金额排名前5的用户

**时间范围**:2026-07-08 至 2026-07-14

| 排名 | 用户姓名 | 用户邮箱 | 订单笔数 | 总金额 |
|------|----------|----------|----------|--------|
| 1 | 卫志强 | user5_rzq0@163.com | 1 | ¥3,897.00 |
| 2 | 冯桂英 | user1_nj0y@outlook.com | 1 | ¥393.00 |
| 3 | 张雅婷 | user12_0hqq@126.com | 1 | ¥370.80 |
| 4 | 何雨萱 | user9_ddwi@outlook.com | 1 | ¥354.00 |
| 5 | 华芳 | user16_x34o@126.com | 1 | ¥291.00 |

image.png

AI 自动生成并执行 SQL,返回结果。


### 统计信息

| 指标 | 数值 |
|------|------|
| **上榜用户总数** | 5人 |
| **订单总笔数** | 5笔 |
| **订单总金额** | ¥5,305.80 |
| **平均订单金额** | ¥1,061.16 |

### 分析

- **第一名优势明显**:卫志强以 ¥3,897.00 的订单金额遥遥领先,占总金额的 **73.4%**
- **订单分布**:所有上榜用户均只有1笔订单,说明近期高金额订单较为分散
- **金额差距**:第1名与第2名之间差距较大(¥3,504),后四名金额较为接近

如需进一步分析(如查看用户具体订单详情或历史消费趋势),请告诉我!

image.png

3.7 慢查询诊断

我们模拟一条“慢查询”——对未建索引的字段做范围查询:

“帮我查一下 2026 年 7 月 1 日到 7 月 10 日期间,订单金额超过 1000 元的订单明细,包括用户、商品、金额信息,按金额降序排列。”

 我来帮你查询订单数据。首先回顾一下相关的经验,然后检查数据库中是否存在订单相关的表。
              
## 查询结果:2026年7月1日-7月10日 订单金额超过1000元的订单明细

共查询到 **5个订单**,以下是按金额降序排列的订单明细:

### 订单汇总

| 订单号 | 用户姓名 | 用户邮箱 | 订单金额 | 下单时间 | 订单状态 |
|--------|----------|----------|----------|----------|----------|
| ORD202607060005 | 沈欣怡 | user8_8i9i@163.com | ¥4,890.00 | 2026-07-07 05:27 | paid |
| ORD202607080004 | 卫志强 | user5_rzq0@163.com | ¥3,897.00 | 2026-07-09 01:59 | shipped |
| ORD202607020040 | 卫欣怡 | user17_qks5@qq.com | ¥2,862.00 | 2026-07-03 03:51 | completed |
| ORD202606300046 | 冯桂英 | user1_nj0y@outlook.com | ¥1,344.00 | 2026-07-01 07:09 | completed |
| ORD202607040043 | 冯佳怡 | user13_fwxw@126.com | ¥1,125.00 | 2026-07-04 18:07 | pending |

---

### 订单商品明细

**1. 订单 ORD202607060005(¥4,890.00)- 沈欣怡**

| 商品名称 | 商品分类 | 数量 | 单价 | 小计 |
|----------|----------|------|------|------|
| 27寸显示器 | 数码电子 | 3 | ¥1,299.00 | ¥3,897.00 |
| 无线蓝牙耳机 | 数码电子 | 3 | ¥299.00 | ¥897.00 |
| 桌面文件收纳架 | 图书文具 | 3 | ¥32.00 | ¥96.00 |

**2. 订单 ORD202607080004(¥3,897.00)- 卫志强**

| 商品名称 | 商品分类 | 数量 | 单价 | 小计 |
|----------|----------|------|------|------|
| 27寸显示器 | 数码电子 | 3 | ¥1,299.00 | ¥3,897.00 |

**3. 订单 ORD202607020040(¥2,862.00)- 卫欣怡**

| 商品名称 | 商品分类 | 数量 | 单价 | 小计 |
|----------|----------|------|------|------|
| 27寸显示器 | 数码电子 | 2 | ¥1,299.00 | ¥2,598.00 |
| 收纳整理箱 | 家居生活 | 2 | ¥45.00 | ¥90.00 |
| 特级初榨橄榄油 500ml | 食品饮料 | 3 | ¥58.00 | ¥174.00 |

**4. 订单 ORD202606300046(¥1,344.00)- 冯桂英**

| 商品名称 | 商品分类 | 数量 | 单价 | 小计 |
|----------|----------|------|------|------|
| 27寸显示器 | 数码电子 | 1 | ¥1,299.00 | ¥1,299.00 |
| 数据库系统概论 | 图书文具 | 1 | ¥45.00 | ¥45.00 |

**5. 订单 ORD202607040043(¥1,125.00)- 冯佳怡**

| 商品名称 | 商品分类 | 数量 | 单价 | 小计 |
|----------|----------|------|------|------|
| 无线蓝牙耳机 | 数码电子 | 3 | ¥299.00 | ¥897.00 |
| 混合坚果礼盒 | 食品饮料 | 2 | ¥88.00 | ¥176.00 |
| 纯牛奶 250ml×12 | 食品饮料 | 1 | ¥52.00 | ¥52.00 |

---

### 统计信息

- **订单总数**:5个
- **订单总金额**:¥14,118.00
- **商品种类**:涉及7种商品
- **涉及用户**:4位用户(沈欣怡、卫志强、卫欣怡、冯桂英、冯佳怡)

如需进一步分析或导出数据,请告诉我!

image.png

image.png

第二步:用户追问性能诊断(展示EXPLAIN能力)

我来帮你用EXPLAIN分析刚才的查询性能。首先回顾一下相关经验。

现在我来对刚才的查询进行EXPLAIN分析:
          
## 查询执行计划分析

### 执行计划详情


→ Sort (Cost: 22.53..22.55) [Rows: 8]
  → Nested Loop (Cost: 14.91..22.41) [Rows: 8]
    → Hash Join (Cost: 14.77..17.21) [Rows: 8]
      → Seq Scan (Cost: 0.00..1.99) on order_items [Rows: 99]
      → Hash (Cost: 14.71..14.71) [Rows: 4]
        → Hash Join (Cost: 2.92..14.71) [Rows: 4]
          → Seq Scan (Cost: 0.00..11.00) on users [Rows: 100]
          → Hash (Cost: 2.88..2.88) [Rows: 4]
            → Seq Scan (Cost: 0.00..2.88) on orders [Rows: 4]
              Filter: ((total_amount > '1000') AND (ordered_at >= '2026-07-01' AND ...))
    → Index Scan (Cost: 0.14..0.64) on products [Rows: 1]
### 性能分析

| 指标 | 结果 | 说明 |
|------|------|------|
| **总查询成本** | 22.53-22.55 | 较低 |
| **预计返回行数** | 8行 | 少量数据 |
| **实际执行时间** | 极短(毫秒级) | 数据量小 |
| **表扫描方式** | 全表扫描为主 | 需要优化 |

image.png

AI 会先用 EXPLAIN 分析执行计划,然后给出诊断:

🔍 慢查询诊断

### 总结

**当前性能**:由于数据量较小(orders约4行匹配,users约100行,order_items约99行),查询执行速度较快,实际体验良好。

**优化价值**:当数据量增长到万级或十万级时,上述全表扫描会成为性能瓶颈,建议提前创建索引:

1. `idx_orders_ordered_at_amount` - 加速日期范围和金额过滤
2. `idx_order_items_order_id` - 加速订单明细关联
3. `idx_order_items_product_id` - 加速商品关联

需要我帮你创建这些索引吗?

image.png

3.8 索引推荐

“根据上面的慢查询结果,给我一个索引优化方案。”

AI 给出具体的索引创建语句:

我来帮你用EXPLAIN分析刚才的查询性能。首先回顾一下相关经验。

潜在问题与优化建议

1. orders 表:全表扫描(Seq Scan)

问题:查询条件 ordered_at >= '2026-07-01' AND total_amount > 1000 未使用索引,导致全表扫描。

优化方案:创建复合索引

CREATE INDEX idx_orders_ordered_at_amount ON orders (ordered_at DESC, total_amount DESC);

2. order_items 表:全表扫描(Seq Scan)

问题order_items 表有99行数据,未使用索引进行JOIN操作。

优化方案:创建外键索引

CREATE INDEX idx_order_items_order_id ON order_items (order_id); CREATE INDEX idx_order_items_product_id ON order_items (product_id);

3. users 表:全表扫描(Seq Scan)

问题:users表有100行数据,虽数据量小,但JOIN操作未利用索引。

优化方案:确保主键索引存在(通常主键自动创建索引)

4. products 表:索引扫描(Index Scan)

状态:已使用索引,性能良好


优化前后对比

阶段 优化前 优化后
orders扫描 Seq Scan(全表) Index Scan(索引)
order_items扫描 Seq Scan(全表) Index Scan(索引)
users扫描 Seq Scan(全表) Index Scan(主键)
预估成本 22.53 预计降至5-10

image.png

总结


**当前性能**:由于数据量较小(orders约4行匹配,users约100行,order_items约99行),查询执行速度较快,实际体验良好。

**优化价值**:当数据量增长到万级或十万级时,上述全表扫描会成为性能瓶颈,建议提前创建索引:

1. `idx_orders_ordered_at_amount` - 加速日期范围和金额过滤
2. `idx_order_items_order_id` - 加速订单明细关联
3. `idx_order_items_product_id` - 加速商品关联

需要我帮你创建这些索引吗?

image.png

同时利用 KingbaseES 的 sys_hypo 虚拟索引扩展,模拟索引创建前后的性能对比。

3.9 Cursor 配置 MCP Server(零基础版)

成功跑通 Trae CN 后,我发现 Cursor 的 MCP 配置方式稍有不同。下面把从零开始的每一步都拆解清楚。

安装 Cursor:

image.png

  1. 访问 cursor.com
  2. 点击 “Download” 下载 Windows 安装包
  3. 双击安装,一路 Next 即可
  4. 安装完成后启动 Cursor

注意:Cursor 有免费版,足够体验 MCP 功能,无需付费。

找到 MCP 配置入口:

Cursor 的 MCP 配置通过配置文件管理:

操作系统 配置文件位置
Windows %APPDATA%\Cursor\User\globalStorage\mcp.json
macOS ~/Library/Application Support/Cursor/User/globalStorage/mcp.json
Linux ~/.config/Cursor/User/globalStorage/mcp.json

快速打开方法:

  1. 打开 Cursor
  2. Ctrl + Shift + P 打开命令面板
  3. 输入 MCP,选择 “MCP: Open MCP Config File”

image.png

如果没有该选项,手动去文件夹找:

# 在 Windows 资源管理器地址栏粘贴 %APPDATA%\Cursor\User\globalStorage\

image.png

编写 MCP 配置文件:

image.png

打开 mcp.json,粘贴以下内容:

{ "mcpServers": { "kingbase-mcp": { "command": "uv", "args": [ "--directory", "D:/code/kingbase-mcp", "run", "kingbase-mcp", "--access-mode", "restricted" ], "env": { "DATABASE_URI": "kingbase://system:Us&SmMNl%235H6@172.20.2.121:54321/mcp_demo", "ACCESS_MODE": "readonly" } } } }

image.png

保存文件后,完全关闭 Cursor(不是最小化),然后重新打开。

在 Cursor 对话窗口中测试:

  1. Ctrl + I 打开 Cursor 的 AI 对话窗口
  2. 确保对话模式选择 “Agent”(智能体模式)
  3. 输入:“mcp_demo 数据库里有哪些表?”

AI 通过 MCP 返回了数据库中 4 张系统表的结构详情:

列名 类型 可空 说明
help_topic_id int unsigned NO 主键
name bpchar NO 唯一
help_category_id smallint NO 分类 ID
description text NO 描述
example text NO 示例
url text NO 链接

image.png

image.png

四、功能体验:让 AI 做数据库搭档

上一节我们把 MCP Server 跑通了,但 mcp_demo 数据库里是空的——没有表、没有数据,AI 查了个寂寞。

这一节,我们来一场完整的“对话式数据库开发”:从 建表 → 造数据 → 查询分析 → 慢查询诊断 → 索引推荐,全程用自然语言指挥 AI 完成,不写一行手动 SQL

4.1 建表:让 AI 设计并创建业务表

在 Cursor/Trae CN 的 AI 对话窗口输入:

“帮我在 mcp_demo 的 public 模式下创建 4 张表:用户表、商品表、订单表、订单明细表。用户表要有 id、姓名、邮箱、注册时间;商品表要有 id、名称、分类、价格、库存;订单表要有 id、用户 id、订单号、总金额、下单时间、状态;订单明细表要有 id、订单 id、商品 id、数量、单价。给每个表加上主键、外键约束和合适的字段类型。”

AI 返回建表结果:

已在 mcp_demo.public 下创建 4 张表,结构如下。

## 表清单

| 表名 | 说明 |
|------|------|
| users | 用户表 |
| products | 商品表 |
| orders | 订单表 |
| order_items | 订单明细表 |

## 表结构

### 1. users(用户表)

| 字段 | 类型 | 约束 |
|------|------|------|
| id | BIGSERIAL | 主键 |
| name | VARCHAR(100) | NOT NULL |
| email | VARCHAR(255) | NOT NULL,唯一 |
| registered_at | TIMESTAMPTZ | NOT NULL,默认 NOW() |

### 2. products(商品表)

| 字段 | 类型 | 约束 |
|------|------|------|
| id | BIGSERIAL | 主键 |
| name | VARCHAR(200) | NOT NULL |
| category | VARCHAR(100) | NOT NULL |
| price | NUMERIC(12,2) | NOT NULL,>= 0 |
| stock | INTEGER | NOT NULL,默认 0,>= 0 |

### 3. orders(订单表)

| 字段 | 类型 | 约束 |
|------|------|------|
| id | BIGSERIAL | 主键 |
| user_id | BIGINT | NOT NULL,外键 → users(id) |
| order_no | VARCHAR(32) | NOT NULL,唯一 |
| total_amount | NUMERIC(14,2) | NOT NULL,>= 0 |
| ordered_at | TIMESTAMPTZ | NOT NULL,默认 NOW() |
| status | VARCHAR(20) | NOT NULL,默认 'pending' |

### 4. order_items(订单明细表)

| 字段 | 类型 | 约束 |
|------|------|------|
| id | BIGSERIAL | 主键 |
| order_id | BIGINT | NOT NULL,外键 → orders(id),级联删除 |
| product_id | BIGINT | NOT NULL,外键 → products(id) |
| quantity | INTEGER | NOT NULL,> 0 |
| unit_price | NUMERIC(12,2) | NOT NULL,>= 0 |
| — | — | 唯一约束 (order_id, product_id) |

image.png

AI 实际执行的建表 SQL:

-- 用户表 CREATE TABLE IF NOT EXISTS public.users ( id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, registered_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 商品表 CREATE TABLE IF NOT EXISTS public.products ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, category VARCHAR(50) NOT NULL, price DECIMAL(10,2) NOT NULL CHECK (price >= 0), stock INTEGER DEFAULT 0 CHECK (stock >= 0) ); -- 订单表 CREATE TABLE IF NOT EXISTS public.orders ( id SERIAL PRIMARY KEY, order_no VARCHAR(20) UNIQUE NOT NULL, user_id INTEGER NOT NULL REFERENCES users(id), total_amount DECIMAL(10,2) NOT NULL, status VARCHAR(20) DEFAULT 'PENDING', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 订单明细表 CREATE TABLE IF NOT EXISTS public.order_items ( id SERIAL PRIMARY KEY, order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE, product_id INTEGER NOT NULL REFERENCES products(id), quantity INTEGER NOT NULL CHECK (quantity > 0), unit_price DECIMAL(10,2) NOT NULL );

image.png

✅ 执行结果:AI 返回 “4 张表创建成功”。

4.2 造数据:批量生成测试数据

“给这 4 张表生成测试数据:用户 30 个(姓名中文、邮箱随机),商品 20 个(覆盖 3-4 个分类),订单 50 笔(分布在最近 30 天),每笔订单包含 1-3 个明细项。金额和数据要符合业务逻辑。”

image.png

AI 生成并执行批量插入:

测试数据已生成并写入 mcp_demo.public,汇总如下。

## 数据量

| 表 | 记录数 |
|----|--------|
| users | 30 |
| products | 20 |
| orders | 50 |
| order_items | 99 |

## 业务逻辑说明

用户(30 条)
- 姓名为中文(如:冯桂英、郑晓明、姜雨萱)
- 邮箱随机生成(163、qq、gmail 等域名)
- 注册时间分布在最近 60–365 天

商品(20 条,4 个分类,每类 5 个)

| 分类 | 数量 | 价格区间 |
|------|------|----------|
| 数码电子 | 5 | ¥129 – ¥1,299 |
| 家居生活 | 5 | ¥45 – ¥399 |
| 食品饮料 | 5 | ¥39.90 – ¥88 |
| 图书文具 | 5 | ¥15 – ¥59 |

订单(50 笔)
- 下单时间分布在最近 30 天内
- 每笔订单 1–3 个明细(17 笔 1 项、17 笔 2 项、16 笔 3 项)
- 订单号格式:ORD{日期}{序号},如 ORD202607120015
- 状态按下单时间加权:近期多为 pending/paid,较早多为 completed

金额一致性校验:0 条金额不一致

## 样例数据

用户:
| 姓名 | 邮箱 | 注册日期 |
|------|------|----------|
| 冯桂英 | user1_nj0y@outlook.com | 2025-09-13 |
| 郑晓明 | user2_z6e2@outlook.com | 2025-12-06 |
| 姜雨萱 | user4_tw5e@foxmail.com | 2026-01-14 |

最近订单:
| 用户 | 订单号 | 总金额 | 状态 | 明细数 |
|------|--------|--------|------|--------|
| 郑嘉豪 | ORD202607120015 | ¥136.00 | paid | 1 |
| 冯桂英 | ORD202607110002 | ¥393.00 | paid | 2 |
| 张雅婷 | ORD202607080021 | ¥370.80 | shipped | 3 |

订单状态分布:completed 21、paid 9、shipped 8、pending 6、cancelled 6

image.png

✅ 执行结果:30 位用户、20 件商品、50 笔订单、99 条明细,数据插入成功。

4.3 自然语言查询

有了数据之后,就可以用自然语言进行各种查询分析了:

示例查询 1:最近 7 天订单金额排名前 5 的用户

“帮我查一下最近 7 天订单金额排名前 5 的用户,显示用户姓名、订单笔数、总金额。”

AI 自动生成并执行 SQL,返回结果。

示例查询 2:热销商品统计

“查询‘电子产品’分类中,被购买次数最多的前 3 款商品,显示商品名、总销量、总销售额。”

AI 自动完成多表关联查询并返回统计结果。

4.4 慢查询诊断

我们模拟一条“慢查询”——对未建索引的字段做范围查询:

“帮我查一下 2026 年 7 月 1 日到 7 月 10 日期间,订单金额超过 1000 元的订单明细,包括用户、商品、金额信息,按金额降序排列。”

AI 会先用 EXPLAIN 分析执行计划,然后给出诊断:

🔍 慢查询诊断

问题orders 表的 ordered_at 字段没有索引,导致查询时对 50 条订单做了全表扫描(Seq Scan),过滤成本较高。

建议:在 orders(ordered_at) 上创建索引,预期查询速度提升约 70%。

4.5 索引推荐

“根据上面的慢查询结果,给我一个索引优化方案。”

AI 给出具体的索引创建语句:

-- 推荐索引 1:加速时间范围查询 CREATE INDEX idx_orders_ordered_at ON public.orders(ordered_at); -- 推荐索引 2:复合索引(时间 + 金额,覆盖更多查询场景) CREATE INDEX idx_orders_ordered_amount ON public.orders(ordered_at, total_amount);

同时利用 KingbaseES 的 sys_hypo 虚拟索引扩展,模拟索引创建前后的性能对比。

五、安全机制:让 AI “看得见”但“动不了”

数据库安全是绕不开的话题。金仓 MCP Server 设计了双重保险机制

第一重:只读白名单模式。通过 ACCESS_MODE=readonly 环境变量控制,AI 只能执行查询操作,无法修改数据或结构。

如果 AI 尝试执行 DELETEUPDATEDROP 等操作,会收到安全警告:

⚠️ 操作拦截

当前处于 readonly 模式,无法执行 DELETE 操作。如需执行数据修改,请在 MCP 配置中将 ACCESS_MODE 改为 readwrite,或确认操作后重新启动 Server。

第二重:操作二次确认机制。对于 DML 操作(如 UPDATEDELETE),即使设置为 readwrite,AI 首次调用时也不会执行,而是返回操作预览,等待用户明确确认(confirmed: true)后才真正执行:

🔐 操作确认

您将要执行的操作:DELETE FROM public.orders WHERE status = 'CANCELLED'

预计影响行数:3 行

请输入 confirmed: true 以继续执行,或取消操作。

这种 双重保险机制(只读白名单 + 二次确认)确保 AI 可以在安全边界内自由发挥——分析问题、给出建议,但不会擅自改动任何数据。

总结

通过这一系列的实操,我们完整走通了 MCP Server 的核心能力:

能力场景 实现方式
建表 自然语言描述需求 → AI 自动生成并执行 DDL
造数据 自然语言描述数据特征 → AI 批量生成并插入
自然语言查询 中文提问 → AI 自动生成精准 SQL
多表关联分析 复杂业务问题 → AI 自动 JOIN 多表并返回结果
慢查询诊断 自动分析执行计划,定位性能瓶颈
索引优化推荐 AI 给出具体索引建议 + 虚拟索引模拟验证
安全管控 只读模式 + 二次确认,AI 不越界

一句话总结:MCP Server 让 AI 真正成为了数据库的“操作员”和“优化师”——你只需要说“做什么”,剩下的交给 AI。

结语

AI Agent 浪潮下,数据库早已不再是单纯的数据存储容器,而是智能体的记忆中枢与决策底座。经过一周的折腾,我最大的感受是:MCP 协议让 AI“看见”了数据库,而金仓让 KingbaseES“接住”了 AI

以前我们说“AI 写 SQL”,更多是概念验证。但有了 MCP Server,AI 真的能实时感知数据库的真实状态——知道有哪些表、什么字段、什么索引、什么性能瓶颈。这不是“盲写”,这是 “有眼睛的写作”

对于开发者来说,这意味着:

  • 写 SQL 不用频繁切屏查表结构
  • 性能调优不用等 DBA,AI 就能给建议
  • 运维经验可以沉淀为 AI 能力,不再依赖个人经验。

当然,目前的体验还只是开始。MCP 协议本身仍在快速演进,金仓这套方案能做到什么程度,取决于生态的持续投入。但至少,方向是对的——国产数据库融入 AI 开发生态,金仓用 MCP Server 交出了第一份答卷。

本文所有操作均基于 KingbaseES V9R3、Windows 11 + Trae CN / Cursor,代码块可直接复制运行。遇到问题欢迎在评论区交流。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论