mysqldump报“access denied”主因是权限集不完整,需授予select、lock tables、show view、trigger等最小权限;还须检查process权限、系统库跳过机制、输出目录写权限及flush privileges是否执行。

直接填对 SSH 隧道参数 ≠ 能成功备份内网数据库。真正卡住的地方,往往是「隧道通了但 MySQL 拒绝认证」或「备份时权限不足导致 mysqldump 失败」——这两类问题在实际运维中占比超 70%。
SSH 隧道连通但 mysqldump 报错 Access denied?检查 MySQL 用户 Host 绑定
Navicat 的 SSH 隧道建立后,所有流量从跳板机发起,MySQL 看到的来源 IP 是跳板机的内网地址(比如 10.10.5.100),不是你本地电脑的 IP。
- 执行
SELECT User, Host FROM mysql.user WHERE User = 'backup_user';,确认该用户 Host 字段是跳板机内网 IP(如'backup_user'@'10.10.5.100'),不是'localhost'或'%' - 若用
%却仍失败,可能是 MySQL 启用了skip-name-resolve,导致 DNS 反查失败,建议显式授权给跳板机内网 IP - 备份账号至少需
SELECT、LOCK TABLES、SHOW VIEW、TRIGGER权限;用mysqldump --single-transaction时还需REPLICATION CLIENT
Navicat 内置备份功能失效?改用命令行 + 隧道端口转发
Navicat 的「数据传输」或「备份」功能走的是图形化连接逻辑,有时无法正确继承 SSH 隧道上下文,尤其涉及大表或 long_query_time 较短时容易中断。更稳的方式是手动复用隧道端口做本地转发:
- 先在 Navicat 中配置好 SSH 隧道,并测试连接成功(此时它已占用一个本地端口,比如
127.0.0.1:3307) - 保持 Navicat 连接打开(不要断开),新开终端执行:
mysqldump -h 127.0.0.1 -P 3307 -u backup_user -p database_name > backup.sql - 注意:-h 必须是
127.0.0.1(不能用 localhost,否则可能走 socket 文件绕过隧道) - 若提示
Access denied for user,说明 Navicat 当前隧道没生效或端口被占,可换一个本地端口(如 3308)并在 Navicat「常规」页手动改端口再试
备份过程中连接频繁中断?加 SSH KeepAlive 防静默断连
SSH 隧道默认无心跳,中间网络设备(云厂商 NAT 网关、企业防火墙)常在 30–60 秒无流量后回收连接,导致 mysqldump 中途报错 Lost connection to MySQL server during query。
- 在跳板机的
/etc/ssh/sshd_config中添加:ClientAliveInterval 30和ClientAliveCountMax 3,然后sudo systemctl restart sshd - 或者在 Navicat 的 SSH 选项卡里,勾选「保持连接活跃」(部分版本支持);不支持时,可在本地 SSH 客户端配
ServerAliveInterval 30(需配合 Navicat 使用系统 SSH,非内建隧道) - 备份大库前,建议先用
mysql -h 127.0.0.1 -P 3307 -e "SELECT 1;"持续 ping 几分钟,验证隧道稳定性
最容易被忽略的一点:备份脚本里写的主机是 localhost,但通过 SSH 隧道时必须强制走 TCP,所以 -h 127.0.0.1 不可省略,且不能依赖 ~/.my.cnf 里的 host 默认值——那个值很可能还是 localhost。











