mysqldump -u root -p --all-databases > all.sql 可导出所有库(含mysql等系统库),但默认不加--single-transaction会导致MyISAM表全局锁表、InnoDB事务不一致,且需RELOAD权限,否则报错;安全写法应添加--single-transaction --routines --triggers --events并指定--default-character-set=utf8mb4防乱码,大库建议管道压缩。

用 --all-databases 备份整实例最直接
直接执行 mysqldump -u root -p --all-databases > all.sql 就能导出所有库,包括 mysql、information_schema 等系统库。但注意:这个命令默认不加 --single-transaction,对 MyISAM 表会全局锁表,业务写入会阻塞。
线上必须加 --single-transaction 和权限校验
InnoDB 引擎为主时,不加 --single-transaction 会导致备份期间事务不一致;而 --all-databases 还要求用户有 RELOAD 权限(用于刷新日志),否则报错 mysqldump: Got error: 1227: Access denied; you need (at least one of) the RELOAD privilege(s) for this operation。
- 确认权限:执行
SHOW GRANTS FOR CURRENT_USER;查看是否含RELOAD - 安全写法:
mysqldump -u root -p --single-transaction --routines --triggers --events --all-databases > all_$(date +%Y%m%d).sql - 如果权限不足,改用
--databases显式列出业务库名,避开系统库
压缩备份和避免中文乱码的实际处理
直接重定向生成的 .sql 文件默认是 UTF-8 编码,但若数据库字符集是 utf8mb4,且 mysqldump 没指定 --default-character-set=utf8mb4,导入时可能丢 emoji 或生僻字。同时,大库不压缩会迅速占满磁盘。
- 推荐组合:
mysqldump -u root -p --default-character-set=utf8mb4 --single-transaction --routines --triggers --events --all-databases | gzip > all_$(date +%Y%m%d).sql.gz - Windows 下用 PowerShell 执行重定向会生成 UTF-16 文件,无法被
mysql正确读取,必须用--result-file替代>,例如:mysqldump -u root -p --result-file=all.sql --all-databases -
gzip压缩后,还原需先解压:gunzip
全库备份后还原的两个关键限制
--all-databases 导出的 SQL 包含 DROP DATABASE 和 CREATE DATABASE,但还原时不能直接 mysql -u root -p —— 因为 <code>mysql 客户端默认不执行 DROP DATABASE,且系统库(如 mysql)里的用户权限表可能与当前实例冲突。
- 稳妥做法:先用
mysql -u root -p -e "SHOW DATABASES;"确认目标实例没有同名业务库,再逐个导入非系统库 - 真正需要全实例迁移时,应停库、清空数据目录、用物理备份(如 xtrabackup)或 mysqldump +
--master-data=2配合 binlog 做一致性恢复 - 别忽略
information_schema和performance_schema是只读库,导出内容无实际意义,还原时跳过更安全


















