ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MariaDB 远程权限报错?让 Codex 经 TaoToken 查 Trae 的 MCP

MariaDB 远程权限报错?让 Codex 经 TaoToken 查 Trae 的 MCP 在 Trae 里接入 mysql_mcp_server 去连 MariaDB报 Access denied 是排障区最高频的问题之一。先用 TaoTokenhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content把 Codex 的模型通道配好再把完整报错原文和 50-server.cnf 的内容交给它逐行比对比反复重启服务、盲改配置要快得多。这类报错的表面症状是 MCP 进程连不上数据库实际根因通常只有两个mysql 库里没有允许远程来源的账号记录或者 MariaDB 的监听地址仍然锁在回环网卡上。下面按「先定位、再配置、后验证」的顺序把 Trae、Codex、MariaDB 三边的动作拆开讲每一步都能直接复制执行也说明每一步失败时该去看哪个文件的哪一行。一、Trae MCP 连 MariaDB 报 Access denied排障场景与两个根因Trae 里的 MCP 客户端本身不直连数据库它通过 npx 拉起 mysql-mcp-server 这个子进程由子进程去建 TCP 连接。所以你在 Trae 面板上看到的失败信息往往是 MCP 工具调用超时、返回空结果或者日志区抛出一行Access denied for user root172.17.0.1 (using password: YES)。注意后面那一串来源 IP它决定了 MariaDB 到底拿哪一条账号记录来做鉴权。第一类根因是账号记录不匹配。很多人装完 MariaDB 之后只在本地用mysql -u root -p登录过此时生效的是rootlocalhost这条记录。而 MCP 子进程可能是从容器网络、从另一个网卡、甚至从宿主机的另一个接口发起的连接来源地址变成了127.0.0.1之外的地址MariaDB 找不到root该地址的记录就只能拒绝。解决办法是补一条来源为通配符或指定网段的账号记录而不是改密码——改密码对不存在的账号记录毫无意义。第二类根因是监听地址。/etc/mysql/mariadb.conf.d/50-server.cnf中默认写着bind-address 127.0.0.1意思是只接受本机回环连接。哪怕账号授权已经开到%只要 TCP 层根本没在 0.0.0.0 上监听外部仍然连不进来报错会表现为连接超时或Cant connect to MySQL server而不是鉴权失败。这两个根因的报错文本不一样正好可以用来区分看到 Access denied 优先查账号看到连接被拒或超时优先查 bind-address 和防火墙。排障时容易忽略的一点是MariaDB 支持 socket 与 TCP 两条通路。MYSQL_HOST填localhost时部分客户端库会优先走 Unix socket从而绕开 TCP 监听设置看起来像是本机没问题而 MCP 子进程在别的网络命名空间里跑走的是实打实的 TCP。所以在 Trae 的 MCP 配置里建议把主机写成127.0.0.1或真实 IP明确走 TCP避免两套行为混淆判断。二、TaoToken 前置准备Key、Base URL 与 Codex 分工在动手改 SQL 之前先准备好用来做诊断的模型通道。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并进入 API Keys 页面创建一个 Key复制成YOUR_API_KEY留用。接口地址统一使用https://taotoken.net/api这一条要记牢不要在后面补/v1也不要把它和带 UTM 的那条营销链接混用。带 UTM 的是官网入口接口只认干净的https://taotoken.net/api。配置到 Codex 侧时Codex 读取的是~/.codex/config.toml。你需要新增一个自定义 provider把 base_url 指向上面这个地址把 Key 通过环境变量注入然后把默认 model_provider 切换过来。这样做的好处是 Codex 不再依赖单一来源你可以在同一份配置里保留原 provider 作为备用出问题时切回去对比能快速判断是模型通道问题还是数据库问题。这里必须把边界说清楚TaoToken 只负责向 Codex 提供模型响应它不会、也不能替你执行 GRANT 语句、不会去改 50-server.cnf、不会重启 mariadb 服务。它的价值在于把「报错原文 配置文件全文 你的操作步骤」一次性读进来然后告诉你究竟是FLUSH PRIVILEGES这一环漏了还是bind-address那一行仍然指向 127.0.0.1或者两者都做了但改错了文件。很多人排障卡住的原因不是不会改而是同时改了三个地方最后不知道是哪一步生效、哪一步反噬。让 Codex 拿着原文做一次对照分析能把这团乱麻拆成有顺序的检查项。创建 Key 之后把 Key、Base URL、Provider 名三样东西放在手边接下来第三节的所有配置片段都会用到。三、可复制配置Codex config.toml、Trae mysql_mcp_server、MariaDB 授权与 50-server.cnf先配 Codex。编辑~/.codex/config.toml加入下面这段模型 ID 以你控制台里实际可选的为准不要照抄占位符model MODEL_ID model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat然后在 shell 里导出 Key或者写进 shell 的启动文件export TAOTOKEN_API_KEYYOUR_API_KEY配好后先别急着重启 Trae等第四节的连通性验证过了再回来。再配 Trae 侧的 MCP 服务。在 Trae 的 MCP 配置面板新建一个服务名字取mysql_mcp_server类型选 npx 启动方式。参数部分按下面的结构填写注意把 HOST 改成真实地址、把库名改成你实际要查的库{ mcpServers: { mysql_mcp_server: { command: npx, args: [-y, mysql-mcp-server], env: { MYSQL_HOST: 127.0.0.1, MYSQL_PORT: 3306, MYSQL_USER: mcp_user, MYSQL_PASSWORD: 换成强密码, MYSQL_DATABASE: mcptest } } } }这里刻意没有直接用 root。生产或多人环境里给 MCP 单独建一个只读或限定库权限的账号更稳妥如果只是本地调试用 root 也必须配套远程授权否则还是回到第一节的 Access denied。接下来是 MariaDB 侧。先用管理员身份登录mysql -u root -p然后切换到权限库创建远程账号并授权。推荐用 CREATE USER 加 GRANT 两步走语义更清晰也便于日后审计USE mysql; CREATE USER mcp_user% IDENTIFIED BY 换成强密码; GRANT ALL PRIVILEGES ON mcptest.* TO mcp_user%; FLUSH PRIVILEGES;如果确实需要 root 远程访问把用户名换成 root 即可但来源尽量收窄比如只放开某个网段而不是一路开到%。授权语句执行完顺手查一下记录是否落库SELECT user, host FROM mysql.user WHERE user mcp_user;最后处理监听地址。编辑/etc/mysql/mariadb.conf.d/50-server.cnf找到 bind-address 那一行把它从 127.0.0.1 改成 0.0.0.0。改完保存退出重启服务sudo systemctl restart mariadbCentOS 或 RHEL 系上服务名可能是 mysqld按实际发行版替换。重启之后再做下一步验证不要跳过。四、验证请求与成功结果从 mysql.user 到 MCP 工具调用验证分三层逐层确认哪一层断了就回到对应小节。第一层验证监听。在数据库主机上执行ss -lntp | grep 3306期望看到0.0.0.0:3306或*:3306。如果仍然是127.0.0.1:3306说明配置没生效要么改错了文件要么有其他配置文件在后面覆盖了它要么服务没真正重启成功。第二层验证鉴权。从 MCP 子进程所在的同一台机器上用 TCP 显式连接mysql -h 127.0.0.1 -P 3306 -u mcp_user -p能进到MariaDB [(none)]提示符再用SHOW GRANTS FOR CURRENT_USER();看返回的权限范围是否覆盖你要访问的库。这一步通了说明账号和监听都没问题Trae 那边理论上不会再报 Access denied。第三层验证模型通道与 MCP 工具调用。先确认 Codex 能通过 TaoToken 正常出结果随便问一句让它复述你贴过去的报错文本能稳定返回即说明 base_url 与 Key 生效。然后回到 Trae重新加载 MCP 服务在对话里让它列出mcptest库里的表。成功的标志很具体工具调用返回表名列表Trae 日志区不再出现拒绝字样MCP 服务状态从启动中变为已连接。如果模型通道通了但 MCP 仍然失败问题一定在数据库侧或 MCP 参数侧与模型无关可以按这个结论收窄排查范围。五、本篇常见错排查FLUSH PRIVILEGES 与 bind-address 之外还有哪些坑按出现频率从高到低列一遍对照检查通常十分钟内能定位。其一改了 GRANT 但没生效。MariaDB 10.4 之后GRANT 语句本身会即时写入权限表FLUSH PRIVILEGES 并非必需但在更老的版本、或者你直接手改了 mysql 库表的情况下缺这一步就会出现语句执行成功但连接还是被拒。执行一次FLUSH PRIVILEGES;是最省事的兜底动作。其二bind-address 改了但被覆盖。MariaDB 会按顺序读多个配置片段50-server.cnf只是其中一个。检查是否存在其他片段重复定义了 bind-address以及my.cnf里的包含顺序。另外要确认文件路径正确别把改动写到了一个根本没被加载的文件里。其三skip-networking 没关。某些加固模板会打开skip-networking此时服务完全不走 TCP只留 socket。报错同样表现为连接被拒但改 bind-address 毫无作用。搜一下配置文件里有没有这一行有就注释掉。其四认证插件不匹配。新版本 MariaDB 的 root 默认可能使用 unix_socket 插件这种账号用密码从 TCP 登录一定失败。要么改用 mysql_native_password要么老老实实建一个普通账号给 MCP 用这也是我推荐mcp_user的原因。其五把MYSQL_HOST写成localhost。如前所述这可能触发 socket 通路让本机测试通过、MCP 侧却失败。统一写127.0.0.1或真实 IP行为可预期。其六接口地址写错。Base URL 必须是https://taotoken.net/api补上/v1会拼成不存在的路径带上 UTM 参数则可能被当作非法请求。这类错误通常表现为 404 或鉴权失败和数据库报错完全不同看一眼错误码就能区分。其七防火墙与安全组。本机监听放开了但云主机安全组或 ufw、firewalld 没放行 3306外部照样连不进。先在本机 curl 端口再从远端探一次两步都做才叫排除。其八环境变量没传到 MCP 子进程。Trae 里改完配置要重新加载服务有些情况下子进程会复用旧环境。改完 MYSQL_* 相关字段重启 Trae 或手动重启 MCP 服务再试。六、下一步按需分流排障走到这里通常已经能定位到具体是哪一环。如果你还需要继续处理 Key 管理、接入配置和 settings 相关的细节可以直接去 API Keys 页面https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys创建或轮换密钥配合接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc核对 base_url、provider 字段和常见返回码文档里对 401、404、429 这几类响应的成因写得比较细。如果你只是想先确认模型本身通不通、返回内容是否符合预期不需要动 Codex 配置那就用模型对话页面https://taotoken.net/console/playground?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentplayground直接发一条消息看响应速度和输出格式这比在编辑器里来回改配置快得多。如果你的目标是把这类排障能力固化成日常开发流程让 Codex 长期参与 MCP 调试、数据库脚本生成和日志分析那么 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan更合适它面向的就是持续编码与 Agent 场景。把本篇的配置一次做对以后遇到同类远程连接问题把报错原文丢给 Codex几分钟就能给出下一步该看哪个文件的哪一行。
返回列表