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” 行——很多失败静默发生。
