mysqldump 最简可用备份需确保连得上、读得全、写得进:本地 root 备份用 mysqldump -u root -p --all-databases > backup.sql,InnoDB 库必加 --single-transaction,权限不足时用 --skip-lock-tables 或授予 SELECT、LOCK TABLES 等最小权限。

mysqldump 备份命令最简可用写法
直接跑通备份,不报错、不丢数据,核心就三件事:连得上、读得全、写得进。默认情况下 mysqldump 会尝试锁表并导出一致快照,但如果你没权限或库太大,可能卡住或失败。
- 本地备份本机 MySQL(root 用户):
mysqldump -u root -p --all-databases > backup.sql - 只备份某个库:
mysqldump -u root -p mydb > mydb.sql - 加
--single-transaction(InnoDB 必选):避免锁表阻塞业务,但仅对事务型引擎有效 - 不加
-p参数时,密码不能写在命令行里——否则会出现在ps aux和 shell 历史中,极不安全
常见报错:Access denied for user 或 Got error: 1045
不是密码错了,大概率是用户没被授权执行 SELECT、LOCK TABLES 或 RELOAD 权限。特别是用普通账号备份时,mysqldump 默认需要 LOCK TABLES,而很多生产账号被刻意禁掉了。
- 解决方法一(推荐):加
--skip-lock-tables,配合--single-transaction使用,适用于纯 InnoDB 库 - 解决方法二:给账号授最小必要权限:
GRANT SELECT, SHOW VIEW, LOCK TABLES, RELOAD ON *.* TO 'backupuser'@'localhost'; - 注意
mysqldump --all-databases还需要PROCESS权限来读取线程状态,否则可能跳过某些库
导出 SQL 文件体积大、恢复慢?关键参数调优
默认导出带大量 INSERT 语句,每行一条,IO 和解析开销大;另外字符集、SQL 模式不匹配会导致恢复时报错。
- 用
--extended-insert(默认开启)合并多行插入,显著减小文件体积、加快导入 - 显式指定字符集:
--default-character-set=utf8mb4,避免恢复时因 server 默认值不同导致乱码 - 加
--set-gtid-purged=OFF(MySQL 5.7.6+),否则 GTID 环境下可能报Cannot disable GTID mode - 大库建议加
--compress减少网络传输量(仅客户端和服务端都支持压缩时生效)
备份后验证是否可用,别等恢复时才发现问题
导出成功 ≠ 能恢复。最常被忽略的是 SQL 文件头部的 SET 语句和权限相关注释,它们可能在目标环境报错或静默失效。
- 快速验证语法:
mysql -u root -p -e "source backup.sql;" 2>/dev/null || echo "syntax error"(仅检测前几条) - 检查是否含
DROP DATABASE或CREATE DATABASE:若没有,恢复前得手动建库;若有,又得确认是否允许覆盖 - 用
head -n 50 backup.sql看开头是否有/*!40101 SET @OLD_CHARACTER_SET_CLIENT=... */类注释——这些是条件执行的,但部分老版本 MySQL 客户端可能不识别 - 如果备份含存储过程/函数,需额外加
--routines,否则默认不导出
事情说清了就结束










