备份单个数据库需用 mysqldump --databases mydb > mydb_backup.sql,否则恢复时因缺少 CREATE DATABASE 和 USE 语句而报错;恢复须先登录 MySQL 再执行 source /path/to/mydb_backup.sql; 或直接 mysql -u root -p mydb < mydb_backup.sql。

备份单个数据库用 mysqldump,别漏掉 --databases 参数
不加 --databases 时,mysqldump mydb 输出的 SQL 文件里没有 CREATE DATABASE 和 USE mydb 语句——恢复时如果目标库不存在或当前库不是 mydb,会直接报错 ERROR 1046 (3D000): No database selected。
正确做法是显式带上该参数:
mysqldump --databases mydb > mydb_backup.sql
这样导出的文件开头就有 CREATE DATABASE IF NOT EXISTS `mydb`; 和 USE `mydb`;,后续恢复才不会卡在库选择上。
- 如果只导结构不导数据,加
--no-data - 要跳过某些表(比如日志表),用
--ignore-table=mydb.log_table - 生产环境建议加上
--single-transaction(InnoDB 表适用),避免锁表影响业务
source 恢复前必须先连上 MySQL,且不能在命令行直接 pipe
source 是 MySQL 客户端内的命令,不是 shell 命令。常见错误是写成:mysql -u root -p source mydb_backup.sql —— 这会报错 Unknown command 'source',因为 shell 根本不认识它。
正确流程分两步:
- 先登录:
mysql -u root -p - 再在 MySQL 提示符下执行:
source /path/to/mydb_backup.sql;(注意末尾分号)
或者更省事的单行写法(推荐):
mysql -u root -p mydb < mydb_backup.sql
注意这里没写 --databases,因为文件里已有 USE mydb,且目标库名必须和备份时一致;如果想恢复到不同库名,得先手动建库,再用 mysql -u root -p otherdb ,前提是备份文件不含跨库引用。
字符集不一致会导致中文乱码或恢复失败
如果源库用 utf8mb4,但导出时没指定字符集,而 MySQL 客户端默认是 latin1,mysqldump 就可能把中文转成问号或乱码;恢复时再插进去,数据就毁了。
保险做法是在 dump 和 restore 两端都明确指定:
- 备份时加:
--default-character-set=utf8mb4 - 恢复时也加:
mysql --default-character-set=utf8mb4 -u root -p mydb
还可以检查备份文件头是否有 SET NAMES utf8mb4;,没有就说明导出时没设对。
权限不足时 mysqldump 报错 Access denied for user 怎么办
mysqldump 不仅需要读取表数据的权限,还需要 SELECT、LOCK TABLES(除非用 --single-transaction)、SHOW VIEW(如果有视图)、TRIGGER(如果有触发器)等权限。单纯给 SELECT 是不够的。
最小必要权限组合(针对单库):
GRANT SELECT, SHOW VIEW, LOCK TABLES, TRIGGER ON `mydb`.* TO 'backupuser'@'%';- 如果是
--single-transaction,可去掉LOCK TABLES - 记得
FLUSH PRIVILEGES;
别用 root 备份,尤其在自动化脚本里——权限越小,出事影响越小。
恢复操作本身只需要目标库的 INSERT、CREATE、ALTER 权限,但通常由同一个账号执行,所以备份账号最好也预置这些。


















