备份单个数据库需用 mysqldump --databases mydb > mydb_backup.sql,否则恢复时因缺少 create database 和 use 语句而报错;恢复须先登录 mysql 再执行 source /path/to/mydb_backup.sql; 或直接 mysql -u root -p mydb
备份单个数据库用 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 <p>注意这里没写 <code>--databases</code>,因为文件里已有 <code>USE mydb</code>,且目标库名必须和备份时一致;如果想恢复到不同库名,得先手动建库,再用 <code>mysql -u root -p otherdb ,前提是备份文件不含跨库引用。</code></p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill2334" title="MySQL"><img src="https://img.php.cn/upload/skill/000/000/081/178900927846657.jpg" alt="MySQL" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill2334" title="MySQL" class="overflowclass">MySQL</a> <p class="overflowclass">编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。</p> </div> <a rel="nofollow" href="/xiazai/skill2334" title="MySQL" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><h3>字符集不一致会导致中文乱码或恢复失败</h3><p>如果源库用 <code>utf8mb4</code>,但导出时没指定字符集,而 MySQL 客户端默认是 <code>latin1</code>,<code>mysqldump</code> 就可能把中文转成问号或乱码;恢复时再插进去,数据就毁了。</p><p>保险做法是在 dump 和 restore 两端都明确指定:</p>
- 备份时加:
--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权限,但通常由同一个账号执行,所以备份账号最好也预置这些。











