XtraBackup
XtraBackup
一、安装
1.1 从 Percona存储库Yum安装Percona XtraBackup
-
安装
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
-
测试存储库
通过执行以下命令,确保现在可以从存储库中获得包:
$ 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 ...
-
启用存储库
$ percona-release enable-only tools release
如果Percona XtraBackup 打算与上游 MySQL 服务器结合使用,您只需要启用
tools
存储库 -
通过运行如下命令来安装Percona XtraBackup
$ yum install percona-xtrabackup-24
注意:为了在版本 7 之前的 CentOS 上成功安装Percona XtraBackup ,需要先安装
libev
该软件包。libev
可以从EPEL存储库安装此软件包. -
如需完全卸载,请删除所有已安装的软件包
$ 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 --user
andxtrabackup –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与正确的服务器通信。
所需的权限
一旦连接到服务器,为了执行备份,您将需要 服务器数据目录中文件系统级别READ
的EXECUTE
权限。
数据库用户需要对要备份的表、数据库具有以下权限:
-
RELOAD
和LOCK TABLES
(除非–no-lock
选项已指定),为了以便在开始复制文件之前使用FLUSH TABLES WITH READ LOCK
和FLUSH ENGINE LOGS
,当使用备份锁时需要LOCK TABLES FOR BACKUP
和LOCK 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-name
或innobackupex --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
包含恢复的数据。已准备好启动服务器。