AIOps(二):基于 MySQL MCP + WorkBuddy 构建 AI 数据库智能巡检

AIOps(二):基于 MySQL MCP + WorkBuddy 构建 AI 智能数据库巡检

在上一篇文章中,我们基于 Prometheus MCP + WorkBuddy 搭建了 Linux 主机智能巡检方案,实现了通过自然语言查询监控指标、分析运行状态并自动生成 HTML 巡检报告。

本篇将场景延伸至数据库运维,使用 Docker Compose 部署 MySQL 和 MySQL MCP Server,并接入 WorkBuddy,实现通过自然语言完成数据库资产盘点、健康诊断,并自动生成 HTML 可视化巡检报告。

MySQL 智能数据库巡检报告效果

通过 WorkBuddy 调用 MySQL MCP 工具获取真实数据库信息,经过分析后自动生成独立 HTML 巡检报告,包含数据库资产统计、数据量分布、运行状态、健康诊断及 DBA 优化建议等内容。

一、整体架构

组件 主要职责
MySQL 8.0 提供数据库、业务表、字段、索引及运行状态
MySQL MCP Server 将 MySQL 查询能力封装为 AI 可调用的 MCP 工具
WorkBuddy 理解自然语言、调用 MCP 工具、分析查询结果并生成 HTML
MySQL DBA 专家 根据数据库运维场景执行资产盘点、健康巡检和诊断

MCP(Model Context Protocol,模型上下文协议) :是 AI 应用连接外部工具的标准协议。

本方案分为两条链路:

查询链路:WorkBuddy → MySQL DBA 专家 → MySQL MCP Server → MySQL;

结果链路:MySQL 查询结果 → MCP 返回 → AI 分析 → HTML 巡检报告。

MySQL 与 MCP Server 运行在同一个 Docker 网络 mysql-net 中。MySQL 的 3306 端口不映射到宿主机,MCP 容器内部监听 3000,宿主机映射为 18080。

二、Docker Compose 部署:2 个容器

环境要求:一台已安装 Docker Engine 和 Docker Compose V2 的 Linux 云服务器,以及一台安装了 WorkBuddy 的电脑。本方案通过 Compose 同时部署 MySQL 8.0 和 MySQL MCP Server。

2.1 部署规划

项目 配置 说明
MySQL 服务名 mysql Docker 内网服务名,供 MCP 连接
MySQL 容器名 mysql-demo MySQL 8.0 容器
MySQL 端口 3306 仅 Docker 内网访问,不映射宿主机
MCP 服务名 mysql-mcp Docker Compose 服务名
MCP 容器名 mysql-mcp-server MCP 服务容器
MCP 容器端口 3000 容器内部监听端口
MCP 宿主机端口 18080 WorkBuddy 访问端口
目标数据库 aiops_demo 本次巡检数据库
数据库账号 readonly 只读账号

2.2 获取 MySQL MCP 源码

在 Linux 云服务器执行:

bash 复制代码
# 创建部署目录
mkdir -p /opt/mysql-mcp
cd /opt/mysql-mcp
​
# 拉取官方源码
git clone https://github.com/benborla/mcp-server-mysql.git

项目地址:benborla/mcp-server-mysql

官方仓库提供 Dockerfile,但本方案使用本地构建方式生成镜像 mysql-mcp-server:demo。

2.3 创建 .env 环境变量文件

在 /opt/mysql-mcp 目录下创建:

bash 复制代码
vi .env

填写以下三个值,密码和 Token 由部署者自行设置:

ini 复制代码
MYSQL_ROOT_PASSWORD=替换为自定义root密码
MYSQL_READONLY_PASSWORD=替换为自定义只读账号密码
MCP_REMOTE_SECRET_KEY=替换为自定义MCP访问Token

后续创建 readonly 账号时,使用 MYSQL_READONLY_PASSWORD 对应的值;WorkBuddy 配置 Bearer Token 时,使用 MCP_REMOTE_SECRET_KEY 对应的值。

2.4 创建 Docker Compose 文件

在 /opt/mysql-mcp 目录下创建 docker-compose.yml:

复制代码
vi docker-compose.yml

写入以下配置:

yaml 复制代码
services:
  mysql:
    image: docker.m.daocloud.io/library/mysql:8.0
    container_name: mysql-demo
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
      MYSQL_DATABASE: aiops_demo
    command:
      - --innodb-buffer-pool-size=128M
      - --max-connections=20
      - --performance-schema=OFF
      - --table-open-cache=200
    volumes:
      - mysql_data:/var/lib/mysql
    mem_limit: 512m
    cpus: 0.75
    networks:
      - mysql-net
    healthcheck:
      test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p"$$MYSQL_ROOT_PASSWORD" --silent"]
      interval: 10s
      timeout: 5s
      retries: 10
      start_period: 30s
​
  mysql-mcp:
    build:
      context: ./mcp-server-mysql
    image: mysql-mcp-server:demo
    container_name: mysql-mcp-server
    restart: unless-stopped
    depends_on:
      mysql:
        condition: service_healthy
    environment:
      MYSQL_HOST: mysql
      MYSQL_PORT: "3306"
      MYSQL_USER: readonly
      MYSQL_PASS: "${MYSQL_READONLY_PASSWORD}"
      MYSQL_DB: aiops_demo
​
      IS_REMOTE_MCP: "true"
      REMOTE_SECRET_KEY: "${MCP_REMOTE_SECRET_KEY}"
      PORT: "3000"
​
      ALLOW_INSERT_OPERATION: "false"
      ALLOW_UPDATE_OPERATION: "false"
      ALLOW_DELETE_OPERATION: "false"
      ALLOW_DDL_OPERATION: "false"
​
      MYSQL_POOL_SIZE: "2"
      MYSQL_QUERY_TIMEOUT: "30000"
      NODE_OPTIONS: "--max-old-space-size=160"
    ports:
      - "18080:3000"
    mem_limit: 256m
    cpus: 0.5
    networks:
      - mysql-net
​
networks:
  mysql-net:
    driver: bridge
​
volumes:
  mysql_data:

配置说明:

配置 说明
mysql MySQL 数据库服务,容器名为 mysql-demo
mysql-mcp MCP 服务,容器名为 mysql-mcp-server
MYSQL_HOST=mysql MCP 通过 Compose 服务名连接 MySQL
MYSQL_USER=readonly MCP 使用专用只读账号
MYSQL_PASS 从 .env 读取只读账号密码
MYSQL_DB=aiops_demo MCP 默认连接的业务数据库
ALLOW_*_OPERATION=false 关闭 INSERT、UPDATE、DELETE 和 DDL 操作
REMOTE_SECRET_KEY MCP Remote HTTP 模式使用的 Bearer Token
18080:3000 宿主机 18080 映射到 MCP 容器 3000
mysql-net 两个容器共用的 Docker bridge 网络
mysql_data 持久化 MySQL 数据目录

这里没有为 MySQL 配置宿主机端口映射,3306 只在 Docker 网络内提供服务。Compose 会读取当前目录的 .env;其中 MCP_REMOTE_SECRET_KEY 被映射为 MCP 服务要求的 REMOTE_SECRET_KEY。

2.5 启动 MySQL 并创建只读账号

先检查 Compose 配置:

arduino 复制代码
docker compose -f docker-compose.yml config -q

只启动 MySQL:

复制代码
docker compose -f docker-compose.yml up -d mysql

查看容器状态:

复制代码
docker compose -f docker-compose.yml ps

等待 mysql-demo 状态变为 Up (healthy)。

进入 MySQL:

bash 复制代码
docker exec -it mysql-demo mysql -uroot -p

输入 .env 中的 MYSQL_ROOT_PASSWORD,创建 MCP 专用只读账号:

sql 复制代码
CREATE USER IF NOT EXISTS 'readonly'@'%'
IDENTIFIED BY '替换为与.env 中 MYSQL_READONLY_PASSWORD 对应的密码';

GRANT SELECT ON aiops_demo.* TO 'readonly'@'%';

SHOW GRANTS FOR 'readonly'@'%';

确认授权结果中只有目标库的 SELECT 权限,不授予 INSERT、UPDATE、DELETE、CREATE、DROP、ALTER、FILE、PROCESS 等权限。

退出 MySQL:

bash 复制代码
exit;

如果 aiops_demo 中尚无业务表,后续巡检会如实报告空库;不会使用模拟表结构或虚构数据填充报告。

2.6 构建并启动 MySQL MCP Server

执行:

css 复制代码
docker compose -f docker-compose.yml up -d --build mysql-mcp

查看两个容器:

复制代码
docker compose -f docker-compose.yml ps

正常情况下:

  • mysql-demo:Up (healthy),仅显示容器内部的 3306/tcp。
  • mysql-mcp-server:Up,显示宿主机 18080 映射到容器 3000。

查看 MCP 日志:

bash 复制代码
docker logs --tail 100 mysql-mcp-server

正常启动时可以看到:

vbscript 复制代码
MCP Stateless Streamable HTTP Server listening on port 3000

检查端口映射:

perl 复制代码
docker inspect mysql-mcp-server --format '{{json .NetworkSettings.Ports}}'

确认 3000/tcp 对应宿主机端口 18080。

检查关键环境变量是否已注入 MCP 容器:

perl 复制代码
docker inspect mysql-mcp-server --format '{{range .Config.Env}}{{println .}}{{end}}' | grep -E '^(MYSQL_HOST|MYSQL_PORT|MYSQL_USER|MYSQL_DB|IS_REMOTE_MCP|PORT)='

预期能看到 MYSQL_HOST=mysql、MYSQL_PORT=3306、MYSQL_DB=aiops_demo、IS_REMOTE_MCP=true、PORT=3000 等配置。

安全组配置: 云服务器仅放行 TCP 18080,并将来源限制为 WorkBuddy 客户端可信出口 IP;不要开放 MySQL 的 3306 公网访问。

至此,MySQL 和 MySQL MCP Server 两个容器部署完成。

三、WorkBuddy 接入 MySQL MCP

在 WorkBuddy 中进入:

专家·技能·连接器 → 连接器 → 自定义连接器 → 添加 MCP

点击「添加 MCP」:

填写配置:

json 复制代码
{
  "mcpServers": {
    "mysql-mcp": {
      "type": "streamableHttp",
      "url": "http://<云服务器公网IP>:18080/mcp",
      "headers": {
        "Authorization": "Bearer <MCP_REMOTE_SECRET_KEY>"
      }
    }
  }
}

配置说明:

配置项 说明
type 使用 streamableHttp
url 云服务器公网 IP + 宿主机端口 18080 + /mcp
Authorization Bearer Token,值与 .env 中的 MCP_REMOTE_SECRET_KEY 完全一致

这里填写的是运行 Docker Compose 的云服务器公网 IP ,不是 MySQL 容器 IP。宿主机 18080 已映射到 MCP 容器 3000,因此 WorkBuddy 访问 公网IP:18080/mcp 即可。

保存配置,返回 MCP 列表,点击信任并启用。

本次连接成功后,WorkBuddy 中可以看到:

  • 工具: mysql_query,用于执行 MySQL 查询。
  • 资源: Tables,用于读取当前连接数据库的表结构信息。

四、创建 MySQL DBA 专家

进入:

专家·技能·连接器 → 专家 → 我的专家 → 创建专家

创建一个 MySQL DBA 专家,关联刚刚接入的 mysql-mcp 工具。

以下是专家提示词,可直接复制:

markdown 复制代码
你是一名专业的 MySQL DBA 运维专家,负责通过自然语言帮助用户安全查询、分析和诊断 MySQL 数据库。

【核心要求】

1. 准确理解用户意图,生成规范的只读 SQL,并主动调用 mysql_query 工具获取真实数据。
2. 只允许执行 SELECT、SHOW、DESCRIBE,以及针对 SELECT 的 EXPLAIN。
3. 禁止执行 INSERT、UPDATE、DELETE、DROP、ALTER、CREATE、TRUNCATE 等任何写入或结构修改操作。
4. 禁止执行 EXPLAIN ANALYZE,避免实际执行被分析的 SQL。
5. 所有分析必须基于 MCP 工具返回的真实查询结果,不得编造数据或结论。
6. 每次工具调用只执行一条 SQL;查询失败或权限不足时,明确说明原因。
7. 默认只查询必要字段,不随意读取业务表中的敏感数据。
8. InnoDB 的 TABLE_ROWS 是估算值,必须与 COUNT(*) 实际统计结果区分。
9. 大表不得随意执行全表 COUNT(*);只有确认数据量较小后才进行精确统计。
10. 不得为了完成巡检要求用户扩大数据库权限。

【支持场景】

- 数据库及数据表资产盘点
- 表结构、字段类型、主键及索引分析
- 数据量和存储空间统计
- 数据库基础运行状态分析
- 慢查询及性能指标分析(以实际权限和可获取数据为准)
- 数据库异常排查
- 日常数据库巡检

【分析要求】

1. 优先使用 information_schema 查询表、字段、索引和存储信息。
2. 分析索引时区分索引结构事实与索引使用情况;没有性能统计证据时,不得断言索引未使用。
3. 如果 performance_schema、慢查询日志或实例级指标无法读取,明确标记未获取及原因。
4. 每项风险必须包含查询证据、问题原因、潜在影响和建议处理方式。
5. 区分高风险、中风险、低风险和正常项。
6. 不得仅凭单一指标认定数据库故障。

【HTML 报告】

巡检完成后,必须实际生成:

mysql-aiops-inspection-report.html

报告采用专业深色数据库运维大屏风格,参考 Grafana,至少包含:

1. 顶部信息栏:MySQL 版本、目标数据库、巡检时间、巡检状态。
2. KPI 卡片:可见数据库数量、数据表数量、记录数、数据空间、索引空间、问题数量。
3. 数据库资产概览:数据库名称、表数量和存储空间。
4. 数据表明细:表名称、存储引擎、记录数、数据大小、索引大小、主键情况。
5. 数据量和存储空间分布图。
6. 数据库健康诊断:高、中、低风险及正常项。
7. DBA 优化建议:按优先级展示,优化 SQL 只展示、不执行。
8. 巡检总结:根据真实查询结果生成。

【HTML 设计要求】

1. 使用独立 HTML + CSS + JavaScript。
2. 图表使用内嵌 SVG 或原生 JavaScript,不依赖外部 CDN。
3. 支持浏览器直接打开、打印及另存为 PDF。
4. 不允许出现文字重叠、图表错位和内容溢出。
5. HTML 是本次巡检的静态快照,不得描述为实时监控。
6. 文件生成后提供实际文件入口,不得只输出 Markdown 或 HTML 代码片段。

【执行约束】

所有数据库指标必须来自 mysql_query 的真实返回结果。
不允许输出数据库密码、MCP Token 或其他敏感凭据。
不允许执行任何写入、删除或结构修改操作。
无法获取的数据明确标注未获取,不得使用模拟数据补齐。

保持专业、简洁,分步骤调用工具深入分析。

保存专家,返回「我的专家」,找到刚创建的 MySQL DBA 专家,点击召唤。

五、发起巡检并生成 HTML 报告

在 WorkBuddy 新建任务,选择刚创建的 MySQL DBA 专家。可以先用自然语言确认数据库和数据表情况:

向 MySQL DBA 专家发送以下完整巡检指令:

diff 复制代码
请通过已经连接的 mysql-mcp 工具,对当前 MySQL 实例执行一次完整的数据库资产盘点与基础健康分析,并最终生成独立 HTML 巡检报告。

一、实例基本信息

1. 查询 MySQL 版本、当前连接数据库、当前账号、实例主机名和端口。
2. 查询当前账号能够访问的数据库列表。
3. 查询必要的实例运行状态和配置;没有权限读取的指标明确标注。

二、数据库资产盘点

针对 aiops_demo:

1. 查询所有数据表。
2. 统计数据表数量。
3. 获取每张表的存储引擎。
4. 获取每张表的记录数。
5. 获取每张表的数据大小和索引大小。
6. 识别空表和数据量较大的表。

注意:
- InnoDB 的 TABLE_ROWS 是估算值,必须明确标注。
- 对小表可以使用 COUNT(*) 获取实际记录数。
- 对大表不要执行可能造成明显负载的全表统计。
- 数据空间和索引空间按 information_schema 返回值统计,并注明单位和估算口径。

三、数据表结构分析

1. 获取字段名称、数据类型、是否允许为空。
2. 检查主键、普通索引和联合索引。
3. 识别没有主键的表。
4. 分析可能存在的字段设计问题。
5. 分析潜在缺失或冗余索引。

四、数据库健康分析

1. 分析数据库和数据表的存储空间。
2. 分析各表数据量分布。
3. 分析索引数量及分布。
4. 检查空表、异常表和潜在结构问题。
5. 将问题划分为高风险、中风险、低风险和正常项。
6. 每项问题说明查询证据、原因、潜在影响和处理建议。

五、生成 HTML 巡检报告

实际生成 mysql-aiops-inspection-report.html。

报告要求:

1. 深色专业数据库运维大屏风格,参考 Grafana。
2. 顶部展示 MySQL 版本、数据库名称、巡检时间和状态。
3. KPI 卡片展示可见数据库数量、表数量、记录数、数据空间、索引空间和问题数量。
4. 使用表格展示数据库资产、数据表、字段和索引。
5. 使用图表展示数据量和存储空间分布。
6. 使用风险标签展示高、中、低风险和正常项。
7. 给出按优先级排序的 DBA 优化建议。
8. 最后生成基于真实数据的巡检总结。

HTML 使用独立 CSS 和 JavaScript,图表采用内嵌 SVG 或原生 JavaScript,不依赖外部 CDN;支持浏览器直接打开和打印 PDF。

所有数据必须通过 mysql_query 实际查询获取,不得编造或补填。
如果 aiops_demo 没有数据表,明确标注空库,并说明表结构、主键和索引分析无法覆盖,不要用系统库对象冒充业务表。
如果某项指标因权限不足无法获取,说明具体原因,不要要求自动扩大权限。
优化 SQL 只作为建议展示,不实际执行。

巡检报告内容

最终 HTML 报告包含以下模块:

模块 展示内容
核心指标概览 MySQL 版本、数据库数量、表数量、记录数和存储空间
数据库资产 数据库、数据表、存储引擎和容量明细
结构与索引 字段、主键、普通索引、联合索引
数据分布 各表记录数、数据空间和索引空间图表
健康诊断 风险等级、查询证据和问题说明
DBA 建议 优化优先级、处理方式及建议 SQL
巡检总结 基于本次真实查询结果生成的整体评价

本次示例巡检中,账号可见 3 个数据库、87 个对象,其中 aiops_demo 业务库为 0 张表,information_schema 和 performance_schema 中的系统对象不能算作业务表。报告中的实例可见对象总数与目标业务库资产数量采用不同统计口径,阅读时需要区分。截图中的风险统计为 1 项高风险、3 项中风险、3 项低风险,属于本次环境的巡检快照,不代表其他实例的固定结果。

报告总览: 展示 MySQL 版本、目标数据库、巡检时间、核心 KPI 和本次发现的问题数量。

数据资产与分布: 展示可见数据库、表记录数估算、对象数量分布、连接数及 InnoDB 缓冲池等运行快照。

健康诊断: 按高风险、中风险、低风险和正常项展示问题证据、影响及建议。

DBA 优化建议: 按优先级给出检查方向、建议 SQL 和验证方法;报告中的 SQL 仅供 DBA 审核,不会自动执行。

巡检总结与证据: 展示本次巡检结论、已覆盖范围、未获取项及关键 SQL 查询证据。


总结: 两个 Docker 容器通过 mysql-net 通信,MySQL 只开放 Docker 内网 3306,MCP 通过宿主机 18080 提供带 Bearer Token 认证的 Streamable HTTP 接口。WorkBuddy 调用 mysql_query 获取真实数据,再由 MySQL DBA 专家完成分析并生成 HTML 巡检报告。

参考: MySQL MCP Server · 配置文档 · 部署文档 · Docker Compose

标签: AIOps、MySQL、MCP、WorkBuddy、Docker、智能运维

相关推荐
五点六六六9 天前
Memory 系统如何从 0 到 1 构建(企业级入门版
agent·领域驱动设计·aiops
JasonPan17 天前
AIOps(一):基于 Prometheus MCP + WorkBuddy 构建 AI 智能运维
aiops
dawnsky.liu18 天前
在 RHEL 中使用 goose 实现主机运维
linux·运维·aiops
小猿姐1 个月前
KubeBlocks Enterprise v2.3 发布!
redis·kubernetes·aiops
DevOps老兵1 个月前
AIOps实战15:运维Agent与Copilot,怎么让AI安全地动手干活
copilot·aiops·安全护栏·运维agent·k8schat
DevOps老兵1 个月前
AIOps实战06:核心功能的需求描述(下),高阶模块与非功能需求
aiops·根因分析·老计聊技术·需求描述·非功能需求
DevOps老兵1 个月前
AIOps实战07:AIOps的地基是数据,可观测三支柱怎么喂给AI
aiops·数据·可观测性·老计聊技术·指标日志链路
DevOps老兵1 个月前
AIOps实战05:核心功能的需求描述(上),把AIOps需求写规范
aiops·产品设计·告警降噪·老计聊技术·需求描述
DevOps老兵1 个月前
AIOps实战04:一款AIOps平台该具备哪些功能,一份产品视角的功能全景
aiops·产品设计·智能运维·老计聊技术·功能需求