MySQL的备份工具——MySQL企业版备份

2024-03-12 08:55:25 浏览数 (1)

在上一篇MySQL备份中我们提到MySQL的备份工具包括用于逻辑备份的SQL语句、将SQL语句与操作系统的命令结合的物理备份工具(例如,“LOCK TABLE”)、MySQL企业版备份(物理备份)、“mysqldump”,及第三方工具。本文将详细介绍MySQL企业版备份工具。

MySQL企业版备份工具是一款支持多平台的热备份工具,通过命令行调用“mysqlbackup”执行操作,针对InnoDB表进行优化,并支持MySQL的其他存储引擎。MySQL企业版具有如下功能:

  • 增量备份
  • 差异备份
  • 单一文件备份
  • 流形式发送到其他存储或服务器
  • 备份至磁带
  • 备份至云
  • 备份加密
  • 备份压缩
  • 部分备份
  • 可传输表空间

对于InnoDB存储引擎,MySQL企业版备份能够执行热备份,(备份可以在应用程序连接时运行)备份不会阻挡数据库的正常操作。对于其他的存储引擎,MySQL企业版执行温备份,应用程序可以对数据库进行只读操作。

备份InnoDB时,MySQL企业版备份将备份InnoDB的原生文件,包括:

  • ibdata*:共享表空间文件,包含系统表空间及部分用户表的数据。
  • mysql.ibd:mysql表空间文件,包含数据路径。
  • .ibd:独立表空间文件和通用表空间文件。
  • undo_*:Undo日志表空间文件。
  • ib_logfile*:从“ib_logfile*”文件抽取的备份文件名为“ibbackup_logfile”,包括备份期间发生更改产生的Redo日志信息。

备份非InnoDB时,需要MySQL中包含至少一个innoDB表,默认情况下,MySQL企业版将备份MySQL服务器数据路径下的全部文件,如果用户指定了“--only-known-file-types”选项,备份将仅包含MySQL相关的文件。

使用例——完整备份

注意,必须在MySQL服务器的主机上启动“mysqlbackup”。

代码语言:javascript复制
mysqlbackup --user=username --password --port=portnumber --backup_dir=backup-directory command

“--backup_dir”选项指定存储备份文件的路径。“command”命令包括“backup”执行备份的初始部分,“backup-and-apply-log”执行备份的初始部分及第二部分,第二部分包括备份期间更改的数据内容。

使用例——单一文件备份

使用“backup-to-image”命令可以将备份写入一个单一文件,单一文件易于管理,并能够流式传送至其他服务器、磁带,云等。

代码语言:javascript复制
mysqlbackup -uuser -ppassword --backup_dir=temp-backup-dir --backup-image=image-file backup-to-image

“--backup-image”选项指定用于存储备份的文件路径和名称。“--backup_dir”选项指定一个临时文件夹用于存储备份的元数据。

备份过程

  1. “mysqlbackup”开启一个MySQL服务器的连接。
  2. “mysqlbackup”执行一个InnoDB在线备份。(该步骤不会干扰正常的数据库处理)
  3. 当“mysqlbackup”执行接近完成时,它将执行“LOCK INSTANCE FOR BACKUP”语句。该语句将阻挡DDL,但不会阻挡DML。
  4. 执行“FLUSH TABLES tbl_name, ...WITH READ LOCK”锁定非InnoDB表进行备份
  5. 备份结束,释放表和实例。

增量备份

增量备份仅备份从上一次备份结束后产生变化的数据,上一次备份可以是完整备份,也可以是一次增量备份。可以大幅提高备份速度,降低存储要求。例如:

代码语言:javascript复制
mysqlbackup --user=username --password --port=portnumber --incremental --incremental-base=history:last_backup --backup_dir=incr-backup-directory backup
  • “--incremental”选项表示执行一个增量备份。
  • “--incremental-base”选项用于指定上一次备份,并将上一次备份用于这次的增量备份。
  • “--incremental-base=history:last_backup”选项将使“mysqlbackup”查询上次记录在“bakupu_history”表中的“end_lsn”的值。此外,用户也可以指定“dir:directory_path”为“--incremental-base”指定包含上一次备份的路径。
  • “--start-lsn”用于替换“--incremental-base”选项,用户可以指定上一次备份中包含最高的LSN,用于此次的增量备份。

差异备份

差异备份属于特殊的增量备份,与增量备份的区别是上一次的备份必须是完整备份。例如:

代码语言:javascript复制
mysqlbackup --user=username --password --port-portnumber --incremental --incremental-base=history:last_full_backup --backup_dir=incr-backup-directroy backup

用户也可以使用“backup-to-image”替换“backup”命令,并指定“--backup-image”选项,备份成为单一文件。

“validate”操作

“validate”命令用于校验备份的完整性,检查每个数据叶的校验和。

校验备份文件:

代码语言:javascript复制
mysqlbackup --backup-image=image-file validate

校验备份文件夹

代码语言:javascript复制
mysqlbackup --backup-dir=backup-directory validate

恢复过程

  1. 关闭MySQL服务器
  2. 删除服务器数据路径下的全部文件
  3. 运行“mysqlbackup”从完整备份中恢复文件
  4. 恢复增量或差异备份的数据(如果适用)
  5. 应用备份文件后产生的二进制日志
  6. 启动MySQL服务器

恢复命令

“copy-back”:恢复备份路径(已使用“apply-log”保证一致性)。例如,将“backup-dir”中的文件恢复到服务器的数据路径:

代码语言:javascript复制
mysqlbackup --backup-dir=backup-dir copy-backup

“copy-back-and-apply-log”:恢复单一文件或数据路径,并执行应用日志操作。例如,从“image-file”中恢复到服务器的数据路径,并使用“temp-backup-dir”存储临时文件:

代码语言:javascript复制
mysqlbackup --backup-dir=temp-backup-dir --backup-image=image-file copy-back-and-apply-log

当使用“copy-back”命令时,“mysqlbackup”将复制数据文件、日志及其他的备份文件至其原来的位置,在恢复过程中,“mysqlbackup”无法从MySQL服务器查询相关的配置信息,只能通过标准的配置文件获得相关的选项,如果用户希望恢复到不同的服务器上,需要通过“--defaults-file”选项指定一个配置文件进行。 恢复增量备份时,首先需要恢复一个正确的基本备份,以用于增量或差异备份,其次使用“--incremental”选项进行恢复操作。例如:

代码语言:javascript复制
mysqlbackup --incremental-backup-dir=incr-backup-dir --incremental copy-back-and-apply-log
代码语言:javascript复制
mysqlbackup --backup-dir=temp-backup-dir --backup-image=image-file --incremental copy-backup-and-apply-log

更新操作

“mysqlbackup”可以在完整备份时,利用“apply-log”选项进行更新。

代码语言:javascript复制
mysqlbackup --backup-dir=backup-dir apply-log

“backup-dir”中的完整备份可以使用“apply-incremental-backup”选项更新为增量备份。

代码语言:javascript复制
mysqlbackup --incremental-backup-dir=incr-backup-dir --backup-dir=backup-dir apply-incremental-backup

单一文件操作

“mysqlbackup”可以将备份的路径转换为单一文件,例如:

代码语言:javascript复制
mysqlbackup --backup_dir=backup-dir --backup-image=image-file backup-dir-to-image

列出单一文件的内容:

代码语言:javascript复制
mysqlbackup --backup-image=image-file list-image

从单一文件中抽取文件:

代码语言:javascript复制
mysqlbackup --backup-image=image-file --src-entry=file-to-extract --dst-entry=file-to-extract extract

“--src-entry”:指定一个文件或路径用于抽取。

“--dst-entry”:指定一个路径用于从单一文件中抽取文件或路径。

0 人点赞