MySQL 备份与恢复完全指南
本文档专门讲 MySQL 的备份(Backup)与恢复(Restore):为什么要备份、有哪些备份方式、mysqldump 怎么用、如何恢复 .sql 文件、一些常见问题与实战建议。每一步都配有详细说明和示例,适合零基础新手跟着做。
目录
- 为什么要备份
- 备份的基本概念(一定要先理解)
- 最常用的备份工具:mysqldump
- 逻辑备份:导出/备份(mysqldump 常见用法)
- 逻辑恢复:导入/还原(mysql + SOURCE)
- 只备份/恢复某个表
- 只备份结构或只备份数据
- 使用 MySQL 客户端工具备份与恢复(了解)
- 简单了解物理备份(整体数据目录拷贝)
- 备份策略与实战建议
- 常见错误与注意点
- 综合示例与速查表
1. 为什么要备份
1.1 可能遇到的风险
- 手滑执行了
DROP TABLE、DELETE FROM ...无 WHERE,把数据删了。 - 程序 Bug 写错 SQL,改坏了一大批数据。
- 磁盘损坏、系统崩溃、误格式化。
- 勒索软件攻击、黑客入侵。
没有备份,就很难恢复数据;有了备份,通常可以“回到某个时间点”或“至少恢复到最后一次备份时”的状态。
1.2 备份的意义
- 后悔药:改错数据、误删表时,有备份就能恢复。
- 迁移:从一台服务器迁到另一台(或从本地迁到云),备份 + 恢复 是最常用方法。
- 审计/归档:保留一段时间内的数据快照。
2. 备份的基本概念(一定要先理解)
2.1 逻辑备份 vs 物理备份
逻辑备份:
- 把数据库里的表结构、数据“导出”为文本形式的 SQL 脚本(如
backup.sql)。 - 文件内容是各种
CREATE TABLE、INSERT INTO ... VALUES ...等语句。 - 恢复时,就是执行这些 SQL,把表和数据再建回来。
- 工具:mysqldump。
物理备份:
- 直接拷贝数据库的数据文件(如 MySQL 的 data 目录里的
.ibd、.frm、.ibdata1等)。 - 对版本、存储引擎、操作系统等要求较高。
- 通常需要停库或使用专业工具(如 xtrabackup),新手阶段可以先了解概念即可。
新手推荐:先学会“逻辑备份 + 恢复”(mysqldump + mysql),大部分日常需求都能满足。
2.2 备份粒度
可以选择备份:
- 所有数据库:整库备份,适合整机迁移或全量备份。
- 某个数据库:只备份一个业务使用的库,如
school。 - 某些表:只备份关键表,如
school.students、school.scores。 - 只备份结构 / 只备份数据:有时只要建表语句(结构),不需要数据;或只要数据,不在乎结构。
3. 最常用的备份工具:mysqldump
3.1 mysqldump 是什么
mysqldump 是 MySQL 自带的一个命令行工具,用来做逻辑备份:
- 把你指定的数据库/表导出成一个
.sql文件。 - 文件里是
CREATE、INSERT等 SQL 语句。 - 以后可以用
mysql命令或客户端执行这个.sql文件来恢复。
3.2 在哪里运行 mysqldump
在 操作系统的命令行(CMD / PowerShell) 里运行,不是在 mysql> 里。 例如:
mysqldump -u root -p [其他参数...] > backup.sql
如果 mysqldump 提示“不是内部或外部命令”,需要:
- 把 MySQL 安装目录下的
bin目录(如C:Program FilesMySQLMySQL Server 8.0bin)加入环境变量;或 - 使用绝对路径运行:
"C:Program FilesMySQLMySQL Server 8.0binmysqldump.exe" -u root -p ...
3.3 基本参数说明
-u 用户名:如-u root。-p:提示输入密码(不建议直接写在命令里暴露密码)。-h:主机,默认是localhost。-P:端口,如-P 3306。--databases:指定要备份的数据库(可多个)。--all-databases:备份所有数据库。--tables:指定具体表名。
后面会通过例子讲解。
4. 逻辑备份:导出/备份(mysqldump 常见用法)
4.1 备份单个数据库
场景:备份名为 school 的数据库到 school_backup.sql。
在 CMD 或 PowerShell 中执行(不要先进入 mysql>):
mysqldump -u root -p school > C:backupschool_backup.sql
解释:
school:要备份的数据库名。>:重定向,把导出的 SQL 内容写入后面的文件。C:backupschool_backup.sql:备份文件路径(注意确保目录存在)。
执行后会提示输入密码,然后生成 school_backup.sql。
提示:路径中有空格时,需要用引号包起来,如:
"C:My Backupschool_backup.sql"。
4.2 用 –databases 备份单个或多个库
也可以用 --databases:
mysqldump -u root -p --databases school > C:backupschool_backup.sql
这样导出的 SQL 里会包含 CREATE DATABASE 和 USE school; 等语句。
备份多个数据库:
mysqldump -u root -p --databases school shop blog > C:backupmulti_backup.sql
4.3 备份所有数据库
mysqldump -u root -p --all-databases > C:backupall_backup.sql
这会把 MySQL 服务器上所有数据库(包括系统库)都导出。
一般生产环境会定期做“全库备份”,但新手练习时可以只备份自己的业务库。
4.4 备份指定的几个表
语法:
mysqldump -u root -p 数据库名 表1 表2 ... > 文件.sql
示例:只备份 school 库中的 students 和 scores 两张表:
mysqldump -u root -p school students scores > C:backupschool_tables_backup.sql
4.5 常用选项(了解)
--single-transaction:对 InnoDB 表做一致性备份(推荐用于线上运行中的服务器),避免锁表过久。--routines:连同存储过程、函数一起导出。--triggers:导出触发器(默认一般会导出)。--no-data:只导出表结构,不导数据(后面会详细讲)。--no-create-info:只导出数据,不导表结构。
简单示例(线上备份某库,避免锁表时间过长):
mysqldump -u root -p --single-transaction school > C:backupschool_backup.sql
5. 逻辑恢复:导入/还原(mysql + SOURCE)
mysqldump 导出的 .sql 文件本质就是 SQL 语句,要恢复就是“执行这些 SQL”。典型方式有两种:
- 方法一:在系统命令行用
mysql命令配合<重定向。 - 方法二:进入
mysql>后使用SOURCE命令。
5.1 方法一:命令行导入(推荐)
场景:已有 C:backupschool_backup.sql,恢复到本机 MySQL 中(备份文件里已包含 CREATE DATABASE 等)。n
mysql -u root -p < C:backupschool_backup.sql
或明确指定数据库(若备份中没有 CREATE DATABASE):
mysql -u root -p school < C:backupschool_backup.sql
说明:
- 前一种:备份文件里一般有
CREATE DATABASE和USE,会按备份中的内容建库、建表、插数据。 - 后一种:指定了要导入到的数据库(如
school),备份文件中没有CREATE DATABASE时用。
注意:恢复前,如果同名数据库或表已经存在,可能会报错或覆盖数据,动作前务必确认需求。
5.2 方法二:在 mysql 客户端里用 SOURCE
-
先登录 MySQL:
mysql -u root -p -
选择目标数据库(若备份只包含表结构和数据,不含
CREATE DATABASE):USE school; -
在
mysql>下执行:SOURCE C:/backup/school_backup.sql;- Windows 下路径用
/或\都可以,例如:C:\backup\school_backup.sql。
- Windows 下路径用
这样 MySQL 会一行一行执行这个 .sql 文件中的语句,完成恢复。
5.3 常见恢复场景
- 全新安装 MySQL 后,恢复之前的 all_backup.sql:
- 直接:
mysql -u root -p < all_backup.sql。
- 直接:
- 把
school从 A 机迁到 B 机:- 在 A 机:
mysqldump -u root -p school > school_backup.sql - 把
school_backup.sql拷到 B 机。 - 在 B 机:
mysql -u root -p < school_backup.sql
- 在 A 机:
6. 只备份/恢复某个表
6.1 只备份一张表
mysqldump -u root -p school students > C:backupstudents_backup.sql
6.2 备份多张表
mysqldump -u root -p school students scores > C:backupstudents_scores_backup.sql
6.3 恢复单表
在恢复时,可以直接执行对应的 .sql 文件:
mysql -u root -p school < C:backupstudents_backup.sql
注意:
- 如果
school.students已经存在且备份里也有CREATE TABLE,可能会报表已存在错误,需根据情况先DROP TABLE students;或在备份前加--add-drop-table(mysqldump 默认会加DROP TABLE IF EXISTS,可以查看备份内容确认)。
7. 只备份结构或只备份数据
有时候只想:
- 备份“表结构”(建表语句),不需要数据。
- 备份“数据”(INSERT 语句),不需要建表语句。
7.1 只备份结构(不含数据):–no-data
mysqldump -u root -p --no-data school > C:backupschool_schema.sql
这样导出的 SQL 只有 CREATE TABLE 等语句,没有 INSERT。
只备份某表的结构:
mysqldump -u root -p --no-data school students > C:backupstudents_schema.sql
7.2 只备份数据(不含表结构):–no-create-info
mysqldump -u root -p --no-create-info school > C:backupschool_data.sql
文件里只有 INSERT INTO ... VALUES ...。
只备份某表数据:
mysqldump -u root -p --no-create-info school students > C:backupstudents_data.sql
7.3 使用场景
- 只想把现有结构复制到别的环境,不要真实数据 → 用结构备份。
- 表结构变了,想只更新某些环境的数据 → 用数据备份配合已有表结构。
8. 使用 MySQL 客户端工具备份与恢复(了解)
除了命令行的 mysqldump,很多图形化工具也提供“导出/导入”功能,例如:
- MySQL Workbench
- Navicat
- DBeaver
一般步骤类似:
- 连接到 MySQL 服务器。
- 右键某个数据库或表 → 选择 Export / Dump。
- 选择导出结构和/或数据、选择文件路径。
- 恢复时,使用 Import / Run SQL File,选择
.sql文件执行。
图形界面的本质也是调用类似 mysqldump 和 mysql 的逻辑,只是帮你生成命令和管理文件,新手可以先练熟命令行,图形工具会更容易理解。
9. 简单了解物理备份(整体数据目录拷贝)
注意:本节为了解,实际操作前务必确认版本、存储引擎、锁定情况,新手不要在生产环境轻易尝试。
9.1 什么是物理备份
- 直接备份 MySQL 的数据文件(data 目录):
- Windows 一般在:
C:ProgramDataMySQLMySQL Server 8.0Data
- Windows 一般在:
- 相当于拷贝整个“数据库文件夹”。