生产环境备份单个数据库必须加--single-transaction、--routines、--triggers三个参数:前者避免InnoDB锁表,后两者确保存储过程和触发器完整导出;还需显式指定--default-character-set=utf8mb4防乱码,并用绝对路径+时间戳命名备份文件。

直接用 mysqldump -u user -p database_name > backup.sql 能跑通,但生产环境这么干大概率出事——锁表、丢存储过程、中文乱码、恢复失败全可能。
备份单个数据库必须加的三个参数
不加 --single-transaction,InnoDB 表会触发全局读锁,大表导出时业务写入卡死;不加 --routines 和 --triggers,恢复后存储过程和触发器全消失,逻辑断裂。
-
--single-transaction:仅对 InnoDB 有效,靠 MVCC 实现一致性快照,避免锁表 -
--routines:导出函数、存储过程(CREATE PROCEDURE等语句) -
--triggers:导出每个表关联的触发器定义
推荐命令:mysqldump -uroot -p --single-transaction --routines --triggers myapp_db > /backup/myapp_db_$(date +%Y%m%d_%H%M).sql
字符集乱码?别信默认值
mysqldump 默认用 latin1 连接,而 MySQL 8.0+ 默认是 utf8mb4。导出含 emoji 或中文的库,不显式指定字符集,SQL 文件里就是一堆 ? 或 Incorrect string value 错误。
- 加
--default-character-set=utf8mb4强制客户端和服务端统一编码 - 如果目标库已存在且字符集不一致,光改导出参数没用,得先
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - 验证方式:导出后用
head -n 20 backup.sql | grep "SET NAMES"看是否为utf8mb4
表名含关键字或特殊字符怎么办
像 order、group、user 这类 MySQL 保留字当表名时,不加反引号会直接报错 ERROR 1064 (42000)。
- 必须用反引号包裹:
mysqldump -u u -p mydb `order` > order_backup.sql - 表名含短横线(
-)、空格、中文也一样要加反引号 - 不确定是否需要?先查
SHOW TABLES FROM mydb LIKE 'order';,再看输出里有没有反引号提示
备份文件路径和命名容易被忽略的细节
命令里没写绝对路径,backup.sql 就生成在当前 shell 所在目录,不是 MySQL 安装目录,也不是用户家目录——运维巡检时根本找不到。
- 务必用绝对路径:
/backup/或/mnt/nas/mysql_backups/,别依赖cd切换 - 用
$(date +%Y%m%d_%H%M)命名,避免同天多次备份覆盖(%S秒级精度一般没必要) - 执行后只显示
Enter password:,输入密码时无回显——这是正常行为,不是卡死,别反复按回车
真正麻烦的从来不是“能不能导出”,而是“导出来的能不能原样恢复”。字符集、事务隔离、对象依赖这三点漏一个,restore 时就可能停在第 3 行 SQL 上动不了。


















