Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写)。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex
innobackupex:这个是其实是下面三个工具的一个perl脚本封装,可以备份MyISAM, InnoDB, XtraDB表。但在处理Myisam时需要加一个读锁。
xtrabackup命令只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候必须有对应表结构文件(.frm)。
innobackupex命令相当于冷备份,复制数据目录的索引,数据,结构文件,但会有短暂的锁表(时间依赖于MyISAM大小)。
这里主要介绍innobackupex在WinDHP数据库备份中的使用。
- mysql数据库IP: 192.168.56.10
- 端口:3306
- 用户名密码:ceshi/123456
- mysql文件路径:/home/mysqldb/mysql3306/
- mysql数据文件夹:/home/mysqldb/mysql3306/data/
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
其他选项
当看到 “complete OK !” 表明备份已完成。
然后查看 /home/mysqldb/backup/bak-2022-10-11/文件,发先里面多了一个以yyyy-MM-dd_HH-mm-ss时间格式的文件;
再进入yyyy-MM-dd_HH-mm-ss文件,即可看到备份的数据库文件集。
service mysqld stop
注意:此步骤只是为了模拟事故环境!!删库需谨慎!!删除datadir指定的目录,若是线上环境,确保一定备份过。
rm -fr /home/mysqldb/mysql3306/data/*
所谓准备恢复,就是要为恢复做准备。就是说备份集没办法直接拿来用,因为这中间可能存在未提交或未回滚的事务,数据文件不一致,所以需要对备份集做预处理的准备过程。
innobackupex --apply-log /home/mysqldb/backup/bak-2022-10-11/2022-10-11_15-11-37/
当看到 “complete OK !” 表明准备恢复阶段已完成!
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命令对某些文件增加权限来解决。
service mysqld start
基于上面的讲解,相信大家对innobackupex有了足够的认识,所以准备使用上面的知识,结合linux的定时任务,出一个全量备份的备份方案。
#!/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”但注意需要保证两台服务器可以免密传输。
crontab -e
添加以下内容
10 2 * * * /backup/innobackup.sh #每天的凌晨2点10分执行一次 innobackup.sh脚本
由于备份服务器的磁盘有限,不可能一直保存备份数据,所以此脚本会每天执行一次,来删除7天之前的备份文件。
#!/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
crontab -e
添加以下内容
10 3 * * * /backup/cleanfiles.sh #每天的凌晨3点10分执行一次 cleanfiles.sh脚本
注意:一定要给.sh脚本赋予“执行”权限:chmod +x /backup/*.sh
我的网站 https://www.lookhot.cn/#/
CSDN私信我,接私活