15、XtraBackup

内容分享2小时前发布
0 0 0

安装XtraBackup

官方文档: https://docs.percona.com/percona-xtrabackup/8.0/

https://www.percona.com/downloads#percona-xtrabackup


Percona XtraBackup

A hot backup solution for MySQL

Select Product

15、XtraBackup

Package Download Options:

percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17-minimal.tar.gz
percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17-minimal.tar.gz.sho256sum
percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz
percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz.sho256sum

User Manual Documentation



# 创建安装目录
sudo mkdir -p /usr/local/xtrabackup

# 解压到安装目录
sudo tar -xzvf percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz -C /usr/local/xtrabackup --strip-components=1

# 创建符号链接到系统 PATH
sudo ln -sf /usr/local/xtrabackup/bin/* /usr/local/bin/

# 验证安装
xtrabackup --version

# ls bin/
 xbcloud  xbcloud_osenv  xbcrypt  xbstream  xtrabackup

各个文件的具体作用如下:


xbcloud
: 与流式备份相结合,将备份存储到云服务的对象存储上。
xbcloud_osenv
: 对 xbcloud 进行了二次封装,可自动读取 OpenStack 环境中的 OS_xxx 变量。
xbcrypt
: 用来加解密。
xbstream
: 用来解压流式备份集。
xtrabackup
: 大家常用的备份恢复工具。


创建备份用户

备份用户需要以下权限:

RELOAD:用于执行 FLUSH TABLES WITH READ LOCK 和 FLUSH NO_WRITE_TO_BINLOG TABLES,必需权限。

REPLICATION CLIENT:用于执行 SHOW MASTER STATUS,必需权限。如果是在从库进行备份,还需要执行 SHOW SLAVE STATUS。

BACKUP_ADMIN:用于执行 LOCK INSTANCE FOR BACKUP,必需权限。在 MySQL 5.7 中无需设置。

PROCESS:用于执行 SHOW ENGINE INNODB STATUS,SHOW PROCESSLIST,必需权限。

SYSTEM_VARIABLES_ADMIN:增量备份时执行 SET GLOBAL mysqlbackup_backupid=xxx 操作,非必需权限。在 MySQL 5.7 中无需设置。

SUPER:非必需权限。两种场景下需要:

指定了
--kill-long-queries-timeout
,需要 KILL 慢查询。从库备份指定了
--safe-slave-backup
,需要重启复制。

SHOW VIEW:在 XtraBackup 8.0 中,会通过下面这个 SQL 来判断备份实例中是否存在 MyISAM 表。如果有则加全局读锁。对于一个普通用户,查询 INFORMATION_SCHEMA.TABLES,只能看到 information_schema 库中的表信息。如果要查看其它表,需要该表级别权限,常用的是 SELECT 权限,但 SELECT 权限能读取表中的数据,不满足合规要求。所以就选择了 SHOW VIEW 这个既能满足需求,又无实际影响的表级别权限。在 MySQL 5.7 中无需设置。


SELECT COUNT(*) FROM information_schema.tables WHERE engine = 'MyISAM' OR engine = 'RocksDB'

如果使用了 Page Tracking 来进行增量备份,还需要 mysql.component 的查询权限。在 MySQL 5.7 中无需设置。

如果指定了
--history
,还需要 PERCONA_SCHEMA.xtrabackup_history 的 SELECT, INSERT, CREATE, ALTER 权限。

具体的授权语句如下:


CREATE USER `backup_user`@`localhost` IDENTIFIED BY `backup_pass`;
GRANT RELOAD, PROCESS, SHOW DATABASES, REPLICATION CLIENT, SHOW VIEW ON *.* TO `backup_user`@`localhost`;
GRANT BACKUP_ADMIN, SYSTEM_VARIABLES_ADMIN ON *.* TO `backup_user`@`localhost`;

GRANT SELECT, INSERT, CREATE, ALTER ON `PERCONA_SCHEMA`.* TO `backup_user`@`localhost`;
GRANT SELECT ON `mysql`.`component` TO `backup_user`@`localhost`;
GRANT SELECT ON `performance_schema`.`keyring_component_status` TO `backup_user`@`localhost`;
GRANT SELECT ON `performance_schema`.`log_status` TO `backup_user`@`localhost`;
GRANT SELECT ON `performance_schema`.`replication_group_members` TO `backup_user`@`localhost`

XtraBackup 的备份原理

XtraBackup 的备份恢复一般包括以下三个阶段:

备份:拷贝物理文件到备份目录中。Prepare:应用 redo log,将数据文件恢复到备份结束时的一致性状态。恢复:将备份文件恢复至数据库数据目录下。恢复阶段,本质上就是拷贝文件,除了 XtraBackup,我们也可手动 copy。

备份示例:


$ xtrabackup --user=backup_user --password=backup_pass --backup --parallel=1 --target-dir=/data/backup/full --register-redo-log-consumer

也可以直接使用root用户备份,


xtrabackup --defaults-file=/data/mysql/mysql3306/my3306.cnf -S /data/mysql/mysql3306/mysql.sock --user=root  --backup --parallel=1 --target-dir=/data/backup/full --register-redo-log-consumer

注意,这里指定
--backup --parallel
为 1 只是方便说明原理。

备份过程日志(示例):


[Note] [MY-011825] [Xtrabackup] recognized server arguments: --  
datadir=/data/mysql/3306/data --log_bin=mysql-bin --server-id=1 --  
register_redo_log_consumer=1  

[Note] [MY-011825] [Xtrabackup] recognized client arguments: --  
socket=/data/mysql/3306/data/mysql.sock --user=backup_user --password=* --backup=1 --  
parallel=1 --target-dir=/data/backup/full  

xtrabackup version 8.0.35--30 based on MySQL server 8.0.35 Linux (aarch64) (revision id: 6beb4b49)  

version_check Connecting to MySQL server with DSN  
'dbi:mysql::mysql_read_default_group=xtrabackup;mysql_socket=/data/mysql/3306/data/mysql.sock' as 'backup_user' (using password: YES).  

WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.  

version_check Connected to MySQL server  

version_check Executing a version check against the server...  

version_check Done.  

[Note] [MY-011825] [Xtrabackup] Connecting to MySQL server host: localhost, user: backup_user, password: set, port: not set, socket: /data/mysql/3306/data/mysql.sock  

[Note] [MY-011825] [Xtrabackup] Using server version 8.0.35  

[Note] [MY-011825] [Xtrabackup] Executing LOCK INSTANCE FOR BACKUP ...  

...

备份过程主要包括:

创建 redo log 拷贝线程,从最近的 checkpoint LSN 开始拷贝 redo log。创建数据文件拷贝线程,拷贝 ibdata, undo tablespaces 和以 .ibd 结尾的文件。ibd 文件拷贝完成后,加全局读锁 (
backup_start
)。拷贝非 ibd 文件。如果设置了
--slave-info
,则会执行 SHOW SLAVE STATUS,结果记录在 xtrabackup_slave_info 中。如果设置了
--binlog-info
,则会执行 SHOW MASTER STATUS,结果记录在 xtrabackup_binlog_info 中。停止 redo log 拷贝线程。释放全局读锁 (
backup_finish
)。拷贝 ib_buffer_pool 和 ib_lru_dump 文件。将备份的相关信息记录在 xtrabackup_info 文件中。

备份目录中重点关注的文件:


# cd /data/backup/full/
# ls

backup-my.cnf mysql    mysql.ibd    sys    xtrabackup_binlog_info
xtrabackup_logfile
ib_buffer_pool mysql-bin.000007 performance_schema undo_001 xtrabackup_checkpoints
xtrabackup_tablespaces
ibdata1    mysql-bin.index   sbtest    undo_002  xtrabackup_info

查看备份信息文件:


# cat xtrabackup_info

uuid = beefc829-b734-llee-a276-000c297lb39b
name =
tool_name = xtrabackup
tool_command = --user=backup_user --password=... --backup --parallel=1 --target-dir=/data/backup/full --register-redo-log-consumer
tool_version = 8.0.35-30
ibbackup_version = 8.0.35-30
server_version = 8.0.35
start_time = 2024-01-20 09:39:01
end_time = 2024-01-20 09:39:23
lock_time = 8
binlog_pos = filename 'mysql-bin.000007', position '8927', GTID of the last change '4baf943e-b731-11ee-b2f3-000c2971b39b:1-114731'
innodb_from_lsn = 0
innodb_to_lsn = 1506458203
partial = N
incremental = N
format = file
compressed = N
encrypted = N

二进制日志信息:


# cat xtrabackup_binlog_info

mysql-bin.000007    8927   4baf943e-b731-11ee-b2f3-000c2971b39b:1-114731

恢复

Prepare 阶段:


$ xtrabackup --prepare --target-dir=/data/backup/full

在这个阶段,xtrabackup 会启动一个嵌入的 InnoDB 实例来进行 Crash Recovery。这个实例 Buffer Pool 的大小由
--use-memory
指定,默认是 100M。如果想缩短 Prepare 阶段的耗时,可适当增大
--use-memory
的值。

还原阶段:


$ xtrabackup --defaults-file=/etc/my_3307.cnf --copy-back --target-dir=/data/backup/full

启动实例:


$ chown mysql.mysql -R /data/mysql/3307/data/
$ /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my_3307.cnf &

XtraBackup的常见用法

全库备份

主库备份

$ xtrabackup --user=backup_user --password=backup_pass --backup --parallel=10 --target-dir=/data/backup/full

如果备份过程中提示:


[Note] [MY-012894] [InnoDB] Unable to open './#innodb_redo/#ib_redo368' (error: 1504).  
[ERROR] [MY-011825] [Xtrabackup] read_logfile() failed.

需要添加一个
--register-redo-log-consumer
参数。

从库备份

$ xtrabackup --user=backup_user --password=backup_pass --backup --parallel=10 --slave-info --target-dir=/data/backup/full

恢复:


$ xtrabackup --prepare --use-memory=2G --target-dir=/data/backup/full

还原:


$ xtrabackup --defaults-file=/etc/my_3307.cnf --copy-back --parallel=10 --target-dir=/data/backup/full

copy-back完成后,检查目标目录的权限。必要时,修改其属主属性。


# chown -R mysql.mysql /data/mysql/3307/data

增量备份

增量备份的原理

XtraBackup在做增量备份时,会扫描数据文件的每个页,检查其LSN是否大于上次备份完成时的LSN(xtrabackup_checkpoints中的to_lsn),如果大于则备份。

增量备份的用法

首先,创建一个全量备份:


$ xtrabackup --user=backup_user --password=backup_pass --backup --target-dir=/data/backup/base

查看备份集中xtrabackup_checkpoints的内容:


# cat /data/backup/base/xtrabackup_checkpoints

backup_type = full-backuped
from_lsn = 0
to_lsn = 1725793191
last_lsn = 1787093225
flushed_lsn = 1734032975
redo_memory = 0
redo_frames = 0

进行第一次增量备份:


$ xtrabackup --user=backup_user --password=backup_pass --backup --target-dir=/data/backup/inc1 --incremental-basedir=/data/backup/base

进行第二次增量备份:


$ xtrabackup --user=backup_user --password=backup_pass --backup --target-dir=/data/backup/inc2 --incremental-basedir=/data/backup/inc1

基于增量备份进行恢复:

Prepare:

对全备进行prepare,必须指定
--apply-log-only
参数。指定此参数,则只会应用redo log,而不会回滚未提交的事务。


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

对第一个增量备份集进行prepare,同样需指定
--apply-log-only
参数。


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

对最后一个增量备份进行prepare,无需指定
--apply-log-only
参数。当然,也可指定,此时,未提交事务的回滚将在数据库启动时进行。


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

恢复:


$ xtrabackup --defaults-file=/etc/my_3307.cnf --copy-back --target-dir=/data/backup/base/

压缩备份

压缩备份需通过
--compress
指定压缩算法。


$ xtrabackup --user=backup_user --password=backup_pass --backup --compress --target-dir=/data/backup/compress

在 XtraBackup 8.0 中,支持两种压缩算法:quicklz 和 lz4,默认是 quicklz 。在 XtraBackup 2.4 中只支持 quicklz 。

对于压缩备份集,在 Prepare 之前,必须先解压。


# xtrabackup --decompress --target-dir=/data/backup/compress/

解压后,默认不会删除原来的压缩文件。如果要删除,需指定
--remove-original

注意:如果使用的是 quicklz 算法,在执行解压操作之前,必须先安装 qpress(qpress 的下载地址是 http://www.quicklz.com/)。
下载后解压,会在当前目录生成一个可执行文件 -qpress,将其移至 /usr/bin 下。具体命令如下:


# tar xvf qpress-11-linux-x64.tar
# mv qpress /usr/bin/

解压后备份集,就可以进行 Prepare 和恢复了。


# xtrabackup --prepare --target-dir=/data/backup/compress/
# xtrabackup --defaults-file=/etc/my_3307.cnf --copy-back --target-dir=/data/backup/compress/

注意,使用
--compress
进行压缩备份,就只能使用 quicklz 和 lz4 这两种算法。如果要使用其它压缩算法,必须结合流式备份。


加密备份

XtraBackup的加密功能是基于libgcrypt库实现的,目前支持AES128、AES192和AES256三种算法。

创建加密备份:


# 生成密钥
# openssl rand -base64 24
9J8jxdF89a0PYpipYFScJ113tAsuC29L
# 生成24位的随机字节,以Base64编码输出。

$ echo -n "9j8jxdF89a0PYpiFyFSd113tAsuC29L" > /data/backup/keyfile

$ xtrabackup --user=backup_user --password=backup_pass --backup --target-dir=/data/backup/encrypt --encrypt=AES256 --encrypt-key-file=/data/backup/keyfile

解密备份集:


$ xtrabackup --decrypt=AES256 --target-dir=/data/backup/encrypt --encrypt-key-file=/data/backup/keyfile

解密后,默认不会删除原来的加密文件,如果要删除,需指定
--remove-original
参数。

恢复还原:


$ xtrabackup --prepare --target-dir=/data/backup/encrypt
$ xtrabackup --defaults-file=/etc/my_3307.cnf --copy-back --target-dir=/data/backup/encrypt

流式备份

所谓的流式备份,即将备份通过流的方式输出到STDOUT,而不是具体的备份文件。结合管道,可将多个功能组合在一起,如压缩、加密、流量控制等。

创建流式备份:


$ xtrabackup --user=backup_user --password=backup_pass --backup --stream=xbstream --parallel=10 > /data/backup/stream/backup.xbstream

使用xbstream解压备份集:


$ xbstream -x --parallel 10 -C /data/backup/stream/extract < /data/backup/stream/backup.xbstream

这里的
-x
代表解压,
--parallel
指定并行度,
-C
指定解压的目录。

恢复还原:


$ xtrabackup --prepare --target-dir=/data/backup/stream/extract/
$ xtrabackup --defaults-file=/etc/my_3307.cnf --copy-back --target-dir=/data/backup/stream/extract/

流式备份的其它常见使用场景:

流式备份 + 压缩(以lz4加密算法为例):


$ xtrabackup --backup --stream=xbstream --parallel=10 | lz4 > full_backup.lz4
$ lz4 -d full_backup.lz4 | xbstream -x --parallel 10 -C /data/backup/stream/extract

直接备份到远程服务器:


$ xtrabackup --backup --stream=xbstream --parallel=10 | lz4 | ssh root@192.168.79.20 "cat -> /data/backup/stream/full_backup.lz4"

注意:这里没有指定远程服务器的密码,是因为使用了免密码登录。如果没有设置免密码登录,可通过sshpass指定密码,如:


$ xtrabackup --backup --stream=xbstream --parallel=10 | lz4 | sshpass -p 123456 ssh -o StrictHostKeychecking=no root@192.168.79.20 "cat -> /data/backup/stream/full_backup.lz4"

直接备份到远程服务器并解压:


$ xtrabackup --backup --stream=xbstream --parallel=10 | lz4 | 
ssh root@192.168.79.20 'cat - | lz4 -d | /usr/local/xtrabackup/bin/xbstream -x --parallel 10 -C /data/backup/stream/extract'

流量限速:


$ xtrabackup --backup --stream=xbstream --parallel=10 | lz4 | 
pv -q -L 20m | ssh root@192.168.79.20 "cat -> /data/backup/stream/full_backup.lz4"


pv
中的
-q
指的是 quiet,不输出进度信息,
-L
指的是传输速率,20m 指的是 20MB。


XtraBackup的常见报错

执行过程中报错

1. 执行过程中提示 “error while loading shared libraries: libproc2.so.0”


xtrabackup: error while loading shared libraries: libproc2.so.0: cannot open shared
object file: No such file or directory

解决方法:


yum install procps-ng procps-ng-devel

如果提示已经安装:


# find /usr/ -name "libproc2.so.0"
/usr/local/lib/libproc2.so.0
# export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib

设置环境变量 LD_LIBRARY_PATH,用于指定系统在寻找动态链接库时需要查找的额外目录。

2. DDL
如果待备份实例是 MySQL 5.7,不要在备份过程中执行 DDL,否则会导致备份失败。

3. 文件句柄数过小


InnoDB: Error number 24 means 'Too many open files'

调整执行 xtrabackup 的系统用户的最大文件句柄数。


# vi /etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535

© 版权声明

相关文章

暂无评论

none
暂无评论...