XtraBackup

XtraBackup

一、安装

1.1 从 Percona存储库Yum安装Percona XtraBackup

官网链接

  1. 安装percona-release配置工具

    $ yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
    
    

    注意:RHEL / Centos 5 不支持直接从远程位置安装软件包,因此您需要先下载软件包并使用 rpm 手动安装

    $ wget https://repo.percona.com/yum/percona-release-latest.noarch.rpm
    $ rpm -ivH percona-release-latest.noarch.rpm
    
  2. 测试存储库

    通过执行以下命令,确保现在可以从存储库中获得包:

    $ yum list | grep percona
    

    可以看到类似下面的内容:

    ...
    percona-xtrabackup.x86_64                2.3.10-1.el7                  percona-release-x86_64
    percona-xtrabackup-22.x86_64             2.2.13-1.el7                  percona-release-x86_64
    percona-xtrabackup-22-debuginfo.x86_64   2.2.13-1.el7                  percona-release-x86_64
    percona-xtrabackup-24-debuginfo.x86_64   2.4.26-1.el7                  percona-release-x86_64
    percona-xtrabackup-80.x86_64             8.0.29-22.1.el7               percona-release-x86_64
    percona-xtrabackup-80-debuginfo.x86_64   8.0.29-22.1.el7               percona-release-x86_64
    percona-xtrabackup-debuginfo.x86_64      2.3.10-1.el7                  percona-release-x86_64
    percona-xtrabackup-test.x86_64           2.3.10-1.el7                  percona-release-x86_64
    percona-xtrabackup-test-22.x86_64        2.2.13-1.el7                  percona-release-x86_64
    percona-xtrabackup-test-24.x86_64        2.4.26-1.el7                  percona-release-x86_64
    percona-xtrabackup-test-80.x86_64        8.0.29-22.1.el7               percona-release-x86_64
    ...
    
  3. 启用存储库

    $ percona-release enable-only tools release
    

    如果Percona XtraBackup 打算与上游 MySQL 服务器结合使用,您只需要启用tools 存储库

  4. 通过运行如下命令来安装Percona XtraBackup

    $ yum install percona-xtrabackup-24
    

    注意:为了在版本 7 之前的 CentOS 上成功安装Percona XtraBackup ,需要先安装libev该软件包。libev可以从EPEL存储库安装此软件包.

  5. 如需完全卸载,请删除所有已安装的软件包

    $ yum remove percona-xtrabackup
    

1.2 从二进制压缩包安装 Percona XtraBackup

# 下载包
$ wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.24/binary/tarball/percona-xtrabackup-2.4.24-Linux-x86_64.glibc2.12.tar.gz

# 解压
$ tar xvf percona-xtrabackup-2.4.21-Linux-x86_64.glibc2.12.tar.gz

二、准备部分

2.1 权限问题

无论使用xtrabackup还是 innobackupex,都涉及到两个参与者:调用程序的用户 - 系统用户- 以及在数据库服务器中执行操作的用户 -数据库用户。请注意,这些是不同位置的不同用户,即使他们可能具有相同的用户名。

连接到数据库

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

$ xtrabackup --user=DVADER --password=14MY0URF4TH3R --backup --target-dir=/data/bkps/
$ innobackupex --user=DBUSER --password=SECRET /path/to/backup/dir/
$ innobackupex --user=LUKE  --password=US3TH3F0RC3 --stream=tar ./ | bzip2 -

如果没有使用xtrabackup --user选项,Percona XtraBackup 将假定数据库用户的名称是执行它的系统用户。

其他连接选项:

选项 描述
--port 使用 TCP/IP 连接到数据库服务器时使用的端口
--socket 连接到本地数据库时使用的套接字。
--host 使用 TCP/IP 连接到数据库服务器时使用的主机。

注意:在多个服务器实例的情况下,必须指定正确的连接参数(端口、套接字、主机),以便xtrabackup与正确的服务器通信。

所需的权限

一旦连接到服务器,为了执行备份,您将需要 服务器数据目录中文件系统级别READEXECUTE权限。

数据库用户需要对要备份的表、数据库具有以下权限:

  • RELOADLOCK TABLES(除非 –no-lock选项已指定),为了以便在开始复制文件之前使用FLUSH TABLES WITH READ LOCKFLUSH ENGINE LOGS,当使用备份锁时需要LOCK TABLES FOR BACKUPLOCK BINLOG FOR BACKUP 权限

  • REPLICATION CLIENT为了获得二进制日志位置

  • CREATE TABLESPACE为了导入表

  • PROCESS为了运行SHOW ENGINE INNODB STATUS(这是强制性的),并且可以选择查看在服务器上运行的所有线程

  • SUPER为了在复制环境中启动/停止副本线程

  • CREATE权限以创建 PERCONA_SCHEMA.xtrabackup_history数据库和表

  • ALTER权限以升级 PERCONA_SCHEMA.xtrabackup_history数据库和表

  • INSERT权限,以便将历史记录添加到 PERCONA_SCHEMA.xtrabackup_history

  • SELECT特权,以便使用 innobackupex --incremental-history-nameinnobackupex --incremental-history-uuid为了让功能在PERCONA_SCHEMA.xtrabackup_history表中查找innodb_to_lsn

三、备份周期

3.1 全量备份

3.1.1 创建备份

xtrabackup使用 xtrabackup --backup option参数进行创建备份,通过xtrabackup --target-dir指定存储备份的位置。如果innodb数据或日志文件未存储在同一目录中,还需要指定它们的位置;如果目标目录不存在,xtrabackup会自动创建,如果目录存在且为空,那么将备份成功;xtrabackup 不会覆盖现有文件,会报错Errcode: 17 - File exists

备份命令为:

# 针对本地数据库
$ xtrabackup --backup --target-dir=/backup/mysql/ --user=root --password=123456

# 远端数据库
$ xtrabackup --backup --target-dir=/backup/mysql/ --user=root --password=123456 --port=3306 --host=127.0.0.1

会输出类似如下内容:

...
220902 14:50:04 Finished backing up non-InnoDB tables and files
220902 14:50:04 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '2754619'
xtrabackup: Stopping log copying thread.
.220902 14:50:04 >> log scanned up to (2754628)

220902 14:50:04 Executing UNLOCK TABLES
220902 14:50:04 All tables unlocked
220902 14:50:04 [00] Copying ib_buffer_pool to /backup/mysql/ib_buffer_pool
220902 14:50:04 [00]        ...done
220902 14:50:04 Backup created in directory '/backup/mysql/'
220902 14:50:04 [00] Writing /backup/mysql/backup-my.cnf
220902 14:50:04 [00]        ...done
220902 14:50:04 [00] Writing /backup/mysql/xtrabackup_info
220902 14:50:04 [00]        ...done
xtrabackup: Transaction log of lsn (2754619) to (2754628) was copied.
220902 14:50:05 completed OK!

备份目录下会出现如下文件:

[root@VM-8-6-centos mysql]# ll -h
total 13M
-rw-r----- 1 root root  487 Sep  2 14:50 backup-my.cnf
-rw-r----- 1 root root  436 Sep  2 14:50 ib_buffer_pool
-rw-r----- 1 root root  12M Sep  2 14:50 ibdata1
drwxr-x--- 2 root root 4.0K Sep  2 14:50 mysql
drwxr-x--- 2 root root 4.0K Sep  2 14:50 performance_schema
drwxr-x--- 2 root root  12K Sep  2 14:50 sys
drwxr-x--- 2 root root 4.0K Sep  2 14:50 testdb
-rw-r----- 1 root root  135 Sep  2 14:50 xtrabackup_checkpoints
-rw-r----- 1 root root  445 Sep  2 14:50 xtrabackup_info
-rw-r----- 1 root root 2.5K Sep  2 14:50 xtrabackup_logfile

注意:备份时间会根据数据库大小决定,随时都可以取消备份过程都是安全的,因为它不会修改数据库。

3.1.2 准备备份

备份好后需要首先对其进行准备以恢复它,数据文件在准备好之前时间点是不一致的,因为他们在程序运行时是在不同时间被复制的,并且在发生这种情况时它们可能已经被更改了。如果依然使用这些文件启动,数据库将会检测到损坏并自定崩溃来防止在损坏的数据上运行。通过xtrabackup --prepare步骤可以让文件在单个时刻完全一致,保证数据可以恢复。

注意:

准备部分可以再其他任意机器进行,不需要位于原始机器上。

可以使用较新的Percona XtraBackup版本来准备使用旧版本创建的备份,反之则不行。

准备备份的命令:

$ xtrabackup --prepare --target-dir=/backup/mysql/

输出如下:

...
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 2755112
220902 15:13:25 completed OK!

注意:不建议在准备过程中中断,可能会导致数据文件损坏,备份将不可用。

3.1.3 恢复备份

恢复命令:

$ xtrabackup --copy-back --target-dir=/backup/mysql/

# 如果不想要备份,可以使用下面的命令直接移动。
$ xtrabackup --move-back --target-dir=/backup/mysql/

注意:

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

注意文件属性变更为MySQL的用户。

之后就可以重启数据库了。

3.2 增量备份

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

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

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

注意:

增量备份不会将数据文件与之前备份的数据文件进行对比,因此,在部分备份之后运行增量备份可能导致数据不一致;

增量备份读取页面并将其LSN与上次备份的LSN对比,必须拥有完整备份才能恢复增量更改;如果没有完整备份作为基础,增量备份将毫无用处。

3.2.1 创建增量备份

要进行增量备份,需要从完整备份开始。xtrabackup二进制文件将调用的xtrabackup_checkpoints文件写入备份的目标目录,类似下面的内容,其中to_lsn是备份结束时的LSN:

[root@VM-8-6-centos mysql]# cat xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 2754619
last_lsn = 2754628
compact = 0
recover_binlog_info = 0
flushed_lsn = 2754628

注意:

最后一个检查点to_lsn和最后一个复制点last_lsn之间存在差异,说明在备份过程中服务器上有一些流量变化。

当结束完整备份后,就可以根据下面的命令进行增量备份:

$ xtrabackup --backup --user=root --password=123456 --target-dir=/backup/mysql01 --incremental-basedir=/backup/mysql

/backup/mysql01就是增量备份的目录 ,查看此目录下的xtrabackup_checkpoints文件,内容如下:

[root@VM-8-6-centos mysql01]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2754619
to_lsn = 2754619
last_lsn = 2754628
compact = 0
recover_binlog_info = 0
flushed_lsn = 2754628

from_lsn是备份的起始LSN,对于增量备份,它必须与前一个备份的to_lsn相同。

接下来,可以以这次增量备份为起始准备下一次的增量备份了。

3.2.2 准备增量备份

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

注意:

如果不使用xtrabackup --apply-log-only选项来阻止回滚阶段,那么增量备份将毫无作用。事务回滚后,将无法应用进一步的增量备份。

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

/backup/mysql
/backup/mysql01

使用下面的命令准备:

$ xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql

输出类似下面的内容:

...
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 2754637
InnoDB: Number of pools: 1
220905 13:50:59 completed OK!

日志序列号应该与基本备份的to_lsn值相同。

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

$ xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql --incremental-dir=/backup/mysql01

这会将增量文件应用于/backup/mysql 中,从而及时将它们前滚到增量备份的时间,然后将重做日志应用于结果,最终数据在/backup/mysql 中,而不是在增量目录中。

同样,LSN应该与之前检查第一次增量备份时看到的一致。

警告:

xtrabackup不支持使用同一个增量备份目录准备两份备份。不要多次xtrabackup --prepare使用同一个增量备份目录运行。

注意:

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

都准备好后,增量备份和完整备份相同,以同样的方式进行恢复。

3.3 压缩备份

Percona XtraBackup支持压缩备份:可以使用 xbstream 压缩或解压缩本地或流式备份。

3.3.1 创建压缩备份

使用xtrabackup –compress选项进行压缩备份:

xtrabackup --compress使用qpress工具,可以安装percona-release包来安装:

$ sudo percona-release enable tools
$ sudo apt update
$ sudo apt install qpress

$ xtrabackup --backup --user=root --password=123456 --compress --target-dir=/backup/compressed/

输出如下内容:

...
220905 16:00:42 Executing UNLOCK TABLES
220905 16:00:42 All tables unlocked
220905 16:00:42 [00] Compressing ib_buffer_pool to /backup/compressed/ib_buffer_pool.qp
220905 16:00:42 [00]        ...done
220905 16:00:42 Backup created in directory '/backup/compressed/'
220905 16:00:42 [00] Compressing /backup/compressed/backup-my.cnf.qp
220905 16:00:42 [00]        ...done
220905 16:00:42 [00] Compressing /backup/compressed/xtrabackup_info.qp
220905 16:00:42 [00]        ...done
xtrabackup: Transaction log of lsn (2754619) to (2754628) was copied.
220905 16:00:43 completed OK!

如果需要加快压缩速度,可以使用并行压缩,使用xtrabackup –compress-threads 选项。

例如:

$ xtrabackup --backup --user=root --password=123456 --compress --compress-threads=4 --target-dir=/data/compressed/

3.3.2 准备压缩备份

在准备备份之前,必须解压缩所有文件,xtrabackup --decompress选项可以用于解压缩备份。

$ xtrabackup --decompress --target-dir=/backup/compressed/

xtrabackup --parallel可以与xtrabackup --decompress选项一起使用以同时解压缩多个文件。

Percona XtraBackup不会自动删除压缩文件。为了清理备份目录,请使用该 xtrabackup --remove-original选项。如果文件没有被删除,它们不会被复制或移动到数据目录(如果 xtrabackup --copy-back或被xtrabackup --move-back使用)。

解压缩文件后,可以使用xtrabackup --prepare选项来准备备份:

$ xtrabackup --prepare --target-dir=/backup/compressed/

输入类似内容:

...
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 2755112
220905 16:23:17 completed OK!

现在已经准备好备份目录了。

3.3.3 恢复备份

xtrabackup有一个xtrabackup --copy-back选项,可以将备份恢复到服务器的 datadir:

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

该选项将所有与数据相关的文件复制回服务器datadir,由服务器的my.cnf配置文件确定。检查输出的最后一行以获取成功消息:

170223 13:49:13 completed OK!

将数据复制回来后验证文件权限。您可能需要调整权限。例如,以下命令更改文件位置的所有者:

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

现在datadir包含恢复的数据。已准备好启动服务器。

posted @ 2022-09-06 16:18  忘川的彼岸  阅读(334)  评论(0编辑  收藏  举报