mysql使用innobackupex备份详解

一、概括

1.1 Xtrabackup

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写)。

Xtrabackup有两个主要的工具:xtrabackup、innobackupex

  • xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
  • innobackupex-1.5.1则封装了xtrabackup,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁

innobackupex:这个是其实是下面三个工具的一个perl脚本封装,可以备份MyISAM, InnoDB, XtraDB表。但在处理Myisam时需要加一个读锁。

  • xtrabackup:一个由C编译而来的二进制文件,只能备份InnoDB和XtraDB数据。
  • xbcrypt:用来加密或解密备份的数据。
  • xbstream:用来解压或压缩xbstream格式的压缩文件。

xtrabackup命令只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候必须有对应表结构文件(.frm)。

innobackupex命令相当于冷备份,复制数据目录的索引,数据,结构文件,但会有短暂的锁表(时间依赖于MyISAM大小)。

这里主要介绍innobackupex在WinDHP数据库备份中的使用。

1.2 环境准备

- mysql数据库IP: 192.168.56.10
- 端口:3306
- 用户名密码:ceshi/123456
- mysql文件路径:/home/mysqldb/mysql3306/
- mysql数据文件夹:/home/mysqldb/mysql3306/data/

二、全量备份与恢复

2.1 全量备份

innobackupex --user=ceshi --password=123456 --port=3306 --host=localhost \
             --socket=/home/mysqldb/mysql3306/data/mysqld.sock \
             --default-file=/home/mysqldb/mysql3306/my.cnf \
             --datadir=/home/mysqldb/mysql3306/data/  /home/mysqldb/backup/bak-2022-10-11
  • –user=:执行备份操作的MySQL用户(非系统用户),该用户需要有MySQL的相关权限
  • –password=:MySQL用户的密码
  • –socket=socket文件所在位置
  • –default-file=mysql配置文件所在位置
  • –datadir=mysql数据文件位置

其他选项

  • –no-timestamp 选项来阻止命令自动创建一个以时间命名的目录,我们可以自定义备份集的名字
  • –databases-exclude:备份时排除指定的数据库
  • –stream:使用xbstream或tar流备份,使用此选项时备份数据将以指定流格式输出到标准输出上,通常用它实现本机不落盘的异地备份
  • –parallel=4:备份所用的线程数

当看到 “complete OK !” 表明备份已完成。

然后查看 /home/mysqldb/backup/bak-2022-10-11/文件,发先里面多了一个以yyyy-MM-dd_HH-mm-ss时间格式的文件;
再进入yyyy-MM-dd_HH-mm-ss文件,即可看到备份的数据库文件集。

  • backup-my.cnf:为当前数据库配置文件的备份!
  • xtrabackup_binlog_info:当前备份文件对应的二进制日志文件和position位置,做PIT恢复时使用。

2.2 全量恢复

2.2.1 停掉数据库

service mysqld stop

2.2.2 模拟删库

注意:此步骤只是为了模拟事故环境!!删库需谨慎!!删除datadir指定的目录,若是线上环境,确保一定备份过。

rm -fr /home/mysqldb/mysql3306/data/*

2.2.3 准备恢复

所谓准备恢复,就是要为恢复做准备。就是说备份集没办法直接拿来用,因为这中间可能存在未提交或未回滚的事务,数据文件不一致,所以需要对备份集做预处理的准备过程。

innobackupex --apply-log /home/mysqldb/backup/bak-2022-10-11/2022-10-11_15-11-37/

当看到 “complete OK !” 表明准备恢复阶段已完成!

2.2.4 执行恢复

innobackupex提供了–copy-back参数,就是将指定的备份集,恢复到指定的路径下面(这个指定的路径是配置文件中datadir指定的路径)!

innobackupex  --datadir=/home/mysqldb/mysql3306/data/ \
--copy-back /home/mysqldb/backup/bak-2022-10-11/2022-10-11_15-11-37/

当看到 “complete OK !” 表明恢复已完成!

注意mysql数据data文件恢复成功后,可能某些文件的权限不足,会导致mysql启动失败。可以使用chmod命令对某些文件增加权限来解决。

2.2.5启动mysql

service mysqld start

三、基于全量备份的备份方案

基于上面的讲解,相信大家对innobackupex有了足够的认识,所以准备使用上面的知识,结合linux的定时任务,出一个全量备份的备份方案。

3.1 定时任务执行 innobackup.sh进行全量备份

3.1.1 innobackup.sh备份脚本

#!/bin/bash

date=`date +%Y%m%d`
echo `date +%Y%m%d-%H%M`:开始备份 >> /backup/mysql_backup.log  #打印日志 开始备份

echo "------ start backup db ------"
# innobackupex备份命令,压缩成tar.gz
# 保存在本地的/backup/mysql文件夹内
# 备份文件的命名格式 %Y%m%d-%H%M%S-backup.tar.gz
innobackupex --user=ceshi \
--password=123456 \
--port=3306 \
--host=localhost \
--socket=/home/mysqldb/mysql3306/data/mysqld.sock  \
--default-file=/home/mysqldb/mysql3306/my.cnf \
--datadir=/home/mysqldb/mysql3306/data/  \
--stream=tar /backup |gzip>/backup/mysql/`date +%Y%m%d-%H%M%S`-backup.tar.gz

echo `date +%Y%m%d-%H%M`:备份结束 >> /backup/mysql_backup.log  #打印日志 结束备份

echo "------ end backup db ------"

注意:真正的生产环境,备份文件要存放到其他服务器上,以防数据库服务器崩溃导致备份文件丢失。
可以替换脚本的 --stream=tar选项命令来实现本机不落盘的异地备份:

–stream=tar ./ |gzip | ssh root@备份服务器IP \ “cat - > /backup/mysql/date +%Y%m%d-%H%M%S-backup.tar.gz”

但注意需要保证两台服务器可以免密传输。

3.1.2 在数据库服务器上添加定时任务

crontab -e

添加以下内容

10 2 * * * /backup/innobackup.sh #每天的凌晨2点10分执行一次 innobackup.sh脚本

3.2 定时任务执行 cleanfiles.sh 删除7天之前的备份文件

由于备份服务器的磁盘有限,不可能一直保存备份数据,所以此脚本会每天执行一次,来删除7天之前的备份文件。

3.2.1 cleanfiles.sh 删除脚本

#!/bin/bash 

BACKUPDIR="/backup/mysql/"                                     #定义备份文件路径 
cd $BACKUP_DIR
KEEPTIME=7                                                             #定义需要删除的文件距离当前的天数 
DELFILE=`find $BACKUPDIR -type f -mtime +$KEEPTIME -exec ls {} \;`     #找到天数大于7天的文件 
for delfile in ${DELFILE}                                              #循环删除满足天数大于七天的文件 
do 
rm -f $delfile 
done 

3.2.2 在备份服务器上添加定时任务

crontab -e

添加以下内容

10 3 * * * /backup/cleanfiles.sh #每天的凌晨3点10分执行一次 cleanfiles.sh脚本

注意:一定要给.sh脚本赋予“执行”权限:chmod +x /backup/*.sh

我的网站 https://www.lookhot.cn/#/
CSDN私信我,接私活

你可能感兴趣的:(MySQL数据库,mysql,innobackupex,数据库备份,Xtrabackup)