简介
Percona XtraBackup 著名的开源Mysql服务器第三方备份软件,其使用物理热备份形式,在备份期间不会锁定数据库,特别适合24x7高负载服务器。
Percona XtraBackup 支持Mysql 8.0服务器的InnoDB和MyIsam数据库引擎。支持完整备份、增量备份,且能非常简单的集成在shell脚本中,执行自动化备份,也可以通过管道方便的传递到另一台服务器,实为Mysql数据库备份,重放的首选利器。
备注:因为Percona XtraBackup是第三方软件,可能不支持最新的Mysql服务器版本。
备注:Percona XtraBackup软件版本通常与Mysql版本对应,例如:XtraBackup 8.0 对应 Mysql 8.0, XtraBackup 5.7 对应 Mysql 5.7。具体请参考Percona XtraBackup官网 https://www.percona.com/
安装及设置
在linux上安装xtrabackup,以及所需的操作系统、数据库配置。
安装XtraBackup
yum安装
方法一:从yum存储库安装
- 以root用户或sudo身份运行以下命令来安装Percona yum存储库:
yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
- 启用存储库:
percona-release enable-only tools release
如果打算将Percona XtraBAckup与已安装的Mysql结合使用,则只需要启用工具存储库:percona-release enable-only tools
- 运行以下命令安装Percona XtraBackup:
yum install -y percona-xtrabackup-80
rpm安装
方法二、使用rpm包安装
备注:以下为centos 7示例
- 下载发行包
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm
# 或使用yum下载rpm包
yum install -y --downloadonly --downloaddir=/root/percona_xtrabackup percona-xtrabackup-80
- 运行yum/rpm命令安装
rpm -ivh percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm
yum localinstall -y /percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm
# 或者
yum localinstall -y /root/percona_xtrabackup/*.rpm
注意:从rpm手动安装软件包时,需要确保解决所有依耐性并自己安装缺少的软件包。
备注:要完全卸载percona-xtrabackup,需要删除所有已安装的软件包:yum remove percona-xtrabackup
xtrabackup所需系统和数据库权限
约定:本文中“用户”指的是Linux用户,“账户”通常指的是mysql数据库的账户。
配置Linux系统用户
使用ssh连接服务器后,执行xtrabackup备份命令时,linux用户需要有rwx数据目录的权限,因此建议创建一个专用于xtrabackup备份的linux用户mysqldba。
useradd mysqldba
usermod -g mysql mysqldba
id mysqldba
passwd mysqldba
mkdir -p /data/bkps/
chown -R mysqldba:mysql /data/bkps
vim /etc/sudoers
mysqldba master-01=(root) NOPASSWD:/usr/bin/chown -R mysql.mysql /var/lib/mysql/*,NOPASSWD:/bin/xtrabackup,NOPASSWD:/usr/bin/rm -r /var/lib/mysql/*
配置Mysql账户
用户备份的mysql账户需要具有mysql数据库特权:
执行完全备份所需的最低特权的数据库用户示例:
create user bkpuser@'localhost' identified by 'bkpuser';
grant select,process,reload,lock tables,replication client on *.* to bkpuser@'localhost' ;
grant BACKUP_ADMIN ON *.* TO bkpuser@'localhost' ;
flush privileges;
show grants for bkpuser@'localhost' ;
使用xtrabackup可能还需要的mysql账户权限:
- 需要create tablepace权限,以便导入表(还原单个表)
- 需要super权限,为了在复制环境中启动/停止从属线程,请使用XtraDB Changed Page Tracking 进行增量备份并处理FLUSH TABLES WITH READLOCK。
- 需要CREATE权限,为了创建PERCONA_SCHEMA.xtrabackup_history数据库和表。
- 需要INSERT权限,以便将历史记录添加到PERCONA_SCHEMA.xtrabackup_history表。
- 需要SELECT权限,以便使用 --incremental-history-name 或 --incremental-history-uuid,以使用该功能在PERCONA_SCHEMA.xtrabackup_history表中查找innodb_to_lsn值。
配置xtrabackup
xtrabackup 配置是通过选项文件实现的,通常为MySQL的配置文件(例如:/etc/my.cnf等)。xtrabackup从配置文件中依次读取[mysqld]和[xtrabackup]部分。如果要覆盖MySQL的选项,则只需在配置文件[xtrabackup]部分中指定选项,因为xtrabackup将优先使用它们。
通常,在my.cnf文件的[xtrabackup]部分最常见的是target_dir选项,该选项定义备份保存的目录,例如:
vim/etc/my.cnf
[xtrabackup]
target_dir=/data/bkps/base
# 在此使用xtrabackup命令,可以不用指定--target-dir选项
xtrabackup --login-path=bkpuser --backup
NFS卷和fsync
在大多系统上,xtrabackup工具不需要特殊配置。但是,当调用fsync()时,–target-dir所在的存储(磁盘、ssd)必须正常运行。特别需要指出,未使用sync选项挂载的NFS卷可能无法真正做到数据同步。因此,如果备份保存的目录是async选项挂载的NFS卷,然后尝试从另一台主机也挂载该卷准备备份,则数据可能已损坏。可以使用sync mount选项来避免此问题。
备注:CentOS默认使用fsync挂载卷,如果需要sync挂载,操作如下:
vim /etc/fstab
/dev/mapper/centos-root / xfs defaults,sync 0 0 mount /
完整备份
-
备份前的准备工作,包括检查备份目录是否为空(xtrabackup 不会覆盖现有文件),检查InnoDB 数据或日志文件是否保存在同一目录中
ls -lh /data/bakps/ backup-mycnf rm -r /data/bkps/* ls -h /data/bkps/ mysql --login-path=master_local show variables like 'datadir'; show variables like 'log_bin_basename';
-
开始备份
xtrabackup --login-path=bkpuser --backup --target-dir=/data/bkps/base
备份时间的长短取决于数据库的大小。可以随时终止xtrabackup,因为xtrabackup不会修改数据库。
-
检查确认备份
备份完成时,输出如下信息:
completed OK!
查看备份目录,可见:
ls -hl /data/bkps/
增量备份
增量备份是基于上一次备份的基础上的一个备份。
- 创建增量备份
xtrabackup --login-path=bkpuser --backup --target-dir=/data/bkps/inc1 --incremental-basedir=/data/bkps/base
ls -l /data/bkps/inc1/
cat /data/bkps/inc1/xtrabackup_checkpoints
- 再次创建增量备份
xtrabackup --login-path=bkpuser --backup --target-dir=/data/bkps/inc2 --incremental-basedir=/data/bkps/inc1
Preparing备份(对已备份的数据进行Preparing操作)
xtrabackup是热备份,所以在备份的同时数据库也在进行读写操作。所以xtrabackup备份的数据文件在Preparing操作之前时间点不一致,因为xtrabackup在不同的时间复制了他们,后复制的文件可能与先复制的文件在数据关联关系上存在不一致。
如果直接使用这些不一致的数据文件启动mysql,将检测到损坏并停止工作以避免在损坏的数据上运行。
prepare步骤可以使所有数据文件在时间点达成一致性,您可以在任何计算机上进行prepare操作;不必从mysql服务器或要还原到的服务器上运行。
为了保证还原数据库的一致性,在还原之前必须进行Preparing操作,依次从最后一个增量备份开始,直到完整备份,进行Preparing操作,完成后数据可以用户恢复备份:
-
Preparing增量备份
Prepare完整备份,注意必须使用--apply-log-only选项,防止日志回滚
xtrabackup --prepare --apply-log-only --target-dir=/data/bkps/base
依次Preparing其他增量备份(除最后一个增量备份),也需要使用–apply-log-only选项,防止日志回滚
xtrabackup --prepare --apply-log-only --target-dir=/data/bkps/base --incremental-dir=/data/bkps/inc1
-
Preparing最后一次增量备份,不需要再使用–apply-log-only选项
xtrabackup --prepare --target-dir=/data/bkps/base --incremental-dir=/data/bkps/inc2
警告:中断prepare过程可能会导致数据文件损坏并且备份将变得不可用。
数据恢复
警告:必须先prepare备份,然后才能还原。
-
关闭数据库
sudo systemctl stop mysqld
-
情况现有数据目录
sudo rm -rf /var/lib/mysql/*
ls -hl /var/lib/mysqld
注意:如果不清空数据目录,会报错,并终止恢复。
-
恢复数据库
xtrabackup --copy-back 选项恢复备份到服务器的数据目录,并保留该备份:
sudo xtrabackup --copy-back
或者:(如果未在my.cn配置 --target-dir)
sudo xtrabackup --copy-back --target-dir=/data/bkps/base
将文件属性修改正确:chown -R mysql.mysql /var/lib/mysql -
启动数据库
systemctl start mysqld
systemctl status mysqld -
登陆数据库并检查数据库恢复情况
备注:可用rsync命令还原备份:rsync -avrP /data/bkps/base /var/lib/mysql
备份脚本(自动化备份策略)
在实际使用中,通常使用shell脚本,将整个备份过程自动化。本节展示了一个简单的shell脚本,每周日做一次完整备份,然后每天做增量备份。并使用crond守护进程在每天凌晨1:00自动执行脚本。
vim /home/mysqldba/bakmysql.sh
#!/bin/bash
week_year=`/bin/date "+%W"`
day_week=`/bin/date "+%u"`
bak_base="/data/bkps"
echo -e "\t"
echo -e `date`" : Begin backup Xtrabackup\t"
# The function is used for incremental backup. When the incremental backup does not exist , the full backup function is called .
function inc_backup(){
full_bak_path=$bak_base/$week_year/full
inc_bak_path=$bak_base/$week_year/inc$day_week
if [ -e $full_bak_path ]
then
echo -e `date`" : xtrabackup begin inc backup \t"
sleep 3
mkdir -p $inc_bak_path
`xtrabackup --login-path=bkpuser --backup --target-dir=$inc_bak_path --incremental-basedir=$full_bak_path`
echo -e `date`" : End inc $day_week backup\t"
else
full_backup
fi
}
# funcion for full backup
function full_backup(){
echo -e `date`" : xtrabackup begin full backup \t"
sleep 3
full_bak_path=$bak_base/$week_year/full
mkdir -p $full_bak_path
`xtrabackup --login-path=bkpuser --backup --target-dir=$full_bak_path`
echo -e `date`" : End full $day_week backup\t"
}
# Main structure,complete backup on Sunday,incremental backup on other days
if [ "$day_week" -eq 0 ];then
full_backup
else
inc_backup
fi
使用crontab 命令将脚本放置到计划任务中。
crontab -e
crontab -l
0 1 * * * /bin/bash /home/mysqldba/bakmysql.sh
压缩备份
- 创建压缩备份
xtrabackup --login-path=bkpuser --backup --compress --target-dir=/data/bkps/compressed/
# 备注: --compress 使用 qpress工具压缩,如果缺少此工具,请安装
percona-release enable tools
yum install qpress
# 可用使用 --compress-threads 选项指定多线程并行压缩
xtrabackup --login-path=bkpuser --backup --compress --compress-threads=4 --target-dir=/data/bkps/compressed2/
- preparing备份
prepare备份之前,需要解压缩所有文件。 --decompress 选项用于解压缩备份。
xtrabackup --decompress --target-dir=/data/bkps/compressed/
Percona XtraBackup不会自动删除压缩文件。使用 --remove-original 选项,在解压的同时删除压缩文件。即使未删除压缩文件,如果使用 --copy-back 或 --move-back,压缩文件不会被 复制/移动 到datadir中,但如果使用linux系统命令复制,会将压缩文件一同复制到数据目录。
# 使用 --remove-original 选项,在解压的同时删除压缩文件。
xtrabackup --decompress --remove-original --target-dir=/data/bkps/compressed2/
解压文件后,可以使用 --prepare 选项 prepare备份:
xtrabackup --prepare --target-dir=/data/bkps/compressed/
现在,/data/bkps/compressed中的文件已准备就绪,可供服务器使用。
-
恢复备份
xtrabackup --copy-back --target-dir=/data/bkps/compressed/
将文件属性修改正确:chown -R mysql.mysql /var/lib/mysql -
启动数据库
systemctl start mysqld
systemctl status mysqld
数据流备份
Percona XtraBackup流模式将备份以xbstream格式发送到STDOUT,而不是将文件复制到备份目录。
这是您可以使用其他程序过滤备份的输出,从而为存储备份提供更大的灵活性。例如,将输出管道传递给压缩命令。
流备份和使用Unix管道的好处之一是可以自动加密备份。
-
–stream 选项:提供流的格式(xbstream)以及临时文件的存储位置:
xtrabackup 流备份以特殊的xbstream格式将所有数据,以文件流的形式传输到STDOUT。
使用流备份,可以并行复制和压缩备份,这可以大大加快备份过程。如果备份既经过压缩又经过加密,则需要先对其解密,然后再解压缩。 -
将流备份导出到归档文件backup.xbstream中。
xtrabackup --login-path=bkpuser --backup --stream=xbstream【--target-dir=./】 >backup.xbstream
-
将流备份传输到压缩文件backup.xbstream.cpr中。
xtrabackup --login-path=bkpuser --backup --stream=xbstream --compress 【--target-dir=./】 >backup.xbstream.cpr
-
流备份加密备份
xtrabackup --login-path=bkpuser --backup --stream=xbstream 【--target-dir=./】 | gzip 【-】 | openssl des3 -salt -k "password" > backup.xbstream.gz.des3
-
将流备份释放到当前目录
cd /data/bkps/new xbstream -x < /home/mysqldba/backup.xbstream
释放压缩文件[在8.0版本中的xbstream工具才有–decompress选项]
xbstream [--decompress] -x < /home/mysqldba/backup.xbstream.cpr
释放加密文件
cat /home/mysqldba/backup.xbstream.gz.des3 | openssl des3 -d -k "password" | gzip -dv | xbstream -x ll -h /data/bkps
-
将压缩后的流备份直接发送到另一台主机并压缩
xtrabackup 【--login-path=bkpuser】 --backup --stream=xbstream --compress 【--target-dir=./】 | ssh root@master-02 "xbstream -x -C /data/new/"
备注:master-02主机也必须安装xbstream程序,否则无法使用。
备注:这里的ssh 命令不会提示输入密码,因此要提前使用ssh-keygen 以及ssh-copy-id命令将master-02的证书传递给root@master-01
ssh-keygen
ssh-copy-id -i .ssh/id_rsa.pub root@master-01
-
使用netcat将流备份发送到另一台服务器
在目标主机上
nc -l 9999 | cat -> /data/bkps/backup.xbstream &
在源主机上
xtrabackup 【–login-path=bkpuser】 --backup --stream=xbstream 【–target-dir=./】 | nc master-02 9999 -
使用一条语句将备份发送到另一台服务器
ssh root@master-02 “(cat -> /data/bkps/backup.xbstream &)” && xtrabackup 【–login-path=bkpuser】 --backup --stream=xbstream 【–target-dir=./】 | nc master-02 9999 -
具有并行复制备份的并行压缩
xtrabackup 【--login-path=bkpuser】 --backup --stream=xbstream --parallel=4 --compress \ --compress-threads=8 【--target-dir=./】> /data/bkps/backup.xbstream
部分备份
- 在文本文件中指定表名
- 指定(多个)数据库
警告:
恢复时部分备份只能通过导入表,不能使用–copy-back选项恢复。
尽管在某些情况下可以通过复制数据文件进行还原,但是在许多情况下,可能会导致数据不一致,因此不建议这样做。
如果在备份过程中删除了相关的表,则xtrabackup将失败。
创建部分备份
- –tables 选项:指定一个正则表达式,与标准的表名匹配,格式为databasename.tablename
示例:要仅备份menagerie数据库中的表,可以使用以下命令:
xtrabackup --login-path=bkpuser --backup --target-dir=/data/bkps/ --tables="^menagerie[.].*"
示例:仅备份表menagerie.pet,可以使用以下命令:
xtrabackup --login-path=bkpuser --backup --target-dir=/data/bkps/ --tables="^menagerie[.]pet"
- –tables-file选项:指定一个文本文件,文件以每行一个表名的形式指定要备份的表名。
表名完全匹配,区分大小写,不行进模式或正则表达式匹配。表名必须是完整databasename.tablename格式。
示例:备份menagerie数据库的pet和event表
vim /tmp/bak.txt
menagerie.pet
menagerie.event
xtrabackup --login-path=bkpuser --backup --target-dir=/data/bkps/ --tables-file=/tmp/bak.txt
- –databases 选项:选项指定备份数据库和表,多个参数使用空格分隔,格式为databasename[.tablename]。除此之外,还必须指定mysql、sys和performance_schema数据库,因为使用xtrabackup --copy-back还原数据库时,需要这些数据库。
示例:备份menagerie数据库
xtrabackup --login-path=bkpuser --backup --target-dir=/data/bkps/ --databases='mysql sys performance_schema menagerie'
- –databases-file 选项:指定一个文件,该文件以databasename[.tablename]形式包含多个数据库和表名,该文件中每行一个名称。仅备份指定的数据库和表,名称完全匹配,区分大小写,不进行模式或正则表达式匹配。
vim /tmp/bak_database.txt
menagerie
xtrabackup --login-path=bkpuser --backup --target-dir=/data/bkps/ --databases-file=/tmp/bak_database.txt
Preparing 部分备份
过程类似还原单个表:应用日志并使用–export选项:
xtrabackup --prepare --export --target-dir=/data/bkps
恢复部分备份
恢复部分备份,只能使用导入表的方式还原,不能使用–copy-back选项恢复。
导入表的操作请参考《Mysql导入InnoDB表》第2节
示例:仅恢复表menagerie.pet
mysql --login-path=master_local
ALTER TABLE menagerie.pet DISCARD TABLESPACE;
cp /data/bkps/menagerie/pet.* /var/lib/mysql/menagerie/
chown mysql.mysql /var/lib/mysql/menagerie/pet.*
mysql --login-path=master_local
ALTER TABLE menagerie.pet IMPORT TABLESPACE;
SELECT * FROM menagerie.pet;
如果希望将准备好的部分备份复制到空的数据目录,请确保备份包括mysql数据库。此时没有包含的数据库(表)相关信息会保存在数据字典,但是因为没有数据文件,如果使用这些表会报错,因此实际上此时数据库处于数据不一致的状态。
参考:https://www.bilibili.com/video/BV1oV411W7wy?from=search&seid=12194428686691028888&spm_id_from=333.337.0.0
https://space.bilibili.com/514491346/search/video?keyword=xtrabackup
https://search.bilibili.com/all?keyword=xtrabackup