mysql数据库的备份与恢复

MySQL 备份与恢复完全指南

本文档专门讲 MySQL 的备份(Backup)与恢复(Restore):为什么要备份、有哪些备份方式、mysqldump 怎么用、如何恢复 .sql 文件、一些常见问题与实战建议。每一步都配有详细说明和示例,适合零基础新手跟着做。


目录

  1. 为什么要备份
  2. 备份的基本概念(一定要先理解)
  3. 最常用的备份工具:mysqldump
  4. 逻辑备份:导出/备份(mysqldump 常见用法)
  5. 逻辑恢复:导入/还原(mysql + SOURCE)
  6. 只备份/恢复某个表
  7. 只备份结构或只备份数据
  8. 使用 MySQL 客户端工具备份与恢复(了解)
  9. 简单了解物理备份(整体数据目录拷贝)
  10. 备份策略与实战建议
  11. 常见错误与注意点
  12. 综合示例与速查表

1. 为什么要备份

1.1 可能遇到的风险

  • 手滑执行了 DROP TABLEDELETE FROM ... 无 WHERE,把数据删了。
  • 程序 Bug 写错 SQL,改坏了一大批数据。
  • 磁盘损坏、系统崩溃、误格式化。
  • 勒索软件攻击、黑客入侵。

没有备份,就很难恢复数据;有了备份,通常可以“回到某个时间点”或“至少恢复到最后一次备份时”的状态。

1.2 备份的意义

  • 后悔药:改错数据、误删表时,有备份就能恢复。
  • 迁移:从一台服务器迁到另一台(或从本地迁到云),备份 + 恢复 是最常用方法。
  • 审计/归档:保留一段时间内的数据快照。

2. 备份的基本概念(一定要先理解)

2.1 逻辑备份 vs 物理备份

逻辑备份

  • 把数据库里的表结构、数据“导出”为文本形式的 SQL 脚本(如 backup.sql)。
  • 文件内容是各种 CREATE TABLEINSERT INTO ... VALUES ... 等语句。
  • 恢复时,就是执行这些 SQL,把表和数据再建回来。
  • 工具:mysqldump

物理备份

  • 直接拷贝数据库的数据文件(如 MySQL 的 data 目录里的 .ibd.frm.ibdata1 等)。
  • 对版本、存储引擎、操作系统等要求较高。
  • 通常需要停库或使用专业工具(如 xtrabackup),新手阶段可以先了解概念即可。

新手推荐:先学会“逻辑备份 + 恢复”(mysqldump + mysql),大部分日常需求都能满足。

2.2 备份粒度

可以选择备份:

  • 所有数据库:整库备份,适合整机迁移或全量备份。
  • 某个数据库:只备份一个业务使用的库,如 school
  • 某些表:只备份关键表,如 school.studentsschool.scores
  • 只备份结构 / 只备份数据:有时只要建表语句(结构),不需要数据;或只要数据,不在乎结构。

3. 最常用的备份工具:mysqldump

3.1 mysqldump 是什么

mysqldump 是 MySQL 自带的一个命令行工具,用来做逻辑备份

  • 把你指定的数据库/表导出成一个 .sql 文件。
  • 文件里是 CREATEINSERT 等 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 DATABASEUSE 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 库中的 studentsscores 两张表:

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 DATABASEUSE,会按备份中的内容建库、建表、插数据。
  • 后一种:指定了要导入到的数据库(如 school),备份文件中没有 CREATE DATABASE 时用。

注意:恢复前,如果同名数据库或表已经存在,可能会报错或覆盖数据,动作前务必确认需求。

5.2 方法二:在 mysql 客户端里用 SOURCE

  1. 先登录 MySQL:

    mysql -u root -p
  2. 选择目标数据库(若备份只包含表结构和数据,不含 CREATE DATABASE):

    USE school;
  3. mysql> 下执行:

    SOURCE C:/backup/school_backup.sql;
    • Windows 下路径用 /\ 都可以,例如:C:\backup\school_backup.sql

这样 MySQL 会一行一行执行这个 .sql 文件中的语句,完成恢复。

5.3 常见恢复场景

  1. 全新安装 MySQL 后,恢复之前的 all_backup.sql
    • 直接:mysql -u root -p < all_backup.sql
  2. school 从 A 机迁到 B 机
    • 在 A 机:mysqldump -u root -p school > school_backup.sql
    • school_backup.sql 拷到 B 机。
    • 在 B 机:mysql -u root -p < school_backup.sql

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

一般步骤类似:

  1. 连接到 MySQL 服务器。
  2. 右键某个数据库或表 → 选择 Export / Dump
  3. 选择导出结构和/或数据、选择文件路径。
  4. 恢复时,使用 Import / Run SQL File,选择 .sql 文件执行。

图形界面的本质也是调用类似 mysqldumpmysql 的逻辑,只是帮你生成命令和管理文件,新手可以先练熟命令行,图形工具会更容易理解。


9. 简单了解物理备份(整体数据目录拷贝)

注意:本节为了解,实际操作前务必确认版本、存储引擎、锁定情况,新手不要在生产环境轻易尝试。

9.1 什么是物理备份

  • 直接备份 MySQL 的数据文件(data 目录):
    • Windows 一般在:C:ProgramDataMySQLMySQL Server 8.0Data
  • 相当于拷贝整个“数据库文件夹”。

发表评论