安装
wget https://downloads.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.23-16/binary/tarball/percona-xtrabackup-8.0.23-16-Linux-x86_64.glibc2.17.tar.gz
tar xf percona-xtrabackup-8.0.23-16-Linux-x86_64.glibc2.17.tar.gz/bin/
xbcloud #与流式备份结合,将备份存储到云上对象存储
xbcloud_osenv #对xbcloud的封装,可以自动去取OpenStack上的os_xxx变量
xbcrypt #加密解密
xbstream #加压流式备份集
xtrabackup #常用的备份恢复工具
1、xtrabackup活跃的分为两个大版本,2.4和8.0;目前最新版本8.0.34,xtrabackup2.4使用与MySQL5.6和5.7 xtrabackup8.0s适用于MySQL8.0。这两个版本不能混用,因为MySQL8.0的redolog和数据字典发生了变化。
2、早期版本的innobackupex,是一个软连接,用来实现对innodb引擎的备份,8.0中已经移除了,所以推荐使用8.0。
XtrBackup的基本用法
XtrBackup的备份恢复包括三个步骤:备份、prepare、恢复,下面详细解释
备份
- 将物理文件拷贝到备份目录中
Prepare
- 应用redo log,将数据文件恢复到备份结束时的一致性状态
恢复
- 将备份文件恢复至数据目录下。恢复阶段就是拷贝文件,所以也可以结合自己的场景手动拷贝
1 创建备份用户
create user backup_user@'%' identified by '123';
grant reload,process,show databases,replication client,show view on *.* to backup_user@'%';
grant backup_admin,system_variables_admin on *.* to backup_user@'%';
grant select,insert,create ,alter on PERCONA_SCHEMA.* to backup_user@'%';
grant select on mysql.component to backup_user@'%';
grant select on performance_schema.keyring_keys to backup_user@'%';
grant select on performance_schema.log_status to backup_user@'%';
/*
reload :用于指定flush table with read lock和flush no_write_to_binlog tables;必需权限
replication client: 用于执行show master status 如果对从库进行备份还需要执行show slave status;必需权限
backup_admin: 用于执行lock instance for backup;必需权限
process:用于执行show engine innodb status|show processlist;必需权限
system_variables_admin: 用于在增量备份时执行set global mysqlbackup.backupid=xxx;非必需权限
super: 执行--kill-long-queries-timeout|从库指定--safe-slave-backup需要重启备份;非必需权限
show view: 用于检查information_schema.tables中的信息,是否存在MyISAM表;必需权限
mysql.component:如果使用page tracking来进行增量备份;
*/
2 全量备份
xtrabackup --user=backup_user --password=123 --backup --parallel=10 --target-dir=/backup/full
//--parallel多线程备份
2.1 备份文件介绍
backup-my.cnf 记录了innodb的相关参数,在Prepare会使用
xtrabackup_binlog_info 记录了备份结束时的一致性位置点信息,在搭建从库时会使用
xtrabackup_checkpoints 记录了备份的类型和LSN信息
xtrabackup_info 记录了详细的备份信息
xtrabackup_logfile 用来保存拷贝的redo log,如果是在从库,需要指定--slave-info来保存binlog点位
xtrabackup_tablespaces 记录表空间和版本信息
3 Prepare
xtrabackup --prepare --user-memory=2G --target-dir=/backup/full
这个阶段会启动一个嵌入的innodb实例来进行Crash Recovery。--user-memory=2G用来控制着缓冲池的大小。
prepare结束后会生成redo ib_logfile0 ib_logfile1和临时表空间
5 恢复
xtrabackup --defaults-file=/etc/my.cnf --copy-back --parallel=10 --target-dir=/backup/full
需要保证源数据库目录为空
--copy-back 拷贝
--move-back 移动 速度快
6 启动数据库
chown -R mysql.mysql ./*
增量备份
增量备份时会扫描每个数据页,检查它的LSN是否大于上次备份完成时的LSN(to_lsn),只有大于的数据才会备份。
增量备份时会对每个innodb文件生成一个.delta文件(差异文件,二进制)
和.meta文件(描述文件)
,对于非innodb的表,每次都是全量备份
1、创建一个全量备份
xtrabackup --user=backup_user --password=123 --backup --parallel=10 --target-dir=/backup/full
2、查看xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 118341136054
last_lsn = 118341136064
flushed_lsn = 118341136054
3、第一次增量备份
xtrabackup --user=backup_user --password=123 --backup --parallel=10 --target-dir=/backup/inc1 --incremental-basedir=/backup/full
4、查看文件
backup_type = incremental
from_lsn = 118341136054
to_lsn = 118341137446
last_lsn = 118341137456
flushed_lsn = 118341137446
5、第二次增量备份
xtrabackup --user=backup_user --password=123 --backup --parallel=10 --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
增量备份恢复
1、首先对全量备份进行Prepare
xtrabackup --prepare --apply-log-only --target-dir=/backup/full
## --apply-log-only #应用redo log,不回滚当前备份中未提交的事务,因为在下个备份结果集中可能会提交
2、对第一个增量备份结果集进行Prepare
xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1
3、对最后一个增量备份Prepare,此时不需要执行--apply-log-only了,如果指定的话,在恢复到数据库实例时会回滚未提交的事务,拉长恢复时间
xtrabackup --prepare --target-dir=/backup/full --incremental-dir=/backup/inc2
4、恢复数据
xtrabackup --defaults-file=/etc/my.cnf --move-back --target-dir=/backup/ful
基于数据页的增量备份
基本的增量备份是要扫描所有的数据页,当发生修改的数据页较少时,这种效率比较低下。MySQL8.0.17开始支持页面跟踪Page Tracking
可以用来跟踪指定LSN之后发生修改页面。下面做一些演示:
安装插件
root@ 16:28: [test]> install component "file://component_mysqlbackup";
Query OK, 0 rows affected (0.01 sec)
root@ 16:29: [test]> select count(*) from mysql.component where component_urn='file://component_mysqlbackup';
+----------+
| count(*) |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
root@ 16:29: [test]> select * from mysql.component where component_urn='file://component_mysqlbackup';
+--------------+--------------------+------------------------------+
| component_id | component_group_id | component_urn |
+--------------+--------------------+------------------------------+
| 1 | 1 | file://component_mysqlbackup |
+--------------+--------------------+------------------------------+
1 row in set (0.00 sec)
备份恢复
1、全量备份
xtrabackup --user=backup_user --password=123 --backup --target-dir=/backup/full --page-tracking
执行完成之后会在MySQL数据目录下生成一个#ib_archive目录
2、增量备份
xtrabackup --user=backup_user --password=123 --backup --parallel=10 --target-dir=/backup/inc1 --incremental-basedir=/backup/full --page-tracking
恢复过程和传统的恢复一样,参考上面的操作。
压缩备份
1、xtrabackup8.0支持quicklz和lz4两种压缩算法,早期的版本支持quicklz。两种压缩算法和不指定压缩执行时间上相近,压缩率大约50%
2、如果是quicklz算法,在解压之前需要安装qpress,并移动到/usr/bin下。
3、解压后默认不会删除原来的压缩文件,可以指定--remove-original
删除。即使不删除恢复时也不会拷贝压缩文件。
xtrabackup --user=backup_user --password=123 --backup --compress=lz4 --target-dir=/backup/full #压缩
xtrabackup --decompress --target-dir=/backup/full3 #解压
后续操作和传统的一样。
流式备份
xtrabackup8.0不再支持tar
格式,只支持xbstream
,有压缩效果
1、备份
xtrabackup --user=backup_user --password=123 --backup --stream=xbstream --parallel=10 >/backup/full.xbstream
2、解压
xbstream -x -p 10 -C /backup/stream < /backup/full.xbstream
-x #解压
-p #并行
-C #指定解压目录
3、恢复
xtrabackup --defaults-file=/etc/my.cnf --copy-back --parallel=10 --target-dir=/backup/stream
流式备份常用案例
1、流式备份+压缩
xtrabackup --user=backup_user --password=123 --backup --stream=xbstream --parallel=10 |lz4 > /backup/full_backup.lz4
mkdir -p /backup/stream
lz4 -d /backup/full_backup.lz4 |xbstream -x -p 10 -C /backup/stream
恢复和传统的一样
2、备份到远程服务器
xtrabackup --user=backup_user --password=123 --backup --stream=xbstream --parallel=10 |lz4 |ssh [email protected] "cat -> /backup/full2.lz4"
ssh [email protected] "(nc -l 3366 > /backup/full_backup.lz4 &)" && xtrabackup --user=backup_user --password=123 --backup --stream=xbstream --parallel=10 |lz4| nc 192.168.131.12 3366
xtrabackup --user=backup_user --password=123 --backup --stream=xbstream --parallel=10 |lz4 |sshpass -p 123 ssh -o StrictHostKeychecking=no [email protected] "cat -> /backup/full2.lz4"
备份到远程并解压:
xtrabackup --user=backup_user --password=123 --backup --stream=xbstream --parallel=10 |lz4 |ssh [email protected] "cat - | lz4 -d | xbstream -x -p 10 -C /backup/stream"
限速:
xtrabackup --user=backup_user --password=123 --backup --stream=xbstream --parallel=10 |pv -q -L20m |lz4|ssh [email protected] "cat - > /backup/full2.lz4"