如何创建和恢复 MySQL 数据库备份
如果您将数据存储在 MySQL 数据库中并且不想丢失它们,那么您需要定期进行备份。本文将教您如何通过命令行快速创建 MySQL 数据库的备份并进行恢复。同时,您还可以将数据迁移到另一台服务器。
如何通过命令行使用 mysqldump 创建备份
如果您可以通过控制台(SSH)访问服务器,那么可以非常快速地进行数据库备份和恢复。这种方式能够快速生成数据库转储文件(dump——即数据库的文本版本),比使用 phpMyAdmin 或 Adminer 等工具更高效。数据库转储文件由 SQL 命令组成,用于完整复制数据库。创建转储的命令如下:
$ mysqldump --opt -u [uname] -p[pass] [dbname] > [backupfile.sql]
[uname] —— 数据库用户名(通常为 root)
[pass] —— 数据库密码。如果密码中没有特殊符号或空格,可以紧跟在 -p
后输入,例如 -proot
或 -ppassword
[dbname] —— 数据库名称
[backupfile.sql] —— 备份文件的保存名称
[--opt] —— mysqldump 的可选参数,可以省略
例如,您有一个名为 DrupalDB 的数据库,用户名为 root,密码为 password,备份文件名为 backup.sql,那么命令如下:
$ mysqldump -u root -ppassword DrupalDB > backup.sql
如果您希望在输入命令后单独输入密码(例如密码包含空格或特殊符号),可以使用以下方式:
$ mysqldump -u root -p DrupalDB > backup.sql
您还可以只备份部分表,通过空格列出它们,例如 nodes 和 users:
$ mysqldump -u root -p DrupalDB nodes users > backup.sql
除了备份单个表外,还可以同时备份多个数据库,使用 --databases
参数并通过空格列出需要的数据库:
$ mysqldump -u root -p --databases DrupalDB Drupal7 Drupal8 > backup.sql
如果您需要迁移整个 MySQL 服务器,可以使用 --all-databases
参数备份所有数据库:
$ mysqldump -u root -p --all-databases > alldb_backup.sql
mysqldump 命令还有一些有用的选项:
--add-drop-table —— 在还原前删除已有表(在转储文件中为每个 CREATE TABLE 语句前添加 DROP TABLE)。
--no-data —— 仅复制数据库结构,不包含数据。例如,在备份 Drupal 缓存表时很有用,因为这些表可能包含数十万条无用记录。
--add-lock —— 添加 LOCK TABLES 和 UNLOCK TABLES 语句。注意:对于大型数据库,这可能会导致长时间锁表。
如何创建带压缩的 MySQL 数据库备份
这可能是最实用的方式,因为压缩后文件大小可减少 10–20 倍。对于大型数据库,压缩能显著节省空间。使用 gzip
命令实现压缩:
$ mysqldump -u root -p DrupalDB | gzip -9 > backup.sql.gz
如果您仅想解压文件(而非恢复数据库),使用以下命令:
$ gunzip backup.sql.gz
如何从备份恢复 MySQL 数据库
若要从转储文件恢复数据库,您需要一个空数据库。您可以使用 adminer 或 phpMyAdmin 删除现有表。如果使用了 --add-drop-table
参数,则无需手动删除表,系统会自动覆盖。恢复命令如下:
$ mysql -u root -p DrupalDB < backup.sql
如果备份文件经过压缩,使用以下命令:
gunzip < backup.sql.gz | mysql -u root -p DrupalDB
通过 Adminer 进行备份和恢复(PhpMyAdmin 替代方案)
Adminer 是 PhpMyAdmin 的替代工具,功能相似,但仅由一个小型 PHP 文件组成,使用极为方便:
只需将该文件复制到网站根目录,然后通过浏览器访问:
http://您的网站/adminer-4.2.1.php(可以重命名为 adminer.php 以便使用)
登录后进入需要备份的数据库,例如 Drupal7。
接着点击“导出(Dump)”以导出数据。您还可以选择不导出缓存表等不必要的数据:
要将转储文件重新导入数据库,请使用“导入(Import)”选项卡: