xtrabackup增量备份mysql
2015-10-21 12:11
676 查看
之前我们提到过xtrbackup备份mysql的几种方式:完整备份、增量备份、部分备份等,但是在实际生产环境中用到最多的还是增量备份,下面我们就来写一个脚本。
此脚本在https://www.centos.bz/2013/09/innobackupex-auto-backup-with-shell/基础上重新修改。
要点:
1.xtrabackup虽然支持异地备份,但是无法同时实现增量备份,因为增量备份需要的incremental_basedir在异地,因此我们需要通过rsync同步
2.xtrabackup增量备份无法启用流压缩,原因同样需要incremental_basedir,因此我们脚本中每次会保留增量备份需要的incremental_basedir,使用完后再将其压缩
3.为避免xtrabackup备份过程影响mysql服务器性能并加快备份过程,需要设置相关参数,具体情况根据服务器资源来设定。
4.为方便查看打印日志,我们通过exec来记录日志,最后不要忘记关闭exec的文件描述符
实验过程中,200多个G 的数据库完整备份需要30分钟左右完成,增量备份只需10分钟左右完成。
最后,在备份完成后我们可以查看xtrabackup_info,如下:
因此innobackupex先会备份innodb引擎的数据库,此过程不会锁表;然后再全库锁表,备份myisam引擎的数据库,因此会有一个lock_time;从info信息中还可以得到其他可用信息。另innobackupex的全库锁表时也可能会导致整个备份过程很长。
此脚本在https://www.centos.bz/2013/09/innobackupex-auto-backup-with-shell/基础上重新修改。
#!/bin/bash # # #note:周日作完整备份,其它时间增量备份;每次增量备份后,都将incr_basedir打包压缩;若是本周最后一次增量备份,则备份完成后将本次备份内容直接打包压缩 #每次备份的日志都会将其移动到本次备份目录中,如:0_innobackupex.log表示全备,1_innobackupex.log表示第一次增备 #由于服务器空间有限,每周的做完整备份前会将上周的所有备份删除 #由于压缩是对绝对路径进行压缩,因此在使用tar命令进行压缩或解压时,都是用P参数或使用tar -C #如果脚本停止或出错请到back_dir下查看日志,若此次备份没有问题,会将本次打印的日志转移到备份目录下 #定义相关变量 backup_base=/data/mysqlbak full_backup_dir=$backup_base/mysql_full_backup incr_backup_dir=$backup_base/mysql_incr_backup sub_incr_dir=$(date +%w) user=test password=test defaults_file=/etc/my.cnf #include_db="centos.*|mysql.*" error_lock_file=$backup_base/error.locked backup_dir=$backup_base/log #innobackupex性能参数 iops=400 mem=1GB thread=4 #相关函数 #检查命令是否执行成功 if_sucess(){ local command="$1" $command if [ $? -ne 0 ];then echo "error." touch $error_lock_file exit 1 fi } #检查是否存在锁文件,如果存在就退出。 check_locked(){ if [ -f "$error_lock_file" ];then echo "error_lock_file found" exit 1 fi } #压缩上次备份完整或增量备份 compress_old_backup(){ if_sucess "tar czPf ${incr_base_dir}.tar.gz $incr_base_dir" if_sucess "mv ${incr_base_dir}.tar.gz $backup_base/old" rm -rf $incr_base_dir } #程序从这里开始 check_locked mkdir -p $full_backup_dir $incr_backup_dir $backup_base/old $backup_base/log #输入日志相关 backup_log=${backup_dir}/${sub_incr_dir}_innobackupex.log exec 100> $backup_log exec 1>&100 exec 2>&1 echo "" echo "" echo "################$(date +%Y%m%d-%H:%M) start ##################" #周日就作完整备份,其它时间增量备份;每次增量备份后,都将basedir打包压缩;若是本周最后一次增量备份,则备份完成后将本次备份内容直接打包压缩 if [ $sub_incr_dir -eq 0 ];then #删除上周完成的所有备份 echo "################$(date +%Y%m%d-%H:%M) remove old backup ###################" rm -rf $backup_base/old/* echo "################$(date +%Y%m%d-%H:%M) start full backup ###############" full_date=$(date +%Y%m%d%H%M) if_sucess "/usr/bin/innobackupex --user=$user --password=$password --defaults-file=$defaults_file --no-timestamp --throttle=$iops --use-memory=$mem --parallel=$thread $full_backup_dir/full${sub_incr_dir}_$full_date" echo "incr_base_dir=$full_backup_dir/full${sub_incr_dir}_$full_date" > $backup_base/incr_base_dir.txt #转移日志到此次备份目录下 if_sucess "mv $backup_log $full_backup_dir/full${sub_incr_dir}_$full_date" else #获取增量备份的basedir目录 [ -f "$backup_base/incr_base_dir.txt" ] && incr_base_dir=$(sed -n '$p' $backup_base/incr_base_dir.txt | awk -F= '{print $2}') || exit 1 echo "################$(date +%Y%m%d-%H:%M) start incremental backup ###############" incr_date=$(date +%Y%m%d%H%M) if_sucess "/usr/bin/innobackupex --user=$user --password=$password --defaults-file=$defaults_file --throttle=$iops --use-memory=$mem --incremental --parallel=$thread $incr_backup_dir/incr${sub_incr_dir}_${incr_date} --no-timestamp --incremental-basedir=$incr_base_dir" echo "incr_base_dir=$incr_backup_dir/incr${sub_incr_dir}_${incr_date}" >> $backup_base/incr_base_dir.txt #转移日志到此次备份目录下 if_sucess "mv $backup_log $incr_backup_dir/incr${sub_incr_dir}_${incr_date}" echo "################$(date +%Y%m%d-%H:%M) start compress $incr_base_dir ###############" [ -d "$incr_base_dir" ] && compress_old_backup #若是本周最后一次增量备份,则备份完成后将备份内容直接打包压缩 [ $sub_incr_dir -eq 6 ] && . $backup_base/incr_base_dir.txt && compress_old_backup fi exec 100>&- #将本地备份同步到异地 echo "################$(date +%Y%m%d-%H:%M) stop ##################" echo "" echo "" echo "################$(date +%Y%m%d-%H:%M) rsync start ##################" /usr/bin/rsync -avz --password-file=/etc/rsync.pas $backup_base/old/ test@X.X.X.X::mysqlbak/ echo "################$(date +%Y%m%d-%H:%M) rsync stop ##################"
要点:
1.xtrabackup虽然支持异地备份,但是无法同时实现增量备份,因为增量备份需要的incremental_basedir在异地,因此我们需要通过rsync同步
2.xtrabackup增量备份无法启用流压缩,原因同样需要incremental_basedir,因此我们脚本中每次会保留增量备份需要的incremental_basedir,使用完后再将其压缩
3.为避免xtrabackup备份过程影响mysql服务器性能并加快备份过程,需要设置相关参数,具体情况根据服务器资源来设定。
4.为方便查看打印日志,我们通过exec来记录日志,最后不要忘记关闭exec的文件描述符
实验过程中,200多个G 的数据库完整备份需要30分钟左右完成,增量备份只需10分钟左右完成。
最后,在备份完成后我们可以查看xtrabackup_info,如下:
uuid = 1703dbc2-7cce-11e5-b351-b82a72d5ba07 name = tool_name = innobackupex tool_command = --user=xtrabak --password=... --defaults-file=/etc/my.cnf --throttle=400 --use-memory=1GB --incremental --parallel=4 /data/mysqlbak/mysql_incr_backup/incr3_201510280101 --no-timestamp --incremental-basedir=/data/mysqlbak/mysql_incr_backup/incr2_201510270101 tool_version = 1.5.1-xtrabackup ibbackup_version = xtrabackup version 2.2.9 based on MySQL server 5.6.22 Linux (x86_64) (revision id: ) server_version = 5.6.22-log start_time = 2015-10-28 01:01:01 end_time = 2015-10-28 01:13:49 lock_time = 27 binlog_pos = filename 'mysql-bin.000711', position 721836584 innodb_from_lsn = 1021734207515 innodb_to_lsn = 1025349925630 partial = N incremental = Y format = file compact = N compressed = N encrypted = N来查看本次备份的start_tiime,end_time以及lock_time,为什么会有lock_time呢?
因此innobackupex先会备份innodb引擎的数据库,此过程不会锁表;然后再全库锁表,备份myisam引擎的数据库,因此会有一个lock_time;从info信息中还可以得到其他可用信息。另innobackupex的全库锁表时也可能会导致整个备份过程很长。
相关文章推荐
- MySql常用函数数学函数、加密函数等(转—收藏)
- Mysql总结
- MySQL 5.6初始配置调优
- mysqldumpslow使用说明总结
- 文章标题 关于MySQL卸载几点注意事项
- mysql存储过程与sql server存储过程自动生成编号:20150101007 当天逐一增加 方法比较
- mysql 备份与恢复
- 如何将CSV数据导入MySQL?
- mysql 的 find_in_set函数使用方法
- 论MySQL何时使用索引,何时不使用索引
- 安装discuz论坛mysqli解决方法
- mysql集群之MMM简单搭建
- 磁盘空间满了之后MySQL会怎样
- mysql BLOB类型
- Amoeba-mysql主从+读写分离实战+测试
- mysql主从复制
- mysql实用教程的数据构造
- MySQL 导出数据为csv格式的方法
- MyCli:支持自动补全和语法高亮的MySQL客户端
- rsync+inotify-tools+ssh实现mysql-bin日志文件实时备份