一、概括
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私信我,接私活