最近用innobackup进行备份测试,我们只备份一个innodb类型的库,数据大小大概50多G,用innobackupex大概用了5个多小时,但是mysqldump只用了大约2个小时,这让我很费解,有哪位知道的同志能够交流下?按理说innobackupex应该快的,还有就是大家在备份时不要放到高峰期,因为innobackupex备份时比较吃系统IO,下面就是我备份脚本,分为全备和增备:
一、全备
1、全备脚本
--全备到远程服务器
/data/mysql/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --password="*******" --database=report --stream=tar /data/backup/fullbackup 2>/data/backup/fullbackup/bak.log |gzip| ssh root@192.168.1.1 "cat - > /data/backup/fullbackup/`date +%F_%H-%M-%S`.tar.gz "
--全量备份到本地
/data/mysql/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --password="******" --database=report --stream=tar /data/backup/fullbackup 2>/data/backup/fullbackup/bak.log | gzip > /data/backup/fullbackup/`date +%F_%H-%M-%S`.tar.gz
注意事项:1、--defaults-file参数需要放在第一个位置,否则报错提示,通过这个参数,将数据文件(由cnf里的变量datadir指定)拷贝至备份目录下。备份成功后,将在备份目录下创建一个时间戳目录,在该目录下存放备份文件。
2、--stream=tar表示通过流的方式将文件传送给tar进行归档。
3、还有其他的参数请参考官方文档。
2、全备恢复
--解压
tar -izxvf 2015-10-26_18-11-16.tar.gz -C 2015-10-26_18-11-16
注意事项:需要添加-i参数,否则解压出来的文件不全,通过-C指定目标目录
--全量恢复:假设恢复还原到3307端口的库中
恢复分为两步,第一步需要“prepare”,其实就是xtrabackup应用事务日志,对于已经commit的操作进行前滚,对于rollback的操作进行回滚,这个跟crash recovery类似。
--应用日志:
/data/mysql/bin/innobackupex --apply-log /data/backup/fullbackup/2015-10-26_18-11-16
--copy文件
#需先关闭mysql服务
/data/mysql/bin/mysqladmin -S /tmp/mysql3307.sock --user=root --password="*******" shutdown
#删除数据库目录文件和日志
rm -rf /data/mysql/data2/report ib*
#进行文件同步
rsync -avz report ib* /data/mysql/data2
#最后别忘了修改权限
chown -R mysql:mysql /data/mysql/data2/*
注意事项:使用--copy-back,要求data目录下面为空,如不为空,会报错如下Original data directory /data/mysql/data2 is not empty!这种适合备份实例下的所有数据库的情况,这时可以清空data目录。但是不适合只备份特定的某些库,由于我们是备份特定report库,所以这里直接用rsync来同步文件。下面的是官方的copy-back供参考:
/data/mysql/bin/innobackupex ?--defaults-file=/etc/my_3307.cnf --copy-back /data/backup/fullbackup/2015-10-26_18-11-16
到这里,数据库就恢复还原好了,可以重新启动mysql服务,登录mysql查看数据恢复情况。一般来说全备的恢复比较简单。但是每次备份的数据量比较大,时间也长,大家根据实际情况决定备份方式。
二、增备
增量备份:以某个特定的全备为基础,个人理解可以细分两种:一种是每天都以该全备为基础进行增备。另一种是以前一天的增量为基础进行增量。
/data/mysql/bin/innobackupex --user=root --password="*******" --database=report --incremental --incremental-basedir=/data/backup/fullbackup/2015-10-27_15-27-04 /data/backup/fullbackup
注意事项:--incremental参数指明用增量备份方式;--incremental-basedir参数指定以哪个全备为基础
对于第一种恢复方法:
/data/mysql/bin/innobackupex --apply-log --redo-only /data/backup/fullbackup/2015-10-27_15-27-04 /data/mysql/bin/innobackupex --apply-log /data/backup/fullbackup/2015-10-27_15-27-04 --incremental-dir=/data/backup/fullbackup/2015-10-27_16-28-40
对于第二种恢复方法:
/data/mysql/bin/innobackupex --apply-log --redo-only /data/backup/fullbackup/2015-10-27_14-20-35 /data/mysql/bin/innobackupex --apply-log --redo-only /data/backup/fullbackup/2015-10-27_14-20-37 ......redo每一天的增量 /data/mysql/bin/innobackupex --apply-log /data/backup/fullbackup/2015-10-27_14-20-35 --incremental-dir=/data/backup/fullbackup/2015-10-27_14-35-11
注意事项:
对于第一种方式:由于每次都是以全备为基础增量,所以只需恢复全备和最后一次的增量即可。
对于第二种方式:需要按顺序对全备,第一次增备...第N-1次增备进行应用事务日志文件,最后一次的增量不需要,最终日志都应用到全备中了,故最后只需要将全备文件夹中的文件copy到对应data目录即可。
三、相关备份脚本
下面提供两个shell写的备份脚本,是转网友的,个人觉得写的挺全的,给大家参考:
1、全备shell脚本
1 #!/bin/bash 2 user=‘root‘ 3 passwd=‘root‘ 4 database=test 5 my_config=‘/etc/my.cnf‘ 6 backup_dir=‘/data/backup/fullbackup‘ 7 log=$database-$(date +%Y%m%d%H%M).log 8 str=$database-$(date +%Y%m%d%H%M).tar.gz 9 10 echo "Start to backup at $(date +%Y%m%d%H%M)" >> /data/backup/fullbackup/$log 11 if [ ! -d "$backup_dir" ];then 12 mkdir -p $backup_dir 13 fi 14 /data/mysql/bin/innobackupex --defaults-file=$my_config --user=$user --password=$passwd --database=$database --stream=tar $backup_dir 2>$backup_dir/$log | gzip >$backup_dir/ 15 16 $str 17 if [ $? -eq 0 ];then 18 echo "Backup is finish! at $(date +%Y%m%d%H%M)" >> /data/backup/fullbackup/$log 19 exit 0 20 else 21 echo "Backup is Fail! at $(date +%Y%m%d%H%M)" >> /data/backup/fullbackup/$log 22 exit 1 23 fi
2、全备加增备
1 #!/bin/bash 2 CONFIG_FILE="/etc/my.cnf" 3 BACKUP_USER="backup" 4 BACKUP_PASSWD="123A456" 5 MYSQL_PORT="99523" 6 MYSQL_HOST="127.0.0.1" 7 BACKUP_BASE="/home/xtr_backup" 8 XTR_BACKUPLOG="/tmp/xtr_mysql_backup.log" 9 DATE_DIR=`date +%Y-%m-%d` 10 SUNDAY_DATE=`date -d "Last sunday" +%Y-%m-%d` 11 DATE_WEEK=`date +%w` 12 DATE_TIME=`date +%Y-%m-%d-%H-%M-%S` 13 14 15 #################################################### 16 #全量备份函数 17 #################################################### 18 function Xtr_full_backup () 19 { 20 if [ -d "${BACKUP_BASE}/full/${DATE_DIR}" ] 21 then 22 rm -rf "${BACKUP_BASE}/full/${DATE_DIR}" 23 fi 24 if [ ! -d "${BACKUP_BASE}/full" ] 25 then 26 mkdir -p "${BACKUP_BASE}/full" 27 fi 28 innobackupex --defaults-file=${CONFIG_FILE} --user=${BACKUP_USER} --password=${BACKUP_PASSWD} --port=${MYSQL_PORT} --host=${MYSQL_HOST} --no-lock --no-timestamp 29 30 "${BACKUP_BASE}/full/${DATE_DIR}" 2>"/tmp/$$full_backup.log" 31 STATS_FULL_LOG=`awk ‘/innobackupex: completed OK\!/ {print $NF}‘ "/tmp/$$full_backup.log"` 32 if [ "$STATS_FULL_LOG" != "OK!" ] 33 then 34 echo "行号LINENO; 脚本名称(basename $0); 函数名称FUNCNAME; 时间DATE_TIME; Innobackupex Full Backup Is Fail">>"$XTR_BACKUPLOG" 35 exit 1 36 else 37 echo "行号LINENO; 脚本名称(basename $0); 函数名称FUNCNAME; 时间DATE_TIME; Innobackupex Full Backup Is Ok">>"$XTR_BACKUPLOG" 38 rm -rf "/tmp/$$full_backup.log" 39 fi 40 } 41 42 43 #################################################### 44 #增量备份函数 45 #################################################### 46 function Xtr_inc_backup () 47 { 48 if [ -d "${BACKUP_BASE}/inc/${SUNDAY_DATE}/${DATE_DIR}" ] 49 then 50 rm -rf "${BACKUP_BASE}/inc/${SUNDAY_DATE}/${DATE_DIR}" 51 fi 52 if [ ! -d "${BACKUP_BASE}/inc/${SUNDAY_DATE}" ] 53 then 54 mkdir -p "${BACKUP_BASE}/inc/${SUNDAY_DATE}" 55 fi 56 if [ ! -d "${BACKUP_BASE}/full/${SUNDAY_DATE}" ] 57 then 58 echo "行号LINENO; 脚本名称(basename $0); 函数名称:$FUNCNAME; 时间:$DATE_TIME; Innobackupex Full Dir ${BACKUP_BASE}/full/$SUNDAY_DATE No 59 60 Exit">>"$XTR_BACKUPLOG" 61 exit 1 62 fi 63 innobackupex --defaults-file=${CONFIG_FILE} --user=${BACKUP_USER} --password=${BACKUP_PASSWD} --port=${MYSQL_PORT} --host=${MYSQL_HOST} --no-timestamp --parallel=8 64 65 --incremental --incremental-basedir="${BACKUP_BASE}/full/${SUNDAY_DATE}" "${BACKUP_BASE}/inc/${SUNDAY_DATE}/${DATE_DIR}" 2>"/tmp/$$inc_backup.log" 66 STATS_INC_LOG=`awk ‘/innobackupex: completed OK\!/ {print $NF}‘ "/tmp/$$inc_backup.log"` 67 if [ "$STATS_INC_LOG" != "OK!" ] 68 then 69 echo "行号:$LINENO; 脚本名称:$(basename $0); 函数名称:$FUNCNAME; 时间:$DATE_TIME; Innobackupex Inc Backup Is Fail">>"$XTR_BACKUPLOG" 70 exit 1 71 else 72 echo "行号:$LINENO; 脚本名称:$(basename $0); 函数名称:$FUNCNAME; 时间:$DATE_TIME; Innobackupex Inc Backup Is Ok">>"$XTR_BACKUPLOG" 73 rm -rf "/tmp/$$inc_backup.log" 74 fi 75 } 76 77 78 #################################################### 79 #主体备份函数 80 #################################################### 81 function Main () 82 { 83 if [ "${DATE_WEEK}" -eq 0 ] 84 then 85 Xtr_full_backup 86 else 87 Xtr_inc_backup 88 fi 89 exit 0 90 } 91 92 93 #################################################### 94 #开始备份 95 #################################################### 96 Main
原文:http://www.cnblogs.com/mysql-dba/p/4917688.html