mysqldump报错access denied是权限不足,需授予select、lock tables、show view、trigger权限;lost connection因超时,应调大超时参数;跳过mysql等系统表属正常;导出须加--default-character-set=utf8mb4防乱码。

mysqldump 报错:Access denied for user
这是权限不足的典型表现,mysqldump 连接数据库时用的账号没被授予足够权限。不是只要能登录 MySQL 就能导出——它至少需要 SELECT(读表)、LOCK TABLES(锁表防写入干扰)、SHOW VIEW(导出视图)、TRIGGER(导出触发器)等权限。
实操建议:
- 用
mysql -u root -p登录后,执行:SHOW GRANTS FOR 'backup_user'@'%';
确认权限是否完整 - 若缺失,补全权限:
GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER ON *.* TO 'backup_user'@'%'; FLUSH PRIVILEGES;
- 避免用
root账号跑定时备份脚本,最小权限原则更安全
mysqldump 报错:Got error: 2013: Lost connection to MySQL server during query
常见于导出大表(比如单表超 1GB)或网络不稳时。本质是连接超时或服务端主动断开,不是数据损坏。
实操建议:
- 增大客户端和服务端的超时参数:
mysqldump --connect-timeout=600 --net-read-timeout=600 --net-write-timeout=600 -u user -p db_name
- 服务端需同步调整:
wait_timeout和interactive_timeout(建议设为 600 或更高),改完重启或SET GLOBAL生效 - 对超大库,优先考虑分表导出:
mysqldump -u user -p db_name table1 table2 > part1.sql
mysqldump 日志里出现 Warning: Skipping the data of table mysql.xxx
这是正常行为,不是错误。默认情况下 mysqldump 会跳过系统库 mysql、information_schema、performance_schema、sys 的数据(只导结构或完全跳过),因为这些表内容依赖运行时状态,直接还原可能引发权限混乱或元数据冲突。
实操建议:
- 如需备份用户权限,用
--all-databases加--skip-lock-tables,但必须配合--skip-comments和显式排除information_schema等库,否则会报错 - 更稳妥的方式是单独导出权限:
mysqldump --no-create-info --skip-extended-insert mysql user db tables_priv > grants.sql
- 注意
mysql.user表在 8.0+ 已弃用密码字段,权限导出后需人工校验兼容性
mysqldump 导出 SQL 文件开头没有 SET NAMES 或 character_set_client
这会导致还原时中文乱码,尤其当源库用 utf8mb4 而目标库默认字符集是 latin1。mysqldump 默认不强制写字符集声明,靠客户端连接时协商,但还原时容易失效。
实操建议:
- 导出时显式指定:
mysqldump --default-character-set=utf8mb4 -u user -p db_name > dump.sql
- 检查生成文件前几行是否含:
SET NAMES utf8mb4;
或/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
- 若已导出但缺该声明,可在文件开头手动插入
SET NAMES utf8mb4;,但要注意不能插在CREATE DATABASE语句之前(否则可能被忽略)
实际恢复前,务必用 head -n 20 dump.sql 快速扫一眼字符集和库名是否符合预期;大库导出别只看最后有没有 “Dump completed”,得 grep 看有无 “Warning” 或 “ERROR” 行——很多失败静默发生。










