xtrabackup备份mysql(pxb)
一、Xtrabackup介绍:
Percona XtraBackup(简称PXB) 是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。
MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份, 在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabakackup有2个工具,分别是xtrabakup、innobackupex。
二、Xtrabackup优点:
- 备份速度快,物理备份可靠
- 备份过程不会打断正在执行的事务(无需锁表)
- 能够基于压缩等功能节约磁盘空间和流量
- 自动备份校验
- 还原速度快
- 可以流传将备份传输到另外一台机器上
- 在不增加服务器负载的情况备份数据
三、Xtrabackup备份原理:

(1)innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;
(2)xtrabackup在备份innoDB数据是,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待状态(等待文件被创建)
(4)xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)
(5)innobackupex收到xtrabackup通知后哦,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。
(6)当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;
(7)xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;
(8)innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES;
(9)最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。
四、xtrabackup的安装部署:
1、xtrabackup的安装:
#执行下面命令下载软件包,并安装
下载:wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
安装:yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
查看是否安装成功:rpm -qa | grep xtrabackup
二进制包位置:https://github.com/percona
Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
常用选项:
1、 --host: 指定主机
2、 --user: 指定用户名
3、 --password: 指定密码
4、 --port: 指定端口
5、 --database: 指定数据库
6、 --incremental: 创建增量备份
7、 --incremental-basedir: 指定包含完整备份的目录
8、 --incremental-dir: 指定包含增量备份的目录
9、 --apply-log: 对备份进行预处理操作
2、创建一个最小权限的备份用户进行备份,如下:
create user 'bkuser'@'localhost' identified by "bk123456"; #创建用户
flush privileges; #刷新授权表
revoke all privileges,grant option from 'bkuser'@'localhost'; #回收此用户所有权限
flush privileges; #刷新授权表
grant reload,lock tables,replication client,process ON *.* TO 'bkuser'@'localhost'; #授权刷新、锁表、查看服务器状态、进程的权限
flush privileges; #刷新授权表
五、备份:
1、 备份所有数据库:备份目录里生成日期命名的文件夹 :
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql.sock /data/backup/
#上述命令表示在本机执行的
# --defaults-file:指定数据库配置信息,非必须,如果不写要写详细的数据库信息
# /data/backup表示备份的位置

innobackupex会在指定存放数据的目录下用当前时间创建一个目录,所有生成的备份文件都会这个时间目录下 ,如图:

2、 备份所有数据库,指定目录的名称
在备份时,通过参数 –no-timestamp 来阻止命令自动创建一个以时间命名的目录(no前面是双横杠)
#注意:每一个参数前面都是双横杠
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql.sock --no-timestamp /data/backup/linshi
#此命令执行后,将会创建linshi文件夹用于存放备份文件而不是时间命令的目录

3、备份所有数据库并打包:
#执行此命令后,会在backup目录下直接生成打包后的文件
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql.sock --stream=tar --no-timestamp /data/backup 1> /data/backup/backup.tar
#注意参数--stream=tar

4、备份所有数据库,压缩打包:
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql.sock --stream=tar --no-timestamp /data/backup | gzip > /data/backup/backup.tar.gz

5、备份所有数据库到远程并压缩:
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql.sock --stream=tar /data/backup | ssh root@192.168.153.129 "gzip > /data/backup/backup.tar.gz"
#注意:需要提前开通到远程机器的免密

6、备份指定数据库:
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql.sock --databases="n9e_ams n9e_hbs" --no-timestamp /data/backup/ams_hbs_database
#--databases:指定数据库,上述命令将备份n9e_ams和n9e_hbs两个数据库

7、备份不同库下的不同表:
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql.sock --databases="n9e_ams.host n9e_hbs.instance" --no-timestamp /data/backup/ams_hbs_tables
#还是通过--databases参数,上述命令表示备份n9e_ams库下的host表和n9e_hbs库下的instance表

8、备份一个库下以某个字母开头的表:
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql.sock --include="n9e_mon.s" --no-timestamp /data/backup/ams_mon_tables
#--include: 使用匹配正则表达式匹配表名,上述命令表示备份n9e_mon库下的s开头的表

9、增量备份:
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --no-timestamp --incremental-basedir=/data/backup/linshi --incremental /data/backup/increment_data
#--incremental-basedir:全量备份目录
#--incremental:增量备份目录
六、还原:
备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。 利用 –apply-log参数,此参数通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
1、首先查看一个完整的备份文件2021-11-25_11-52-35中的xtrabackup_checkpoints文件,如下:

2、执行命令如下:
innobackupex --apply-log 2021-11-25_11-52-35/
#执行完成后,backup-type将变成full-prepared,之前是full-backuped的状态
3、再次查看 xtrabackup_checkpoints ,如下:

全量还原:
注: 还原时,mysql服务器需要关闭,而且数据目录必须是空的,innobackupex –copy-back不会覆盖已存在的文件
1、停止myql:
/etc/init.d/mysqld stop
2、清空数据目录:
rm -rf /data/mysql/data/*
3、还原数据:
innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/2021-11-25_11-52-35/
#--defaults-file: 指定了从哪个文件读取MySQL配置
#--copy-back: 数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
除了–copy-back,还可以用–move-back,区别如下:
--copy-back参数会将备份目录中的所有文件复制到它们在数据目录中的原始位置。这个过程不会删除目标目录中已存在的文件,而是会覆盖它们。这个参数通常在数据目录为空或者不需要保留现有文件时使用。使用--copy-back时,备份文件在复制后仍然保留在备份目录中,直到手动删除--move-back参数与--copy-back类似,但它会将备份文件从备份目录移动到数据目录,而不是复制。这意味着备份文件在移动后会从备份目录中移除。这个参数适用于在有足够磁盘空间进行操作的情况下,或者当不需要保留备份文件时。使用--move-back时,也需要确保数据目录为空,或者使用--force-non-empty-directories参数来允许覆盖现有文件
4、修改权限,启动数据库,验证数据是否恢复:
chown -R mysql:mysql /data/mysql/data #赋权限
/etc/init.d/mysqld start #启动Mysql
总结几个注意点:
- datadir目录必须为空,除非指定 –force-non-empty-directorires 参数,否则–copy-backup选项不会覆盖
- 在恢复之前,必须关闭mysql示例,运行中的Mysql无法恢复
- 恢复后的文件属性会保留,因此在启动mysql之前需要将数据目录及其子目录属主和属组设置为mysql,否则无法启动成功
增量还原:
1、 停止myql:
/etc/init.d/mysqld stop
2、清空数据目录:
rm -rf /data/mysql/data/*
3、 先apply-log全量备份
innobackupex --apply-log --redo-only 2021-11-25_16-19-12
4、 把增量备份数据合并到全量备份数据上 :
innobackupex --apply-log --redo-only /data/backup/2021-11-25_16-19-12 --incremental-dir=/data/backup/increment_data
5、回滚完全备份:
innobackupex --apply-log /data/backup/2021-11-25_16-19-12
6、还原:
innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/2021-11-25_16-19-12
7、设置权限,启动Mysql:
chown -R mysql:mysql /data/mysql/data
/etc/init.d/mysqld start
下面例子表示备份mysql到远程机器上并压缩,如下:
#!/bin/bash
: '
@function: backup mysql
@date: 2021-11-26
@author: gongguan
@notice: 下面的压缩后文件中因为有分钟,包含冒号,因此用tar命令解压的时候,会提示tar: Cannot connect to,因此在解压的时候需要添加参数--force-local即可
'
date=$(date +"%Y-%m-%d~%H:%M:%S")
bk_dir=/data/backup/iyin-sass/mysql
ssh cyyzops@192.168.12.174 test -d ${bk_dir}
if [ $? -eq 0 ];then
echo "dir exists"
else
echo "目录不存在,需要创建"
ssh cyyzops@192.168.12.174 mkdir -p ${bk_dir}
fi
full_bk() {
echo "<<<<<<<<<<<<<<<<<<<<<<开始完全备份>>>>>>>>>>>>>>>>>>>>>"
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --no-timestamp --stream=tar ${bk_dir} | ssh cyyzops@192.168.12.174 "gzip > ${bk_dir}/bk_mysql-${date}.tar.gz"
sleep 2
if [ $? -eq 0 ];then
echo "mysql bakcup success-${date}" >> ${bk_dir}/result_success.txt
ssh cyyzops@192.168.12.174 "find ${bk_dir} -type f -name 'bk_mysql*' -mtime +2 -exec rm -rf {} \;"
else
echo "mysql backup failed-${date}" >> ${bk_dir}/result_failed.txt
fi
}
full_bk
centos8安装xtrabckup:
1、yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
2、percona-release enable-only tools release #启用存储库
3、percona-release enable-only tools #启用工具存储库
4、yum install -y percona-xtrabackup-24 #执行命令安装
5、which xtrabackup 、which innobackupex #验证是否安装成功


