备份与恢复

MySQLBeginner
立即练习

简介

在系统管理中,数据丢失不是「是否会发生」的问题,而是「何时发生」的问题。无论原因是硬件故障、软件缺陷还是人为失误,关键数据丢失都可能造成灾难性后果。因此,备份与恢复是数据库管理中最重要的技能之一。

在本实验中,你将完成一次完整的「灾难恢复」模拟。你会从一个正常运行的数据库开始,安全地创建备份,然后删除数据库来模拟灾难,最后使用备份将数据库恢复。

你将学习如何:

  • 使用 mysqldump 工具创建逻辑备份。
  • 通过删除数据库来模拟灾难性故障。
  • 从备份文件恢复数据库,使其回到原始状态。

逻辑备份保存的是可以重新创建数据库结构和数据的 SQL 语句。这与复制原始数据库文件的物理备份不同。两种方式都很常见,但逻辑备份更容易让初学者阅读和理解。

了解这一点很重要,因为不同的备份类型解决的问题略有不同。逻辑备份具有可移植性,并且人类可读;物理备份通常更接近存储引擎以及底层恢复机制。

创建备份

首先,确认当前确实有一个需要保存的数据库。我们已经预先在名为 app_db 的数据库中填充了一些用户数据。

检查当前数据:

sudo mysql -e "SELECT * FROM app_db.users;"

你应该会看到一个用户列表,其中包括 Alice、Bob 和 Charlie。

现在,使用 mysqldump 工具创建逻辑备份。逻辑备份本质上会导出一个文本文件,其中包含从头重建数据库所需的全部 SQL 命令,例如 CREATE TABLE 和 INSERT。

因此,备份文件不是神秘的二进制数据块。它通常是一个 SQL 脚本,之后可以将该脚本重新执行到数据库服务器中,以重建数据库结构和数据。

运行以下命令,将数据库保存到名为 backup.sql 的文件中:

sudo mysqldump app_db > ~/project/backup.sql

命令说明:

  • mysqldump:用于导出数据库内容的工具。
  • app_db:要备份的具体数据库。
  • >:Linux 重定向运算符,将命令输出写入文件。
  • ~/project/backup.sql:目标文件路径。

确认备份文件已经创建:

ls -l ~/project/backup.sql

你还可以查看文件开头的内容,检查其中的 SQL 命令:

head -n 20 ~/project/backup.sql

模拟数据丢失

现在进入比较危险的环节。为了测试恢复方案,我们需要模拟一次灾难。这里将模拟误删生产数据库的情况。

警告:下面的命令会永久删除数据。在真实的生产环境中,除非你完全确定要销毁这些数据,否则绝不能运行此命令。

保留这一步是因为,只有在实际数据丢失后证明恢复确实有效,备份才真正有意义。始终未经测试的备份方案只能算是一种假设。

删除(卸载)app_db 数据库:

sudo mysql -e "DROP DATABASE app_db;"

尝试访问该数据库,确认灾难已经发生:

sudo mysql -e "USE app_db;"

你应该会看到以下错误:

ERROR 1049 (42000): Unknown database 'app_db'

这表示数据库已经不存在。如果这是一个没有备份的真实生产服务器,后果会非常严重。

恢复数据库

幸运的是,我们有 backup.sql 文件,可以使用它恢复数据。

但是,mysqldump 默认只导出数据库的内容,不会导出用于创建数据库本身的命令。由于我们已经彻底删除了 app_db,因此首先需要创建一个空数据库,作为数据恢复的目标。

这一点可以帮助初学者理解备份究竟保存了什么。除非所使用的命令和选项明确包含相关内容,否则备份并不是包含所有对象的神奇快照。

创建空数据库:

sudo mysql -e "CREATE DATABASE app_db;"

从备份文件导入数据:

sudo mysql app_db < ~/project/backup.sql

恢复命令说明:

  • sudo mysql:连接到数据库服务器。
  • app_db:告诉 MySQL 将哪个数据库作为恢复目标。
  • <:Linux 输入重定向运算符。它读取文件内容,并将内容传递给 mysql 命令,就像你在命令行中逐条输入这些内容一样。

如果命令执行后没有输出,通常表示命令已经成功执行。

恢复过程本质上是将 SQL 语句重新传递给数据库服务器。换句话说,恢复通常就是有控制地重新执行逻辑备份中保存的指令。

验证数据恢复

任何备份方案中最后也是最重要的一步,就是验证。恢复命令没有报错,并不代表数据一定正确。我们必须进行检查。

这是系统运维中最重要的操作习惯之一:成功不只是「命令执行结束」,而是「执行结束后系统状态正确」。

再次查询 users 表:

sudo mysql -e "SELECT * FROM app_db.users;"

成功标准:

你应该会看到原始数据:

+----+---------+---------------------+
| id | name    | email               |
+----+---------+---------------------+
|  1 | Alice   | alice@example.com   |
|  2 | Bob     | bob@example.com     |
|  3 | Charlie | charlie@example.com |
+----+---------+---------------------+

如果看到 Alice、Bob 和 Charlie,说明你已经成功从这次灾难中恢复了数据!

总结

在本实验中,你成功完成了完整的灾难恢复流程。你学习了如何:

  • 备份:使用 mysqldump 将数据库导出到文件。
  • 销毁:使用 DROP DATABASE 模拟数据丢失事件。
  • 恢复:使用输入重定向 < 导入 SQL 转储文件。
  • 验证:确认恢复后数据的完整性。

定期备份是防止数据丢失的主要手段。在真实环境中,你应该自动化这一流程,并经常测试数据恢复操作。