发布于: 2022-08-16 10:30:32

mysql热备份增量备份 

连接到服务器

用于连接服务器的数据库用户及其密码由xtrabackup --userandxtrabackup –password选项指定:

$ xtrabackup --user=username --password=password --backup \
  --target-dir=/data/bkps/


创建具有完整备份所需的最低权限的数据库用户的 SQL 示例如下:

mysql> CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO  'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;



备份周期 - 完整备份

创建备份

要创建备份,xtrabackup请使用xtrabackup --backup option您还需要指定一个xtrabackup --target-dir选项,即存储备份的位置,如果InnoDB数据或日志文件未存储在同一目录中,您可能还需要指定它们的位置。如果目标目录不存在,xtrabackup 会创建它。如果该目录确实存在并且为空,则 xtrabackup 将成功。xtrabackup 不会覆盖现有文件,它将因操作系统错误 17 失败,file exists.

要启动备份过程,请运行:

$ xtrabackup --backup --target-dir=/data/backups/

这会将备份存储在/data/backups/如果指定相对路径,则目标目录将相对于当前目录。

准备备份

使用该选项进行备份后xtrabackup --backup

恢复备份

警告

在恢复之前需要准备好备份。

$ xtrabackup --copy-back --target-dir=/data/backups/

如果您不想保存备份,可以使用xtrabackup --move-back将备份数据移动到datadir.

如果您不想使用上述任何选项,您可以额外使用 rsynccp恢复文件。

笔记

datadir恢复备份之前必须为空。同样重要的是要注意 MySQL 服务器需要在执行还原之前关闭。您无法恢复到datadir正在运行的 mysqld 实例(导入部分备份时除外)。

rsync可用于恢复备份的命令示例如下所示:

$ rsync -avrP /data/backup/ /var/lib/mysql/

您应该检查恢复的文件是否具有正确的所有权和权限。

由于将保留文件的属性,因此在大多数情况下,您需要mysql在启动数据库服务器之前将文件的所有权更改为,因为它们将归创建备份的用户所有:

$ chown -R mysql:mysql /var/lib/mysql

现在数据已恢复,您可以启动服务器。

增量备份

xtrabackup 工具和 innobackupex 工具都支持增量备份。增量备份仅备份自上次备份以来已更改的数据。

您可以在每个完整备份之间进行多个增量备份。例如,您可以每周进行一次完整备份,每天进行一次增量备份,或者每天进行一次完整备份,每小时进行一次增量备份。

增量备份之所以有效,是因为每个InnoDB页面都包含一个日志序列号 (LSN)。LSN是整个数据库的系统版本号每个页面都LSN显示了它最近的更改时间。

增量备份复制LSN比先前增量或完整备份更新的每个页面LSN有两种算法用于查找要复制的此类页面集。第一个适用于所有服务器类型和版本,LSN通过读取所有数据页面直接检查页面。第二个,可用于Percona Server for MySQL,启用更改页面跟踪 服务器上的功能,它将在页面被更改时记录下来。然后,该信息将被写在一个紧凑的单独的所谓位图文件中。xtrabackup 二进制文件使用该文件仅读取增量备份所需的数据页。此功能可能会节省许多读取请求。如果 xtrabackup 二进制文件找到位图文件,则默认启用后一种算法。xtrabackup --incremental-force-scan即使位图数据可用,也可以指定 读取所有页面。

创建增量备份

要进行增量备份,请像往常一样从完整备份开始。xtrabackup 二进制文件将调用的文件写入xtrabackup_checkpoints备份的目标目录。该文件包含一行显示 to_lsn,这是LSN备份结束时的数据库。 使用以下命令创建完整备份:

$ xtrabackup --backup --target-dir=/data/backups/base

如果您查看 xtrabackup_checkpoints 文件,您应该会看到类似的内容,具体取决于您的 LSN nuber:

backup_type = full-backupedfrom_lsn = 0to_lsn = 1626007last_lsn = 1626007compact = 0recover_binlog_info = 1

现在您有了完整备份,您可以根据它进行增量备份。使用以下命令:

$ xtrabackup --backup --target-dir=/data/backups/inc1 \--incremental-basedir=/data/backups/base

/data/backups/inc1/ 目录现在应该包含 delta 文件,例如 ibdata1.delta 和 test/table1.ibd.delta。这些代表了自LSN 1626007如果您检查 xtrabackup_checkpoints此目录中的文件,您应该会看到与以下类似的内容:

backup_type = incrementalfrom_lsn = 1626007to_lsn = 4124244last_lsn = 4124244compact = 0recover_binlog_info = 1

from_lsn是备份的起始 LSN,对于增量备份,它必须与to_lsn前一个/基本备份的(如果它是最后一个检查点)相同。

现在可以将此目录用作另一个增量备份的基础:

$ xtrabackup --backup --target-dir=/data/backups/inc2 \--incremental-basedir=/data/backups/inc1

准备增量备份

增量备份的xtrabackup --prepare步骤与完整备份的步骤不同。在完整备份中,执行两种类型的操作以使数据库保持一致:从日志文件中针对数据文件重放已提交的事务,以及回滚未提交的事务。在准备增量备份时,您必须跳过未提交事务的回滚,因为在备份时未提交的事务可能正在进行中,并且很可能会在下一次增量备份中提交。您应该使用 xtrabackup--apply-log-only选项来防止回滚阶段。

从您创建的完整备份开始,您可以对其进行准备,然后对其应用增量差异。回想一下,您有以下备份:

/data/backups/base/data/backups/inc1/data/backups/inc2

要准备基本备份,您需要像往常一样运行 xtrabackup –prepare,但要防止回滚阶段:

$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base

输出应以类似于以下内容的文本结尾:

InnoDB: Shutdown completed; log sequence number 1626007161011 12:41:04 completed OK!

要将第一个增量备份应用于完整备份,请运行以下命令:

$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \--incremental-dir=/data/backups/inc1

这会将增量文件应用于 中的文件/data/backups/base,从而及时将它们前滚到增量备份的时间。然后它像往常一样将重做日志应用于结果。最终数据在 中 /data/backups/base


准备第二次增量备份是一个类似的过程:将增量应用于(修改的)基础备份,您将及时将其数据前滚到第二次增量备份的点:

$ xtrabackup --prepare --target-dir=/data/backups/base \--incremental-dir=/data/backups/inc2

笔记

xtrabackup --apply-log-only合并除最后一个以外的所有增量时应使用。这就是前一行不包含 xtrabackup--apply-log-only选项的原因。即使xtrabackup --apply-log-only在最后一步使用了,备份仍然是一致的,但在这种情况下,服务器将执行回滚阶段。


延伸阅读
    发表评论