mysql热备份增量备份
连接到服务器¶
用于连接服务器的数据库用户及其密码由xtrabackup --user
andxtrabackup –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
.
如果您不想使用上述任何选项,您可以额外使用 rsync
或cp
恢复文件。
笔记
在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
在最后一步使用了,备份仍然是一致的,但在这种情况下,服务器将执行回滚阶段。
非特殊说明,本文版权归 陈阳的博客 所有,转载请注明出处.