## 7.2 数据库备份方法

本节总结了一些进行备份的一般方法。

### 使用 MySQL Enterprise Backup 进行热备份

MySQL企业版的客户可以使用[MySQL 企业备份](glossary.html#glos_mysql_enterprise_backup)要做的产品[身体的](glossary.html#glos_physical)整个实例或选定的数据库、表或两者的备份。该产品包括以下功能[增加的](glossary.html#glos_incremental_backup)和[压缩的](glossary.html#glos_compressed_backup)备份。备份物理数据库文件使恢复比逻辑技术（如`mysql转储`命令。`InnoDB`使用 a 复制表[热备份](glossary.html#glos_hot_backup)机制。（理想情况下，`InnoDB`表应该代表大部分数据。）来自其他存储引擎的表使用[热备份](glossary.html#glos_warm_backup)机制。有关 MySQL Enterprise Backup 产品的概述，请参阅[第 30.2 节，“MySQL 企业备份概述”](mysql-enterprise-backup.html).

### 使用 mysqldump 进行备份

这[**mysql转储**](mysqldump.html)程序可以进行备份。它可以备份各种表。（看[第 7.4 节，“使用 mysqldump 进行备份”](using-mysqldump.html).)

为了`InnoDB`表，可以使用不锁定表执行联机备份[`--单笔交易`](mysqldump.html#option_mysqldump_single-transaction)选项[**mysql转储**](mysqldump.html).看[第 7.3.1 节，“建立备份策略”](backup-policy.html).

### 通过复制表文件进行备份

MyISAM 表可以通过复制表文件（`*.MYD`,`*。我的我`文件和相关联的`*.sdi`文件）。要获得一致的备份，请停止服务器或锁定并刷新相关表：

```
FLUSH TABLES tbl_list WITH READ LOCK;
```

你只需要一个读锁；这使其他客户端能够在您复制数据库目录中的文件时继续查询表。需要刷新以确保在开始备份之前将所有活动索引页写入磁盘。看[第 13.3.6 节，“LOCK TABLES 和 UNLOCK TABLES 语句”](lock-tables.html)， 和[第 13.7.8.3 节，“FLUSH 语句”](flush.html).

只要服务器不更新任何内容，您也可以简单地通过复制表文件来创建二进制备份。（但请注意，如果您的数据库包含表文件复制方法不起作用`InnoDB`表。此外，即使服务器没有主动更新数据，`InnoDB`可能仍然有修改过的数据缓存在内存中并且没有刷新到磁盘。）

有关此备份方法的示例，请参阅中的导出和导入示例[第 13.2.5 节，“IMPORT TABLE 语句”](import-table.html).

### 制作分隔文本文件备份

要创建包含表数据的文本文件，您可以使用[`选择 * 进入文件 '*`文件名`*' 从 *`tbl_name`*`](select-into.html).该文件是在 MySQL 服务器主机上创建的，而不是在客户端主机上创建的。对于此语句，输出文件不可能已经存在，因为允许覆盖文件会构成安全风险。看[第 13.2.10 节，“SELECT 语句”](select.html).此方法适用于任何类型的数据文件，但只保存表数据，而不保存表结构。

创建文本数据文件的另一种方法（以及包含[`创建表`](create-table.html)备份表的语句）是使用[**mysql转储**](mysqldump.html)与[`- 标签`](mysqldump.html#option_mysqldump_tab)选项。看[第 7.4.3 节，“使用 mysqldump 以分隔文本格式转储数据”](mysqldump-delimited-text.html).

要重新加载分隔文本数据文件，请使用[`加载数据`](load-data.html)要么[**mysql导入**](mysqlimport.html).

### 通过启用二进制日志进行增量备份

MySQL 支持使用二进制日志进行增量备份。二进制日志文件为您提供了在执行备份之后将更改复制到数据库所需的信息。因此，要让服务器恢复到某个时间点，必须在其上启用二进制日志记录，这是 MySQL 8.0 的默认设置；看[第 5.4.4 节，“二进制日志”](binary-log.html).

在您想要进行增量备份（包含自上次完整或增量备份以来发生的所有更改）的那一刻，您应该使用旋转二进制日志[`刷新日志`](flush.html#flush-logs).完成后，您需要将所有二进制日志复制到备份位置，范围从最后一次完整或增量备份到最后一个。这些二进制日志是增量备份；在恢复时，您按照中的说明应用它们[第 7.5 节，“时间点（增量）恢复”](point-in-time-recovery.html).下次进行完整备份时，还应该使用轮换二进制日志[`刷新日志`](flush.html#flush-logs)要么[**mysqldump --flush-logs**](mysqldump.html).看[第 4.5.4 节，“mysqldump - 数据库备份程序”](mysqldump.html).

### 使用副本进行备份

如果您在进行备份时遇到服务器性能问题，一种可以提供帮助的策略是设置复制并在副本而不是源上执行备份。看[第 17.4.1 节，“使用复制进行备份”](replication-solutions-backups.html).

如果要备份副本，则应备份其连接元数据存储库和应用程序元数据存储库（请参阅[第 17.2.4 节，“中继日志和复制元数据存储库”](replica-logs.html)) 当您备份副本的数据库时，无论您选择哪种备份方法。恢复副本的数据后，始终需要此信息来恢复复制。如果您的副本正在复制[`加载数据`](load-data.html)声明，您还应该备份任何`SQL_LOAD-*`副本用于此目的的目录中存在的文件。副本需要这些文件来恢复任何中断的复制[`加载数据`](load-data.html)操作。这个目录的位置就是系统变量的值[`replica_load_tmpdir`](replication-options-replica.html#sysvar_replica_load_tmpdir)（来自 MySQL 8.0.26）或[`slave_load_tmpdir`](replication-options-replica.html#sysvar_slave_load_tmpdir)（在 MySQL 8.0.26 之前）。如果服务器未使用该变量集启动，则目录位置是[`临时目录`](server-system-variables.html#sysvar_tmpdir)系统变量。

### 恢复损坏的表

如果必须恢复`MyISAM`已损坏的表，请尝试使用[`维修台`](repair-table.html)要么[**myisamchk -r**](myisamchk.html)第一的。这应该适用于所有情况的 99.9%。如果[**迈萨姆奇克**](myisamchk.html)失败，见[第 7.6 节，“MyISAM 表维护和崩溃恢复”](myisam-table-maintenance.html).

### 使用文件系统快照进行备份

如果您使用的是 Veritas 文件系统，则可以像这样进行备份：

1.  从客户端程序，执行[`带读锁的刷新表`](flush.html#flush-tables-with-read-lock).

2.  从另一个shell，执行`挂载 vxfs 快照`.

3.  从第一个客户端，执行[`解锁桌子`](lock-tables.html).

4.  从快照复制文件。

5.  卸载快照。

    类似的快照功能可能在其他文件系统中可用，例如 LVM 或 ZFS。
