简介

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存储库安装

  1. 以root用户或sudo身份运行以下命令来安装Percona yum存储库:
yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
  1. 启用存储库:
percona-release enable-only tools release

如果打算将Percona XtraBAckup与已安装的Mysql结合使用,则只需要启用工具存储库:percona-release enable-only tools

  1. 运行以下命令安装Percona XtraBackup:
yum install -y percona-xtrabackup-80

rpm安装

方法二、使用rpm包安装

备注:以下为centos 7示例

  1. 下载发行包
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
  1. 运行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    /

完整备份

  1. 备份前的准备工作,包括检查备份目录是否为空(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';
    
  2. 开始备份

    xtrabackup --login-path=bkpuser --backup --target-dir=/data/bkps/base

    备份时间的长短取决于数据库的大小。可以随时终止xtrabackup,因为xtrabackup不会修改数据库。

  3. 检查确认备份

    备份完成时,输出如下信息:

    completed OK!

    查看备份目录,可见:

    ls -hl /data/bkps/

增量备份

增量备份是基于上一次备份的基础上的一个备份。

  1. 创建增量备份
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
  1. 再次创建增量备份
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操作,完成后数据可以用户恢复备份:

  1. 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
    
  2. Preparing最后一次增量备份,不需要再使用–apply-log-only选项

    xtrabackup --prepare --target-dir=/data/bkps/base --incremental-dir=/data/bkps/inc2
    

警告:中断prepare过程可能会导致数据文件损坏并且备份将变得不可用。

数据恢复

警告:必须先prepare备份,然后才能还原。

  1. 关闭数据库

    sudo systemctl stop mysqld

  2. 情况现有数据目录

    sudo rm -rf /var/lib/mysql/*

    ls -hl /var/lib/mysqld

    注意:如果不清空数据目录,会报错,并终止恢复。

  3. 恢复数据库

    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

  4. 启动数据库
    systemctl start mysqld
    systemctl status mysqld

  5. 登陆数据库并检查数据库恢复情况
    备注:可用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

压缩备份

  1. 创建压缩备份
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/

  1. 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中的文件已准备就绪,可供服务器使用。

  1. 恢复备份
    xtrabackup --copy-back --target-dir=/data/bkps/compressed/
    将文件属性修改正确:chown -R mysql.mysql /var/lib/mysql

  2. 启动数据库
    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
    

部分备份

  1. 在文本文件中指定表名
  2. 指定(多个)数据库

警告:

恢复时部分备份只能通过导入表,不能使用–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

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐