使用xtrabackup实现mysql定时热备份

1、原理:方案选型
mysqldump是逻辑备份解决方案,备份恢复速度慢,工具获取方便,数据量少推荐
主要用途是导出数据
xtrababckup是物理热备份,速度快,适合大数据量
xtrababckup支持innodb和MyISAM存储引擎,支持集成shell脚本,支持管道传输
InnoDB支持完整和增量备份,不上只读锁
MyISAM只有全量备份,会上只读锁,备份期间不可写
xtrababckup版本号:percona-xtrabackup-24对应5.*版本;percona-xtrabackup-80对应8.*版本
增量备份原理:使用page的lsn号,如图7,8是lsn变化的page


xtrabackup备份原理-时序图表示

结论:高效热备份使用xtrabackup
2、安装xtrabackup
方式一:在线安装
安装包管理器
yum install https://repo.percona.com/yum/percona-release-1.0-20.noarch.rpm
yum install percona-xtrabackup-24
yum install -y percona-xtrabackup-24.x86_64
方式二:编译安装
https://www.percona.com/downloads下载二进制安装包percona-xtrabackup-2.4.29-Linux-x86_64.glibc2.17.tar.gz,龙蜥操作系统选择generic

创建目录 /home/xtrabackup 二进制安装包上传此目录
2.1 解压缩
tar -zxvf percona-xtrabackup-2.4.29-Linux-x86_64.glibc2.17.tar.gz
2.2 移动目录
mv percona-xtrabackup-2.4.29-Linux-x86_64.glibc2.17 /usr/local/xtrabackup-2.4.29
2.3 配置软链接
ln -sf /usr/local/xtrabackup-2.4.29/bin/* /usr/bin/
2.4 查看版本号
xtrabackup -v
3、xtrabackup命令说明

备份命令:
xbstream :流式压缩,节省IO,tar压缩要先创建文件,流式压缩可以边生成边压缩
innobackupex :总命令,包含其它命令,对MYISAM存储引擎,只能全量备份;对innodb引擎可以做增量备份,只存在于2.4版本,8版本已取消
4、xtrabackup做全量热备份
#普通热备份
innobackupex --defaults-file=/etc/my.cnf --host=*.*.*.* --user=* --password=* --port=3306 /home/mysqlbackup
#流式备份(打开流式IO)
innobackupex --defaults-file=/etc/my.cnf --host=*.*.*.* --user=* --password=* --port=3306 --no-timestamp --stream=xbstream -> /home/mysqlbackup/backup.xbstream
#带压缩流式备份
innobackupex --defaults-file=/etc/my.cnf --host=*.*.*.* --user=* --password=* --port=3306 --compress --compress-threads=10 --no-timestamp --stream=xbstream -> /home/mysqlbackup/backup.xbstream
5、使用corn表达式+shell定时备份
5.1 创建shell脚本
cd /home/mysqlbackup
touch shell/bkmysql.sh
#添加shell语句
#mysql用户名与密码
BACKUP_NAME=*
BACKUP_PW=*
#数据库服务器ip
BACKUP_HOST=*
#设置备份文件所在的目录
BACKUP_DIR=/home/mysqlbackup
#mysql配置文件路径
MYSQL_CNF=/etc/my.cnf
#备份scp远程保存ip
remote_host=*.*.*.*
#备份文件集团侧保存路径
remote_path=/home/mysql/backupfile
#全量热备,大约10秒
time=$(date "+%Y-%m-%d %H:%M:%S")
echo "执行全量热备份" {time} filename="backup-(date +%Y%m%d).xbstream"
innobackupex --defaults-file=MYSQL_CNF --host=BACKUP_HOST --user=BACKUP_NAME --password=BACKUP_PW --port=3306 --compress --compress-threads=10 --no-timestamp --stream=xbstream -> BACKUP_DIR/filename
#备份文件传输到文件服务器
scp -r /home/mysqlbackup/filename root@remote_host:$remote_path
echo "文件传输完毕"
#保留最近三天的文件,其余的将被删除
find $BACKUP_DIR -type f -name "*.xbstream" -mtime +3 -exec rm -f {} ;
echo "历史数据清理完毕"
5.2 #提升权限,授权文件可执行
chmod -R 777 bkmysql.sh
5.3 创建日志目录
mkdir /home/mysqlbackup/log
5.3 编辑crontab表达式
crontab -e
#添加定时任务,每天2点十分执行shell脚本
10 2 * * * /home/mysqlbackup/shell/bkmysql.sh > /home/mysqlbackup/log/backup.log 2>&1
6、SSH免秘登录配置
ssh localhost --产生.ssh的隐藏目录
在每台机器上执行:ssh-keygen -t rsa --产生密钥对(一路回车)
ssh-copy-id -i ~/.ssh/id_rsa.pub 远程机器ip
免秘登录测试通过
7、恢复测试(mysql只能冷还原)
7.1 停止mysql数据服务,清空数据目录包括表分区目录
systemctl stop mysqld
rm -rf /home/cnbm/mysql/data
7.2 将流式备份的压缩文件还原到临时目录
mkdir /home/temp
#还原流式文件
xbstream -x < /home/mysql/backupfile/backup-20241212.xbstream --decompress -C /home/temp
(xbstream -x < /home/cnbm/mysqlbackup/backup-20241212.xbstream -C /home/temp)
#解压缩还原文件
innobackupex --decompress /home/temp
7.3 清理redo日志并恢复
innobackupex --apply-log /home/backup/2018-09-12_10-53-51
#恢复数据库
innobackupex --copy-back --defaults-file=/etc/my.cnf /home/temp
7.4 数据目录修改所有者后重启mysql
chown -R mysql:mysql /home/cnbm/mysql/data
systeml start mysqld
8.binglog配置(在备份结束至恢复数据这段时间,可使用binlog日志恢复)
8.1.创建binglog日志目录,必须修改所有者权限,否则mysql启动会报错
mkdir /home/cnbm/mysql/binlog/
chown -R mysql.mysql /home/cnbm/mysql/binlog/
8.2./etc/my.cnf文件添加binlog参数,打开binlog开关,指定binglog文件存储路径,修改默认存储格式
binlog_format=MIXED
log_bin=mysql-bin
server-id=1
8.3 相关sql
#显示所有binlog日志名称和大小(索引文件信息)
show binary logs
#是否启用binlog
SHOW VARIABLES LIKE 'log_bin';
#binlog日志格式
show global variables like '%binlog_format%';
#查询binlog文件位置
SHOW VARIABLES LIKE 'log_bin_basename';
#查询binlog文件内容
show BINLOG EVENTS in 'mysql-bin.000001'