Oracle和MySQL性能MCP服务器🚀
基于人工智能的SQL性能分析,具有历史跟踪、多层安全、身份验证和多数据库支持
______________________________________________________________________
🎯 它做什么
此MCP服务器执行 无需执行查询即可进行深度SQL性能分析,支持两者 甲骨文 和 MySQL,更多的数据库即将推出。
主要特点:
- 🔍 智能SQL验证 -执行前阻止危险操作
- 📊 历史查询跟踪 -检测随时间推移的性能回归
- 🎨 可视化执行计划 -带有警告表情符号的ASCII树图
- 🤖 如果增长模拟 -大规模预测性能
- 🔐 多层安全 -针对危险SQL的三层防御
- 🔑 可选API身份验证 -用于安全部署的承载令牌身份验证
- 📈 实时性能监控 -数据库运行状况、热门查询和趋势
- 🐬 原生MySQL 8.0+分析 -具有performance_schema的完全MySQL支持
未来的数据库引擎(PostgreSQL、Snowflake、SQL Server)可以通过模块化架构轻松添加。
______________________________________________________________________
🗄️ 支持的数据库
Oracle数据库
- 版本:11克、12克、18克、19克、21克
- 特性:DBMS_XPLAN计划解析、分区诊断、假设分析、历史计划比较、ASCII可视化计划
MySQL
- 版本:5.7+、8.0+(推荐)
- 特性:EXPLAIN FORMAT=JSON,performance_schema索引使用,重复索引检测,历史跟踪
______________________________________________________________________
🤖 LLM如何选择合适的工具
LLM会根据以下因素自动选择正确的分析工具:
- 工具描述标签 -每个工具都清楚地说明
[ORACLE ONLY]或[MYSQL ONLY] - 数据库命名约定:
- 神谕: transformer_master, way4_docker7 - MySQL: mysql_devdb03_avi, mysql_production
- 用户上下文 -“分析此MySQL查询”等短语指导工具选择
- 错误处理 -如果需要,清除错误消息会重定向到正确的工具
______________________________________________________________________
🛠️ 可用工具
SQL分析工具
1. list_available_databases()
列出所有已配置的数据库终结点及其连接状态和版本信息。
退货:
- 数据库名称
- 连接状态(已连接/错误)
- 数据库版本
- 实例信息
______________________________________________________________________
2. analyze_full_sql_context(db_name, sql_text)
统一的Oracle+MySQL分析API
岩心分析
- ✅ 执行计划(Oracle DBMS_XPLAN/MySQLEXPLAIN JSON)
- ✅ 计划步骤、成本、基数
- ✅ 表元数据(行数、大小、上次分析)
- ✅ 索引元数据(列、基数、状态)
- ✅ 列统计(不同值、空值、直方图)
- ✅ 段大小(实际磁盘空间)
- ✅ 分区诊断(修剪检测)
- ✅ 优化参数
- ✅ 约束(PK、FK、唯一)
增强功能
- 🔐 SQL验证 -块INSERT、UPDATE、DELETE、DROP等。
- 📊 历史跟踪 -使用SQLite存储的MD5指纹识别
- 🎨 可视化执行计划 -带有表情符号警告的ASCII树
- 📈 数据增长趋势 -检测表大小随时间的变化
- ⚠️ 计划回归检测 -优化器更改策略时发出警报
______________________________________________________________________
3. compare_query_plans(db_name, original_sql, improved_sql)
Oracle和MySQL并行执行计划比较。
显示:
- 成本差异和百分比改进
- 访问方法更改(全扫描→ 索引扫描)
- 基数估计差异
- 方案结构比较
______________________________________________________________________
性能监控工具(Oracle)
4. get_database_health(db_name, time_range_minutes)
实时Oracle数据库运行状况监控。
退货:
- 整体健康评分(0-100)
- 系统指标:CPU使用率、活动会话、内存
- 缓存命中率(缓冲区缓存、库缓存、字典缓存)
- 等待时间最多的事件
- 健康状况:健康/警告/危急
例子:
get_database_health("transformer_master", 5)______________________________________________________________________
5. get_top_queries(db_name, metric, top_n, time_range_hours, exclude_sys, schema_filter, module_filter)
按性能指标检索顶级查询。
韵律学:
cpu_time-CPU消耗量最高elapsed_time-运行时间最长的查询buffer_gets-最合乎逻辑的阅读executions-最常执行
过滤:
exclude_sys=true-过滤掉系统/内部查询(默认)schema_filter-仅限于特定模式(例如“OWS”)module_filter-按应用程序模块筛选
退货:
- 带有查询模式的SQL文本
- 执行统计信息
- 资源使用情况(CPU、缓冲区获取、磁盘读取)
- 首次/最后一次出现的时间戳
______________________________________________________________________
6. get_performance_trends(db_name, metric, hours_back, interval_minutes)
JSON图表数据的历史性能趋势。
韵律学:
cpu_usage-CPU百分比随时间变化active_sessions-会话计数趋势wait_events-等待事件模式cache_hit_ratio-缓冲区缓存效率
退货:
- 时间序列数据点
- JSON图表数据(兼容chart.js)
- 趋势分析(增加/减少/稳定)
- 异常检测
例子:
get_performance_trends("way4_docker7", "cpu_usage", 24, 60)______________________________________________________________________
🐬 MySQL专用工具
analyze_mysql_query(db_name, sql_text)
MySQL查询性能综合分析:
- ✅ 解释格式=JSON解析
- ✅ 来自information_schema的表+索引元数据
- ✅ 来自performance_schema的索引使用统计信息
- ✅ 重复索引检测
- ✅ 历史查询跟踪(与Oracle共享)
compare_mysql_query_plans(db_name, original_sql, optimized_sql)
MySQL具体方案比较:
- 成本差异
- 访问方法改进
- 行估计减少
- 指标使用情况比较
______________________________________________________________________
🆕 此版本的新功能
性能监控(Oracle)
- ✅ 实时数据库健康监控(CPU、内存、会话、缓存)
- ✅ 带过滤的热门查询分析(排除系统查询,按模式/模块过滤)
- ✅ JSON图表数据的性能趋势(兼容chart.js)
- ✅ 具有30天保留期的历史快照
- ✅ 可配置的输出格式(标准/紧凑/最小)
API身份验证
- ✅ 可选的承载令牌身份验证
- ✅ 多个API密钥支持和客户端命名
- ✅ 每客户端请求日志记录
- ✅ 公共卫生检查终点
- ✅ 零性能开销
- ✅ 使用密钥生成器实用程序轻松设置
MySQL支持
- ✅ 完整解释格式=JSON解析
- ✅ 从performance_schema中了解索引使用情况
- ✅ 跨表的重复索引检测
- ✅ MySQL特定的优化(跳过扫描,覆盖索引)
增强型安全系统(3层)
- LLM级别警告 -工具说明包括突出的安全警报
- 工具级SQL验证 -在元数据收集之前对查询进行预验证
- 收集器级别验证 -使用25个以上被屏蔽的关键字进行深度验证
受阻操作:
- 插入、更新、删除、替换、合并、截断
- 创建、删除、更改、重命名
- 授予、撤销
- 提交、回滚、保存点
- 关机、终止、执行、调用
- INTO OUTFILE/DUMFILE(MySQL数据泄露)
- 锁定/解锁桌子
- 子查询深度>10级
- 查询长度>100KB
历史查询跟踪
- 归一化 -将文字转换为占位符(
WHERE id = 123→WHERE id = :N) - 指纹识别 -用于查询结构匹配的MD5哈希生成
- SQLite持久化 -本地存储在
server/data/query_history.db - 比较 -检测计划更改、成本增加和数据增长
可视化执行计划
- 具有层次结构的ASCII树结构
- 成本和基数显示
- 警告表情符号:
- ✅ 高效的索引访问 - ⚠️ 全表扫描、跳过扫描 - 🚨 笛卡尔连接、分割问题
智能MCP提示
oracle_full_analysis-综合性能分析oracle_index_analysis-指数策略建议oracle_partition_analysis-分区修剪诊断oracle_rewrite_query-SQL重写建议oracle_what_if_growth-增长预测和产能规划
______________________________________________________________________
⚠️ 安全通知——MCP不执行SQL
此工具100%安全:
- ✅ 仅使用元数据查询(information_schema、ALL\_\*视图)
- ✅ 仅使用EXPLAIN PLAN/EXPLAIN(模拟执行)
- ✅ 从不执行用户SQL
- ✅ 对DELETE/UPDATE语句安全(在分析之前将被阻止)
- ✅ 可以进行零数据修改
______________________________________________________________________
🔐 所需的Oracle权限
最低限度(核心功能)
GRANT SELECT ON ALL_TABLES TO ;
GRANT SELECT ON ALL_INDEXES TO ;
GRANT SELECT ON ALL_IND_COLUMNS TO ;
GRANT SELECT ON ALL_TAB_COL_STATISTICS TO ;
GRANT SELECT ON ALL_CONSTRAINTS TO ;
GRANT SELECT ON ALL_CONS_COLUMNS TO ;
GRANT SELECT ON ALL_PART_TABLES TO ;
GRANT SELECT ON ALL_PART_KEY_COLUMNS TO ;
GRANT SELECT ON PLAN_TABLE TO ;推荐(增强功能)
GRANT SELECT ON V$PARAMETER TO ;
GRANT SELECT ON DBA_SEGMENTS TO ;
-- OR
GRANT SELECT ON USER_SEGMENTS TO ;可选(运行时统计)
GRANT SELECT ON V$SQL TO ;______________________________________________________________________
🐬 所需MySQL权限
最低限度(核心功能)
GRANT SELECT ON information_schema.TABLES TO ''@'%';
GRANT SELECT ON information_schema.STATISTICS TO ''@'%';
GRANT SELECT ON information_schema.COLUMNS TO ''@'%';
GRANT SELECT ON .* TO ''@'%';推荐(增强功能)
GRANT SELECT ON performance_schema.table_io_waits_summary_by_index_usage TO ''@'%';
GRANT SELECT ON performance_schema.events_statements_summary_by_digest TO ''@'%';性能架构设置
-- Enable performance_schema (add to my.cnf and restart)
[mysqld]
performance_schema = ON
-- Check if enabled
SELECT @@performance_schema;
-- Enable table I/O monitoring
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE 'wait/io/table/%';
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME LIKE '%table%';______________________________________________________________________
⚙️ 配置
编辑 server/config/settings.yaml:
数据库连接
database_presets:
way4_docker7:
user: inform
password: your_password
dsn: hostname:1521/service_name
mysql_devdb03_avi:
host: devdb03.dev.bos.credorax.com
port: 3306
user: avi
password: your_password
database: avi分析特征
oracle_analysis:
output_preset: "compact" # standard | compact | minimal
metadata:
table_statistics:
enabled: true
optimizer:
parameters:
enabled: true
mysql_analysis:
output_preset: "compact"
features:
index_usage:
enabled: true
duplicate_detection:
enabled: true
performance_monitoring:
snapshots:
retention_days: 30 # Keep history for 30 days
output_preset: "compact"
chart_format: "json"身份验证(可选)
server:
authentication:
enabled: false # Set to true to enable API key authentication
api_keys:
- name: "claude_desktop"
key: "your-secure-api-key-here"
description: "Claude Desktop client"要启用身份验证,请执行以下操作:
- 生成API密钥:
python generate_api_key.py - 将密钥添加到
settings.yaml(套enabled: true) - 使用配置客户端
Authorization: Bearer头球 - 看 身份验证_GUIDE.md 详情
日志记录
logging:
level: INFO # DEBUG | INFO | WARNING | ERROR
show_tool_calls: true
show_sql_queries: false______________________________________________________________________
🚀 快速开始
1.配置数据库
编辑 server/config/settings.yaml 使用您的数据库凭据。
2.使用Docker运行
docker compose up --build服务器将:
- 从端口8300开始
- 自动创建
server/data/query_history.db - 启用热重新加载以进行开发
3.使用MCP检验员进行测试
List available databases然后分析一个查询:
Analyze this query on way4_docker7:
SELECT ms.contract_id, ms.ready_date
FROM ows.merchant_statement ms
WHERE ms.contract_id = 12313
AND ROWNUM 20 ORDER BY order_date LIMIT 10"
}
}答复包括:
- 解释格式=JSON计划
- 来自performance_schema的索引使用统计信息
- 重复索引检测结果
- 历史跟踪比较
- 未使用的索引警告
查询比较
{
"tool": "compare_query_plans",
"arguments": {
"db_name": "way4_docker7",
"original_sql": "SELECT * FROM ows.merchant_statement WHERE contract_id = 12313",
"improved_sql": "SELECT contract_id, ready_date FROM ows.merchant_statement WHERE contract_id = 12313 AND ROWNUM SYSDATE - 30
AND ROWNUM 20
AND status = 'pending'
ORDER BY order_date DESC
LIMIT 10;
Show me the execution plan and any performance issues.5.指标使用分析
Analyze this query and check which indexes are actually being used:
SELECT co.order_id, co.customer_id, co.amount, co.status
FROM avi.customer_order co
WHERE co.amount > 100
AND co.order_date > DATE_SUB(NOW(), INTERVAL 30 DAY)
ORDER BY co.status, co.order_date;
Include index usage statistics from performance_schema.6.重复索引检测
Check the customer_order table for any duplicate or redundant indexes.
Analyze query: SELECT * FROM avi.customer_order WHERE customer_id = 123
Tell me if there are unused indexes that could be dropped.7.MySQL安全测试
Try to analyze this MySQL query (should be blocked):
DELETE FROM avi.customer_order WHERE amount = 0;
Expected: Security validation blocks the query immediately with error message.性能监测测试
8.数据库健康检查
Check the current health status of transformer_master database.
Use get_database_health to see CPU usage, active sessions, cache hit ratios, and top wait events.9.顶级CPU查询
Show me the top 10 queries consuming the most CPU time on way4_docker7 in the last 4 hours.
Filter out system queries and focus on application queries.10.性能趋势
Show me the CPU usage trend for transformer_master over the last 24 hours with hourly intervals.
Include a chart visualization of the trend.______________________________________________________________________
📊 响应结构
{
"facts": {
"query_fingerprint": "MD5 hash of normalized query",
"historical_executions": "Number of previous runs",
"historical_context": "Human-readable comparison",
"visual_plan": "ASCII tree with emojis",
"execution_plan": "Traditional DBMS_XPLAN output",
"plan_details": [...],
"tables": [...],
"indexes": [...],
"columns": [...],
"constraints": [...],
"optimizer_params": {...},
"segment_sizes": {...},
"partition_diagnostics": {...}
}
}关键字段:
query_fingerprint-查询结构的唯一MD5哈希historical_executions-上次运行次数historical_context-性能比较、计划更改、数据增长visual_plan-带有表情符号警告的ASCII树plan_details-具有成本/基数的结构化计划步骤tables-行数、大小、分区信息indexes-指数统计、聚类因子、计划中的使用情况
______________________________________________________________________
🛡️ 安全功能
多层防御
- LLM意识 -工具说明包括安全警告
- 工具级别验证 -在元数据收集之前预验证SQL
- 收集器验证 -通过全面的关键字屏蔽进行深度验证
受阻操作
- 数据修改:插入、更新、删除、替换、合并、截断
- 架构更改:创建、删除、更改、重命名
- 权限:授予、撤销
- 系统运维:关闭、终止、执行、调用
- 数据渗漏:选择INTO(Oracle)、INTO OUTFILE/DUMFILE(MySQL)
- 表锁定:锁定、解锁表(MySQL)
DoS防御
- 最多10级子查询嵌套
- 查询长度限制:100KB
- 验证查询超时
可选API身份验证
- 承载令牌身份验证 -通过授权头验证API密钥
- 多客户端支持 -跟踪和管理多个API密钥
- 公共端点 -无需身份验证即可进行健康检查
- 零性能影响 -每个请求的开销\ 50000
-- Normalized SELECT * FROM EMPLOYEES WHERE DEPT_ID = :N AND SALARY > :N
1. **指纹识别** -生成规范化SQL的MD5哈希
1. **存储** -保存到SQLite(`server/data/query_history.db`)
CREATE TABLE query_history ( id INTEGER PRIMARY KEY, query_fingerprint TEXT NOT NULL, executed_at TIMESTAMP, plan_hash TEXT, total_cost INTEGER, num_tables INTEGER, tables_summary TEXT );
1. **比较** -检测变化:
- 计划哈希值已更改(优化器切换策略)
- 成本增加(性能回归)
- 行数已更改(数据增长)
### 益处
- **回归检测** -及早发现性能下降
- **计划稳定性** -跟踪优化器何时更改策略
- **数据增长监测** -查看表格大小趋势
- **基线比较** -与历史规范相比
______________________________________________________________________
## 🎨 可视化执行计划
### 示例
SELECT STATEMENT (Cost: 450) └─ COUNT (Cost: 450) └─ FILTER (Cost: 450) ├─ TABLE ACCESS BY INDEX ROWID: OWS.MERCHANT_STATEMENT (Cost: 450, Rows: 1,850) │ └─ INDEX RANGE SCAN: OWS.IDX_MS_CONTRACT ✅ (Cost: 5, Rows: 1,850) └─ FILTER (Cost: 5)
### 报警指示器
|表情符号|操作|含义|
|-------|-----------|---------|
| ✅ | 索引唯一扫描|完美-单行查找|
| ✅ | 索引范围扫描(低成本)|高效索引访问|
| ⚠️ | 表访问已满|警告-全表扫描|
| ⚠️ | 索引跳过扫描|警告-索引使用效率低|
| ⚠️ | 嵌套外观(高行)|警告-笛卡尔风险大|
| 🚨 | 笛卡尔式|批判性-笛卡尔式连接|
______________________________________________________________________
## 🔧 项目结构
server/ ├── config/ │ ├── settings.yaml # Database connections + configuration │ └── settings.template.yaml # Template for new installations ├── tools/ │ ├── oracle_analysis.py # Oracle MCP tools │ ├── oracle_collector_impl.py # Oracle data collection │ ├── mysql_analysis.py # MySQL MCP tools │ ├── mysql_collector_impl.py # MySQL data collection │ ├── database_tools.py # Database listing tool │ └── plan_visualizer.py # ASCII tree generator ├── prompts/ │ └── analysis_prompts.py # Smart MCP prompts ├── resources/ │ └── (optional resources) ├── data/ │ └── query_history.db # SQLite history (auto-created) ├── history_tracker.py # Query fingerprinting ├── db_connector.py # Oracle connector ├── mysql_connector.py # MySQL connector └── mcp_app.py # FastMCP application
______________________________________________________________________
## 🧪 测试检查表
- \[ \] **安全**:尝试更新/删除→ 应该被封锁
- \[ \] **验证**:尝试无效语法→ 应返回明确错误
- \[ \] **历史(首轮)**:新查询→ 显示“0次历史执行”
- \[ \] **历史(第二轮)**:相同的查询→ 显示比较
- \[ \] **可视化计划**:响应包括带有表情符号的ASCII树
- \[ \] **MySQL索引使用情况**:显示性能_模式统计信息
- \[ \] **重复检测**:标识冗余索引
- \[ \] **查询比较**:显示成本差异
______________________________________________________________________
## 🛠️ 故障排除
### Oracle问题
**“ORA-00942:表或视图不存在”**
- 检查用户是否对所需视图进行了选择
- 验证settings.yaml中的连接凭据
**缺少优化器参数**
- 用户需要在V$PARAMETER上选择
- 或通过禁用 `oracle_analysis.optimizer.parameters.enabled: false`
**分析速度慢**
- 尝试“紧凑型”输出预设
- 如果DBA_SEGMENTS速度较慢,则禁用segment_size
### MySQL问题
**“用户访问被拒绝”**
- 验证MySQL用户在information_schema上有SELECT
- 检查目标数据库访问权限
**缺少索引使用统计信息**
- 在my.cnf中启用performance_schema
- 检查setup_instruments和setup_consummer
**解释失败**
- 验证用户在目标表上具有SELECT
- 检查SQL中的语法错误
______________________________________________________________________
## 👤 作者
**阿维·科恩**\
电子邮件:aviciot@gmail.com\
github: [Aviciot/MetaQuery-MCP](https://github.com/aviciot/MetaQuery-MCP)
______________________________________________________________________
## 📜 许可证
MIT许可证-有关详细信息,请参阅许可证文件