mysqldump --all-databases 是唯一原生命令全备 mysql 实例所有数据库,但需 super 或 backup_admin 权限;它跳过 performance_schema、information_schema 表内容,不导出用户账号,且任一库权限不足或损坏即中断;必须配合 --single-transaction(保障 innodb 一致性)、--routines(导出存储过程/函数)、--events(导出事件调度器)才完整。

mysqldump --all-databases 是唯一能用一条命令备份 MySQL 实例上所有数据库的原生方式,但它有硬性前提:执行用户必须拥有 SELECT、LOCK TABLES 和 SHOW DATABASES 权限(通常需 SUPER 或 BACKUP_ADMIN 角色)。不满足就直接报错 Access denied; you need (at least one of) the SUPER or BACKUP_ADMIN privilege(s) for this operation。
为什么 --all-databases 不等于“无脑全备”
它导出的是所有库的结构 + 数据,但会跳过系统库中某些特殊对象(如 performance_schema、information_schema 的表内容),且默认不包含 MySQL 用户账号信息(mysql.user 表需显式指定)。更重要的是:--all-databases 本质是循环执行每个库的 mysqldump -u ... database_name,所以如果某个库损坏或权限不足,整个备份会中断——它不保证“尽力而为”。
实际执行时必须加的三个参数
-
--single-transaction:对 InnoDB 表启用一致性快照,避免锁表;MyISAM 表仍会全局锁,所以混合引擎环境慎用 -
--routines:否则存储过程、函数不会被导出 -
--events:否则事件调度器定义丢失
完整命令示例:
mysqldump -u root -p --single-transaction --routines --events --all-databases > full_backup_$(date +%F).sql注意:不要在
-p 后直接跟密码(如 -proot123),这会暴露密码到进程列表和 shell 历史,应让 mysqldump 交互式提示输入。
备份文件体积大?别硬扛,直接压缩
导出 SQL 文件动辄几 GB,传输和存储都吃力。用管道实时压缩比先生成再压缩更省磁盘空间:
mysqldump -u root -p --single-transaction --routines --events --all-databases | gzip > full_backup_$(date +%F).sql.gz还原时也对应用管道:
gunzip 注意:压缩后无法用文本编辑器直接查看内容,排查问题前得先解压。 <h3>真正容易被忽略的点</h3> <p>备份完成不代表能恢复。常见断点:<br>• <code>mysql</code> 客户端版本高于服务端时,可能因语法差异(如新版本关键字)导致导入失败<br>• 备份文件里没有 <code>CREATE DATABASE</code> 语句(<code>--all-databases</code> 默认带,但若加了 <code>--skip-add-drop-database</code> 就没了)<br>• 恢复前没检查目标实例的 <code>max_allowed_packet</code>,超大 INSERT 会被截断<br>• 忘记 <code>SET FOREIGN_KEY_CHECKS=0</code> 开头,外键约束导致导入中途退出</p>











