xrabackup

概述

优势

  • 备份速度快,物理备份可靠
  • 备份过程不会打断正在执行的事务(正常情况下无需长时间锁表)
  • 能够基于压缩等功能节约磁盘空间和流量
  • 自动备份校验
  • 还原速度快
  • 可以流传输将备份传输到另一台机器上

原理

  • 全备原理
    • 备份开始时首先会开启一个后台检测进程,实时监测mysql redo的变化,一旦发现有新的日志写入,立刻将日志记入后台日志文件xtrabackup_log中,
    • 之后复制innodb的数据文件,复制结束后,在执行flush tables with readlock,然后复制 .frm MYI MYD 等文件,最后执行 unlock tables,停止 xtrabackup_log
  • 增量备份
    • 首先完成一个完全备份,并记录下此时检查点LSN
    • 然后增量备份时,比较表空间中每个页的LSN是否大于上次备份的LSN,若是,则备份该页并记录检查点的LSN

备份流程图

  • 启动一个线程读取重做日志,在整个备份过程中每秒钟读取一次重做日志
  • 备份 InnoDB表空间
  • 对 MySQL 上只读锁,锁定非 InnoDB 表
    • 如无自定义非 InnoDB 表,会跳过此步骤
    • 锁会锁住整个 MySQL,因为担心一个交易操作,跨越 InnoDB 和 非 InnoDB 中的操作,所有加锁
    • 8.0 后续可能优化,8.0 提供一个备份使用的锁,无需加读锁
  • 刷新日志并记录与日志相关的信息,释放锁
  • 备份之前没有备份的日志文件和元数据文件,结束

参数

  • –defaults-file:指定 mysql 配置文件路径
  • –stream:指定流备份格式(tar/xbstream)
    • PS:使用流备份并ssh传输远端时,需注意配置ssh 免密,不然流复制过程中输入密码体验比较差
  • –compress:启用压缩
  • –compress-threads=3:指定同时压缩的线程数
  • –compress-chunk-size=1024K:指定压缩的缓冲区大小
  • –parallel=8:指定启动并发备份线程的数量(一个数据文件只会有一个进程完成备份)
  • –slave-info:从库生成备份时需指定此参数,打印 master打印 的名字和位点信息,并记录到 xtrabackup_slave_info 文件中
  • -t tmp/:指定临时文件存储的位置

使用:

  • 创建备份用户
1
2
create user 'xtrabackup_user'@'localhost' identified by 'backupUserPasswd';
GRANT SELECT, RELOAD, PROCESS, SHOW DATABASES, LOCK TABLES, REPLICATION CLIENT,REPLICATION SLAVE, EVENT ON *.* TO 'xtrabackup_user'@'localhost';

全备/增备

  • 全备
1
2
xtrabackup --defaults-file=/data/mysql/mysql_data/my_3306.cnf \
--backup --user='xtrabackup_user' --password='backupUserPasswd'  --target-dir=./backupfile/full
  • 增备
1
2
3
4
xtrabackup --defaults-file=/data/mysql/mysql_data/my_3306.cnf \
--backup --user='xtrabackup_user' --password='backupUserPasswd' \
--incremental-basedir=./backupfile/full \
--target-dir=./backupfile/inc1
  • 增备之上的增备
1
2
3
4
xtrabackup --defaults-file=/data/mysql/mysql_data/my_3306.cnf \
--backup --user='xtrabackup_user' --password='backupUserPasswd' \
--incremental-basedir=./backupfile/inc1 \
--target-dir=./backupfile/inc2

Tar格式的流备份

1
2
3
xtrabackup --defaults-file=/data/mysql/mysql_data/my_3306.cnf  \
--user='xtrabackup_user' --password='backupUserPasswd' \
--backup --stream=tar > ./backupfile/db_full_bk.tar

tar 格式压缩备份

1
2
3
xtrabackup --defaults-file=/data/mysql/mysql_data/my_3306.cnf  \
--user='xtrabackup_user' --password='backupUserPasswd' \
--backup --stream=tar | gzip - > ./backupfile/db_full_bk.tgz

tar 格式压缩并传输到远端

1
2
3
xtrabackup --defaults-file=/data/mysql/mysql_data/my_3306.cnf  \
--user='xtrabackup_user' --password='backupUserPasswd' \
--backup --stream=tar | gzip | ssh -p22 root@远端IP "cat - > /data/tmp/db_full_bk.tgz"

xbstream 格式流备份

1
2
3
4
xtrabackup  --defaults-file=/data/mysql/mysql_data/my_3306.cnf \
--user='xtrabackup_user' --password='backupUserPasswd' \
--compress --compress-threads=4 --parallel=4 \
--stream=xbstream --backup > ./backupfile/db_full_bk.xbstream

xbstream 格式流备份并传输到远端

1
2
3
4
xtrabackup  --defaults-file=/data/mysql/mysql_data/my_3306.cnf \
--user='xtrabackup_user' --password='backupUserPasswd' \
--compress --compress-threads=4 --parallel=4 \
--stream=xbstream --backup | ssh -p22 root@远端IP "cat - > /data/tmp/db_full_bk.xbstream"

恢复

prepare

  • 全备
1
xtrabackup --prepare  --user-memory=1G --target-dir=backupfile/
  • 增备
1
2
3
4
# 注意加 --apply-log-only 参数
xtrabackup --prepare --apply-log-only  --user-memory=1G --target-dir=2021-03-13_01-15-01_full
# 仅恢复最后一个备份时,不加 --apply-log-only
xtrabackup --prepare --user-memory=1G --target-dir=2021-03-13_01-15-01_full  --incremental-dir=2021-03-14_01-15-01_inc

copy-back/move-back

1
2
3
4
# 通过 cp 恢复数据文件
xtrabackup --defaults-file=/data/mysql/data/mysql_data/my_3306.cnf --copy-back  --target-dir=./backupfile/
# 通过 mv 文件恢复(适用于空间/时间不足时)
xtrabackup --defaults-file=/data/mysql/data/mysql_data/my_3306.cnf --move-back  --target-dir=./backupfile/

xbstream 提取文件

1
2
3
4
5
6
7
8
9
# 解报
xbstream -x < db_full_bk.xbstream -C backupfile/
# 安装 qpress,xbstream 解压缩需要依赖 qpress 工具
wget https://repo.percona.com/yum/release/7/RPMS/x86_64/qpress-11-3.el7.x86_64.rpm
yum -y install qpress-11-3.el7.x86_64.rpm
# 解压缩
sudo xtrabackup --parallel=4 --decompress --target-dir=backupfile/
# 删除 .qp 结尾的压缩文件
find backupfile/  -name '*.qp'  -exec rm -f {} \;

高级功能

节流

  • 以 block 进行读写限制,达到节流的效果
    • 读写读写 –> 读写等待
  • throttle=1 : 1表示1s内读写1个 bolock 进行等待,直到下一秒才进行拷贝
    • 1 会非常非常慢,只做示例使用