mysqldump报access denied,90%原因不是权限不足而是连接失败:账号host不匹配(如localhost vs 127.0.0.1)、mysql 8.0+认证插件不兼容旧客户端、或缺少usage登录权限;需严格按'user'@'host'成对创建账号并指定mysql_native_password插件。

mysqldump 报 Access denied,90% 不是权限没给够,而是账号根本连不上——要么密码输错、host不匹配,要么认证插件不兼容。直接加一堆权限(比如 ALL PRIVILEGES)不仅无效,还埋下安全风险。
为什么 backup_user 会 Access denied?先看三个硬性条件
MySQL 认证是 'user'@'host' 成对生效的,缺一不可。备份失败常卡在这三处:
-
mysqldump -u backup_user -p连的是backup_user@localhost,但你只建了backup_user@127.0.0.1—— Unix 系统下这两个 host 不互通 - MySQL 8.0+ 默认用
caching_sha2_password插件,而旧版mysqldump(如 MySQL 5.7 客户端)不支持,直接拒绝连接 - 用户存在、密码正确、host 也对,但没授予
USAGE权限(即“允许登录”这个最基本权限),SHOW GRANTS FOR 'backup_user'@'localhost'会返回空
创建最小权限备份账号的实操步骤
别用 root 或通配 host,按需授权,一步到位:
① 登录 MySQL(必须用有 CREATE USER 权限的账号,如 root):
mysql -u root -p
② 创建账号并指定认证方式(适配老客户端):
CREATE USER 'backup_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'strong_password_123';
③ 授予真正需要的权限(非 ALL):
GRANT SELECT, LOCK TABLES ON `app_db`.* TO 'backup_user'@'localhost';
④ 如果要备份多个库,逐个授权,不要用 ON *.*:
GRANT SELECT, LOCK TABLES ON `log_db`.* TO 'backup_user'@'localhost';
⑤ 需要 --single-transaction 时才加 RELOAD(InnoDB 表快照用):
对设计或页面进行 WCAG 2.1 AA 无障碍审计。触发关键词:“audit accessibility”、 “check a11y”、 “is this accessible?” 或在审查设计时使用。
GRANT RELOAD ON *.* TO 'backup_user'@'localhost';
⑥ 刷新权限(GRANT 后可省略,但保险起见仍建议执行):
FLUSH PRIVILEGES;
备份命令里怎么避免 -p 导致的坑
-p 后面**不能有空格**,否则 mysqldump -u backup_user -p mydb 会被解析成“密码是 mydb”,然后去连一个叫 mydb 的数据库——这就会触发 Access denied for user 'backup_user'@'localhost' (using password: YES)。
更安全的做法是:
- 交互式输密码:
mysqldump -u backup_user -p mydb > backup.sql(回车后手动输入) - 用
mysql_config_editor存凭证(推荐):mysql_config_editor set --login-path=backup --user=backup_user --password --host=localhost,之后直接mysqldump --login-path=backup mydb > backup.sql - 绝对不要在命令行写明文密码,比如
mysqldump -u backup_user -pmypass mydb——进程列表里谁都看得见
恢复时报 Unknown database?和备份账号无关,但容易混淆
这个错误不是权限问题,是 SQL 文件本身没带 CREATE DATABASE 语句。如果你用的是 mysqldump mydb(没加 --databases),那恢复前必须手动建库:
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4;"
再导入:
mysql -u backup_user -p mydb <p>注意:如果备份时用了 <code>--databases mydb</code>,SQL 文件开头会有 <code>CREATE DATABASE IF NOT EXISTS `mydb`;</code> 和 <code>USE `mydb`;</code>,此时可直接 <code>mysql -u backup_user -p ,不用指定库名。</code></p><p>最容易被忽略的是大小写敏感:Linux 下 MySQL 默认区分库名大小写,<code>mydb</code> 和 <code>MyDB</code> 是两个库;而 SQL 文件里写的库名必须和 <code>GRANT</code> 语句里的完全一致。</p>










