AI自然语言管理MySQL之Dify+MCP
一、认识自然语言管理数据库
1.1 从SQL到自然语言
使用 SQL 管理 cnblogs_y1018 数据库。部署 Dify 和 MySQL MCP,再用自然语言操作同一张 students 表。
查询北京有哪些学员

数据仍然保存在MySQL中。Dify负责理解问题,MCP负责连接数据库。
1.2 认识MCP、Agent和Dify
- MCP:把数据库等外部能力提供给Agent。
- Agent:会根据任务选择工具的AI助手。
- Dify:创建和运行AI应用的平台。

MySQL MCP 提供三个工具:
| 工具 | 用途 |
|---|---|
| get_schema_info | 查看数据库、数据表和字段 |
| get_table_sample | 查看表中的少量示例数据 |
| execute_sql | 执行查询、添加、修改和删除 |

二、准备实验环境
2.1 准备两台机器
| 系统 | 主机 | IP地址 | 用途 |
|---|---|---|---|
| Ubuntu | 数据库 | 192.168.31.222 | cnblogs_y1018 数据库 |
| Rocky | AI机 | 192.168.31.225 | 运行 Docker、Dify 和 MySQL MCP |
2.2 在AI机上安装Docekr CE
连接AI机192.168.31.225操作如下步骤:
三、部署Dify
3.1 认识Docker Compose
Dify由多个容器共同组成,如果逐个输入命令,操作会比较多。Docker Compose读取一个配置文件,一次启动或停止一组容器

命令详解:
docker compose up -d
docker compose ps
docker compose down
- up -d 在后台启动整个容器
- ps 查看整个容器的运行状态
- down 停止并删除整个容器
3.2 获取Dify项目软件
上传软件dify-1.17.1.tar.gz到AI机
tar zxvf dify-1.17.1.tar.gz -C /opt/
cd /opt/dify/docker
3.3 准备配置文件
cp .env.example .env
允许Dify访问实验网段中的MCP服务:
sed -i 's/^SSRF_PROXY_ALLOW_PRIVATE_IPS=.*/SSRF_PROXY_ALLOW_PRIVATE_IPS=192.168.31.0\/24/' .env
- SSRF_PROXY_ALLOW_PRIVATE_IPS: 允许Dify访问
192.168.31.0/24网段
3.4 上传并导入Dify镜像
上传软件dify-all-images-1.17.1.tar到AI机
导入Dify镜像:
[root@AIDify ~]# docker load -i dify-all-images-1.17.1.tar
Loaded image: langgenius/dify-api:1.17.1
Loaded image: langgenius/dify-web:1.17.1
Loaded image: redis:6-alpine
Loaded image: langgenius/dify-sandbox:0.2.15
Loaded image: langgenius/dify-agent-local-sandbox:1.17.1
Loaded image: nginx:latest
Loaded image: langgenius/dify-api:1.17.1
Loaded image: langgenius/dify-api:1.17.1
Loaded image: ubuntu/squid:latest
Loaded image: ubuntu/squid:latest
Loaded image: busybox:latest
Loaded image: langgenius/dify-plugin-daemon:0.6.10-local
Loaded image: cr.weaviate.io/semitechnologies/weaviate:1.39.2
Loaded image: langgenius/dify-agent-backend:1.17.1
Loaded image: langgenius/dify-api:1.17.1
Loaded image: postgres:15-alpine
[root@AIDify ~]#
3.5 启动Dify
[root@AIDify ~]# cd /opt/dify/docker/
[root@AIDify docker]# docker compose up -d
[+] up 22/22
✔ Network docker_agent_sandbox_network Created 0.2s
✔ Network docker_default Created 0.1s
✔ Network docker_local_sandbox_proxy_network Created 0.3s
✔ Network docker_ssrf_proxy_network Created 0.2s
✔ Volume docker_dify_agent_local_sandbox_home Created 0.0s
✔ Volume docker_dify_agent_local_sandbox_workspace Created 0.0s
✔ Container docker-init_permissions-1 Exited 5.7s
✔ Container docker-weaviate-1 Started 1.2s
✔ Container docker-db_postgres-1 Healthy 5.7s
✔ Container docker-redis-1 Started 1.5s
✔ Container docker-web-1 Started 1.7s
✔ Container docker-sandbox-1 Started 0.5s
✔ Container docker-ssrf_proxy-1 Started 0.9s
✔ Container docker-api_websocket-1 Started 4.1s
✔ Container docker-worker_beat-1 Started 4.4s
✔ Container docker-plugin_daemon-1 Started 4.7s
✔ Container docker-agent_backend-1 Started 5.0s
✔ Container docker-agent_ssrf_proxy-1 Started 2.5s
✔ Container docker-local_sandbox-1 Started 1.9s
✔ Container docker-worker-1 Started 5.7s
✔ Container docker-api-1 Started 6.0s
✔ Container docker-nginx-1 Started 6.5s
[root@AIDify docker]#
查看运行状态:
[root@AIDify docker]# docker compose ps
3.6 访问Dify
浏览器输入:http://192.168.31.225
首次打开设置管理员账户,进入Dify主页



3.7 配置大模型
点击 集成 -> 模型供应商 搜索deepseek安装


安装完成后,填写API Key并保存


如果安装失败,直接访问官网DeepSeek插件下载

本地安装插件 langgenius-deepseek_0.0.26.difypkg

四、部署并连接MySQL MCP
4.1 在数据库上准备MCP账号
连接数据库192.168.31.222操作步骤如下:
打开MySQL配置文件
root@mysql:~# vim /etc/mysql/mysql.conf.d/mysqld.cnf
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 0.0.0.0
skip-name-resolve
mysqlx-bind-address = 127.0.0.1
bind-address:允许AI机连接MySQL
skip-name-resolve:连接时不解析主机名,速度快
mysqlx-bind-address:X Protocol(33060)只监听本机
重启MySQL并检查配置:
root@mysql:~# systemctl restart mysql
root@mysql:~# systemctl is-active mysql
active
root@mysql:~# mysql -e "SHOW VARIABLES LIKE 'skip_name_resolve';"
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| skip_name_resolve | ON |
+-------------------+-------+
root@mysql:~# ss -lntp | grep 3306
LISTEN 0 70 127.0.0.1:33060 0.0.0.0:* users:(("mysqld",pid=3187,fd=21))
LISTEN 0 151 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=3187,fd=23))
root@mysql:~#
查看服务状态为active/skip_name_resolve为ON,出现0.0.0.0:3306,说明MySQL可以接受网络连接。AI机连接地址:192.168.31.222:3306
查看防火墙ufw status已启动,只允许AI机访问MySQL:
ufw allow from 192.168.31.225 to any port 3306 proto tcp
# 如果本地Windows要连接可修改为192.168.31.0/24
创建只允许AI机连接的专用账号:
CREATE USER IF NOT EXISTS 'mcp_rw'@'192.168.31.225'
IDENTIFIED BY 'YangQing@123';
GRANT SELECT, INSERT, UPDATE, DELETE
ON cnblogs_y1018.*
TO 'mcp_rw'@'192.168.31.225';
SHOW GRANTS FOR 'mcp_rw'@'192.168.31.225';
EXIT;
这个账号只能操作 cnblogs_y1018 数据库中的数据
导入示例数据
mysql -u root -p < cnblogs_y1018.sql
4.2 在AI机部署 MySQL MCP
连接AI机 192.168.31.225 操作步骤如下:
4.2.1 创建运行环境
[root@AIDify ~]# yum -y install python3 python3-pip
[root@AIDify ~]# mkdir /opt/mysql-mcp
[root@AIDify ~]# cd /opt/mysql-mcp/
[root@AIDify mysql-mcp]# python3 -m venv venv
[root@AIDify mysql-mcp]# source venv/bin/activate
((venv) ) [root@AIDify mysql-mcp]# pip install mysql-mcp-server
4.2.2 写入连接配置
cat > /opt/mysql-mcp/.env <<'EOF'
MYSQL_HOST=192.168.31.222
MYSQL_PORT=3306
MYSQL_USER=mcp_rw
MYSQL_PASSWORD=YangQing@123
MYSQL_READ_QUERY_LIMIT=50
MCP_TRANSPORT=sse
MCP_SSE_HOST=0.0.0.0
MCP_SSE_PORT=8081
MCP_SSE_ALLOWED_HOSTS=192.168.31.225:*,127.0.0.1:*,localhost:*
EOF
4.2.3 启动 MySQL MCP
创建 systemd 服务文件
cat > /etc/systemd/system/mysql-mcp.service <<'EOF'
[Unit]
Description=MySQL MCP Server (SSE)
After=network.target mysql.service
Wants=network.target
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/opt/mysql-mcp
EnvironmentFile=/opt/mysql-mcp/.env
ExecStart=/opt/mysql-mcp/venv/bin/python -m mysql_mcp_server.server
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
重载并设置开机自启
[root@AIDify mysql-mcp]# systemctl daemon-reload
[root@AIDify mysql-mcp]# systemctl enable --now mysql-mcp.service
查看状态
[root@AIDify mysql-mcp]# systemctl status mysql-mcp.service
● mysql-mcp.service - MySQL MCP Server (SSE)
Loaded: loaded (/etc/systemd/system/mysql-mcp.service; enabled; preset: disabled)
Active: active (running) since Thu 2026-10-29 23:23:41 CST; 1min 53s ago
Invocation: 0d643f93ea5f432b973a916e3a485e86
Main PID: 216031 (python)
Tasks: 1 (limit: 22786)
Memory: 39.2M (peak: 39.4M)
CPU: 640ms
CGroup: /system.slice/mysql-mcp.service
└─216031 /opt/mysql-mcp/venv/bin/python -m mysql_mcp_server.server
10月 29 23:23:41 AIDify systemd[1]: Started mysql-mcp.service - MySQL MCP Server (SSE).
10月 29 23:23:41 AIDify python[216031]: <frozen runpy>:128: RuntimeWarning: 'mysql_mcp_server.server' found in sys.modules after import of package 'mysql_mcp_server', but prior to execution o>
10月 29 23:23:41 AIDify python[216031]: 2026-10-29 23:23:41,789 - mysql_mcp_server - INFO - Starting MySQL MCP server (SSE)...
10月 29 23:23:41 AIDify python[216031]: 2026-10-29 23:23:41,789 - mysql_mcp_server - INFO - SSE DNS rebinding protection enabled. Allowed hosts: 192.168.31.225:*, 127.0.0.1:*, localhost:*. Ov>
10月 29 23:23:41 AIDify python[216031]: INFO: Started server process [216031]
10月 29 23:23:41 AIDify python[216031]: INFO: Waiting for application startup.
10月 29 23:23:41 AIDify python[216031]: INFO: Application startup complete.
10月 29 23:23:41 AIDify python[216031]: INFO: Uvicorn running on http://0.0.0.0:8081 (Press CTRL+C to quit)
[root@AIDify mysql-mcp]# ss -lntp | grep 8081
LISTEN 0 2048 0.0.0.0:8081 0.0.0.0:* users:(("python",pid=216031,fd=6))
[root@AIDify mysql-mcp]#
4.3 在Dify中连接MySQL MCP
Dify主页,进入工具下MCP页面,添加HTTP MCP服务:
| 项目 | 填写内容 |
|---|---|
| 名称 | mysql-mcp-server |
| 服务地址 | http://192.168.31.225:8081/sse |
保存后看到三个工具:execute_sql get_schema_info get_table_sample



五、创建 Y1018 数据库助手
在 Dify 中创建一个 Agent 应用。


选择已配置的大模型,添加msyql-mcp-server三个工具,提示词填写:
你是 Y1018 数据库助手,负责操作 cnblogs_y1018 数据库。
回答数据库问题时,必须调用 MySQL MCP 工具读取真实数据。
查询可以直接执行,查询结果最多显示 50 条。
添加、修改和删除前,先说明准备执行的操作,等待用户确认。
拒绝执行 DROP、TRUNCATE,以及没有 WHERE 条件的 DELETE。
工具执行后,用简短中文说明结果,不编造数据。
确认无误后,发布更新


访问Agent


六、用自然语言操作数据库
6.1 查询数据
查询全部学员
北京有哪些学员?
查询小超的学习状态
6.2 添加数据
添加学员小红,城市北京,状态学习中
Dify说明准备执行的操作后,再输入:
确认添加
6.3 修改数据
把小红的学习状态改成已完成
确认内容无误后输入:
确认修改
6.4 删除数据
删除学员小红
Dify询问时输入:
确认删除










七、总结
7.1 查看背后的执行过程
查询北京学员的执行过程:
- 输入自然语言:查询北京有哪些学员
- Agent选择execute_sql,并生产只读查询
- MySQL MCP执行SQL,返回符合条件的数据
- Agent整理结果:北京的学员有沙雪、张圆圆、甄晓、雷圆圆、许溢
一次完成操作包含的过程:
- 在Dify输入自然语言
- Agent选择MySQL MCP工具
- MySQL MCP在数据库机上执行SQL
- Dify把结果整理成中文回答
7.2 查询数据库核对结果
在数据库192.168.31.222执行:
root@mysql:~# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 45
Server version: 8.0.46-0ubuntu0.24.04.4 (Ubuntu)
Copyright (c) 2000, 2026, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SELECT * FROM cnblogs_y1018.students;
略
| 98 | 冯丞琳 | 福州 | 1 | 2026-10-18 09:06:51 | 2026-10-18 09:06:51 |
| 99 | 杨玮琪 | 石家庄 | 1 | 2026-10-18 09:06:51 | 2026-10-18 09:06:51 |
| 100 | 魏娜 | 乌鲁木齐 | 1 | 2026-10-18 09:06:51 | 2026-10-18 09:06:51 |
+-----+-----------+--------------+--------+---------------------+---------------------+
100 rows in set (0.00 sec)
mysql> EXIT;
Bye
root@mysql:~#

浙公网安备 33010602011771号