innobackupex实现mysql全库备份迁移并还原(shell)

背景

生产环境下,通过xtrabackup备份发现,效率最高,也节省磁盘空间,开发innobackupex的全量、增量备份脚本。

原理:

一、xtrabackup包含两个主要的工具,即xtrabackup和innobackupex, 区别在于

1.xtrabackup只能备份innodb和xtradb两种引擎的表,而不能备份myisam引擎的表;
2.innobackupex是一个封装了xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。还有就是myisam不支持增量备份。

二、备份过程

1.执行一次checkpoint,找到最后那个checkpoint的lsn
2.从这个lsn开始记录所有产生的redo log
3.cp innodb data
4.flush tables with read lock
5.cp 非innodb 数据(myisam数据,.FYM,FIM等文件)
6.锁定binlog文件并且记录当前的binlog postion
7.释放所有binlog 锁 ,释放unlock tables

三、增量备份的原理:在第三步的有所变化

  1. 数据页面的比对(lsn),记录下有lsn不一样的数据页面

安装innobackupex

1.安装libev-4.15-1.el6.rf.x86_64.rpm

2.安装percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm

3.安装qpress(innobackpex解压缩工具)
http://www.quicklz.com/

tar -xf qpress-11-linux-x64.tar
cp -av qpress /usr/bin/

全备+增备,备份脚本:

#!/bin/bash  
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin:/usr/local/xtrabackup/bin
verbose=no
# Logging function
function log_info() {
    if [ "$verbose" == "no" ] ; then
        printf "%s --> %s\n" "$(date +%Y-%m-%d-%T)" "$*" >> "$logfile"
    else
        printf "%s --> %s\n" "$(date +%Y-%m-%d-%T)" "$*" | tee -a "$logfile"
    fi
}

#======================================================================
#You have to modify them to the correct information
#####mysql主机信息配置#########
##备份路径
backup_home=/home/bak
DATE=$(date +%Y-%m-%d)
last_day=$(date -d "1 days ago" +%Y-%m-%d)  
logpath=$backup_home
backup_dir=$backup_home/${DATE}
shell_dir=$(cd $(dirname $0); pwd)
#filename=$(find $backup_home -name "$last_day*" -print|awk -F / '{print $NF}')

host_IP=xxx.xxx.xxx.xxx
my_config=/etc/my.cnf 
my_socket=/var/lib/mysql/mysql.sock
logfile=$logpath/innobackupex-${DATE}_${host_IP}.log
#export rsync_logfile=/app/innobackupex/log/${DATE}/rsync_log/rsync-${DATE}_${host_IP}.log
bakuser='root'
bakpasswd='xxxxxxxxx'
threads=6


# Begin script
# we trap control-c
trap sigint INT
#创建备份目录
mkdir -p $backup_dir


# Check for xtrabackup
if command -v innobackupex >/dev/null; then
    innobackupex=$(command -v innobackupex)
else
    log_info "xtrabackup/innobackupex does not appear to be installed. Please install and try again."
    exit 1
fi

#判断是否为周六,若为周六,便进行全备,如果非周六,便根据前一天的备份数据进行增量备份
WEEK_DAY=$(date +%w)
if [ $WEEK_DAY == "6" ]; then
    log_info "Start to full_backup at $(date +%Y%m%d%H%M)"
    $innobackupex --defaults-file=$my_config --no-timestamp --socket=$my_socket --user=$bakuser --password=$bakpasswd --parallel=$threads --lock-ddl-per-table --compress --compress-threads=$threads  $backup_dir >> $logfile 2>&1
    if [ $? -eq 0 ];then  
        log_info "full_Backup is finish! at $(date +%Y%m%d%H%M)"  
        exit 0  
    else  
        log_info "full_Backup is Fail! at $(date +%Y%m%d%H%M)"  
        exit 1
    fi
else
    log_info "Start to incremental_backup at $(date +%Y%m%d%H%M),base on $last_day"
    $innobackupex --defaults-file=$my_config --no-timestamp --socket=$my_socket --user=$bakuser --password=$bakpasswd --parallel=$threads --lock-ddl-per-table --compress --compress-threads=$threads  --incremental $backup_dir  --incremental-basedir=$backup_home/$last_day >> $logfile 2>&1
    if [ $? -eq 0 ];then  
        log_info "incremental_Backup is finish! at $(date +%Y%m%d%H%M)"  
        exit 0  
    else  
        log_info "incremental_Backup is Fail! at $(date +%Y%m%d%H%M)"  
        exit 1
    fi
fi

###清理备份日志,保留七天内的
a=`date +"%Y-%m-%d" -d "-7day"`
cd $backup_home
rm -rf $backup_home/$a* 
log_info "$backup_home/$a was delete"
log_info "Backup Process Done"

--compress :表示本次备份进行压缩
--compress-threads=4 :表示启动四个线程进行压缩
--parallel=5 : 启动5个线程进行备份
-S /var/lib/mysql/mysql.sock:表示本地socket登录
--lock-ddl-per-table:在备份开始时对每个 innodb 表施加元数据锁,防止其上的 DDL 操作。加锁时间也是在拷贝 redo log 的线程创建前,持续到所有备份工作完成后才释放锁。

全备后发现:

1.3T可以压缩成311G,全备压缩率高达76%,节省了空间


全备耗时40分钟左右,备份原数据1.3T,磁盘写入速度500M/s,网卡流量达到800MBs,加了压缩之后,备份压缩后数据为311G,备份时间丝毫不受影响,磁盘写入速度也不受影响。

增备耗时25分钟左右,备份数据120G左右,磁盘写入速度900M/s左右,网卡流量达到1.2Gbps,比较没压缩前的参数都差不多,唯一区别是压缩后的数据为45G左右,压缩率在63%左右,也大大地节省了空间

恢复操作

1.如果有用到流的方式进行压缩,就要先对压缩文件进行解压缩
mkdir -pv outputdir
xbstream -x < /innobackup_dir/backup.xbstream -C /outputdir/
类似于tar,创建个文件夹,把一个文件解压到文件夹下,但并没有真正解压缩,还有qp文件需要解压
2.解压qp文件,并删除.qp文件
.qp结尾的压缩文件,需要安装qpress工具,因为innobackupex在解压时默认使用该工具(安装详见innobackup工具安装文档)
innobackupex --decompress --parallel=6 2021-08-09/
find 2021-08-09/ -name "*.qp" -exec rm -f {} ;



多线程的效果,解压非常快
3.恢复全备
innobackupex --incremental --apply-log --redo-only --use-memory=2G 2021-08-07
--apply-log:该选项表示同xtrabackup的--prepare参数,一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据 文件仍处理不一致状态。--apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。
--use-memory:该选项表示和--apply-log选项一起使用,prepare 备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G。
--redo-only:这个选项在prepare base full backup,往其中merge增量备份(但不包括最后一个)时候使用。
4.prepare第一个增备
innobackupex --incremental --apply-log --redo-only 2021-08-07/ --use-memory=2G --incremental-dir=2021-08-08/
5.Prepare第二个增备
innobackupex --incremental --apply-log --redo-only 2021-08-07/ --use-memory=2G --incremental-dir=2021-08-09/
6.Prepare最后一个增备
innobackupex --incremental --apply-log --redo-only 2021-08-07/ --use-memory=2G --incremental-dir=2021-08-13/
7.Prepare全量的备份
innobackupex --apply-log 2021-08-07/
8.最后一步,copy或者move,磁盘够大就用copy,磁盘不足,直接move
innobackupex --move-back 2021-08-07/

恢复的话,需要恢复全备,删除全备qp文件,再prepare一个增量,删一个增量。

posted @ 2023-02-02 16:55  海yo  阅读(924)  评论(0编辑  收藏  举报