MySQL 8.0 参考手册  / 第 7 章备份与恢复  /  7.2 数据库备份方式

7.2 数据库备份方式

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

使用 MySQL Enterprise Backup 进行热备份

MySQL Enterprise Edition 的客户可以使用 MySQL Enterprise Backup产品对 整个实例或选定的数据库、表或两者进行物理备份。该产品包括 增量备份和 压缩备份的功能。备份物理数据库文件使恢复比命令等逻辑技术快得多mysqldumpInnoDB使用 热备份机制复制表。(理想情况下,InnoDB表应该代表数据的绝大部分。)使用热备份复制来自其他存储引擎的表机制。有关 MySQL Enterprise Backup 产品的概述,请参阅第 24.2 节,“MySQL Enterprise Backup 概述”

使用 mysqldump 或 mysqlhotcopy 进行备份

mysqldump程序和 mysqlhotcopy脚本可以进行备份。 mysqldump比较通用,因为它可以备份各种表。mysqlhotcopy仅适用于某些存储引擎。(参见第 7.4 节,“使用 mysqldump 进行备份”第 4.6.10 节,“mysqlhotcopy — 数据库备份程序”。)

对于表,可以使用mysqldump的选项 InnoDB执行不锁定表的在线备份 。请参阅第 7.3.1 节,“建立备份策略”--single-transaction

通过复制表文件进行备份

对于使用自己的文件表示每个表的存储引擎,可以通过复制这些文件来备份表。例如, MyISAM表存储为文件,因此很容易通过复制文件( 、 和 files )来*.frm进行 *.MYD备份*.MYI。要获得一致的备份,请停止服务器或锁定并刷新相关表:

FLUSH TABLES tbl_list WITH READ LOCK;

你只需要一个读锁;这使其他客户端可以在您复制数据库目录中的文件时继续查询表。需要刷新以确保在开始备份之前将所有活动索引页写入磁盘。请参阅第 13.3.5 节,“LOCK TABLES 和 UNLOCK TABLES 语句”第 13.7.6.3 节,“FLUSH 语句”

只要服务器不更新任何内容,您也可以通过复制所有表文件来简单地创建二进制备份。mysqlhotcopy脚本使用此方法。 (但请注意,如果您的数据库包含InnoDB表 ,则表文件复制方法不起作用。mysqlhotcopyInnoDB表不起作用,因为InnoDB 它不一定将表内容存储在数据库目录中。另外,即使服务器没有主动更新数据, InnoDB可能仍然有修改数据缓存在内存中而不刷新到磁盘。)

制作带分隔符的文本文件备份

要创建包含表数据的文本文件,您可以使用 . 该文件是在 MySQL 服务器主机上创建的,而不是客户端主机。对于此语句,输出文件不能已经存在,因为允许覆盖文件会构成安全风险。请参阅 第 13.2.9 节,“SELECT 语句”。该方法适用于任何类型的数据文件,但只保存表数据,不保存表结构。 SELECT * INTO OUTFILE 'file_name' FROM tbl_name

另一种创建文本数据文件(连同包含 CREATE TABLE备份表语句的文件)的方法是使用带有 选项的mysqldump 。--tab请参阅 第 7.4.3 节,“使用 mysqldump 以分隔文本格式转储数据”

要重新加载分隔文本数据文件,请使用 LOAD DATAmysqlimport

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

MySQL 支持增量备份:您必须使用--log-bin启用二进制日志记录的选项启动服务器;参见第 5.4.4 节,“二进制日志”。二进制日志文件为您提供了将在执行备份之后所做的更改复制到数据库所需的信息。此时你想进行增量备份(包含自上次完整备份或增量备份以来发生的所有更改),你应该通过使用旋转二进制日志FLUSH LOGS. 完成后,您需要将所有二进制日志复制到备份位置,这些二进制日志的范围从最后一次完整或增量备份到最后一次备份。这些二进制日志是增量备份;在恢复时,您可以按照 第 7.5 节“使用二进制日志进行时间点(增量)恢复”中的说明应用它们。下次进行完整备份时,还应该使用 FLUSH LOGSmysqldump --flush-logsmysqlhotcopy --flushlog轮换二进制日志。请参阅第 4.5.4 节,“mysqldump — 数据库备份程序”第 4.6.10 节,“mysqlhotcopy — 数据库备份程序”

使用副本进行备份

如果在进行备份时源服务器出现性能问题,一种有用的策略是设置复制并在副本而不是源服务器上执行备份。请参阅第 17.3.1 节,“使用复制进行备份”

如果要备份副本服务器 ,无论备份方法如何,都应在备份副本数据库时备份其源信息和中继日志信息存储库(请参阅第 17.2.2 节,“中继日志和复制元数据存储库” )你选。恢复副本的数据后,总是需要这些信息文件来恢复复制。如果您的副本正在复制 LOAD DATA语句,您还应该备份SQL_LOAD-*存在于副本用于此目的的目录中的所有文件。副本需要这些文件来恢复任何中断 LOAD DATA操作的复制。该目录的位置是 slave_load_tmpdir系统变量。如果服务器不是使用该变量集启动的,则目录位置是 tmpdir系统变量的值。

恢复损坏的表

如果您必须恢复MyISAM已损坏的表,请先尝试使用 REPAIR TABLEmyisamchk -r恢复它们。这应该适用于 99.9% 的所有情况。如果 myisamchk失败,请参阅 第 7.6 节,“MyISAM 表维护和崩溃恢复”

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

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

  1. 从客户端程序,执行FLUSH TABLES WITH READ LOCK.

  2. 从另一个 shell,执行mount vxfs snapshot.

  3. 从第一个客户端,执行 UNLOCK TABLES.

  4. 从快照复制文件。

  5. 卸载快照。

其他文件系统(例如 LVM 或 ZFS)中可能也有类似的快照功能。