http://blog.csdn.net/yanggd1987/article/category/2214421

https://www.centos.bz/2013/09/innobackupex-auto-backup-with-shell/

之前我们提到过xtrbackup备份mysql的几种方式:完整备份、增量备份、部分备份等,但是在实际生产环境中用到最多的还是增量备份,下面我们就来写一个脚本。

此脚本在https://www.centos.bz/2013/09/innobackupex-auto-backup-with-shell/基础上重新修改。

  1. #!/bin/bash
  2. #
  3. #
  4. #note:周日作完整备份,其它时间增量备份;每次增量备份后,都将incr_basedir打包压缩;若是本周最后一次增量备份,则备份完成后将本次备份内容直接打包压缩
  5. #每次备份的日志都会将其移动到本次备份目录中,如:0_innobackupex.log表示全备,1_innobackupex.log表示第一次增备
  6. #由于服务器空间有限,每周的做完整备份前会将上周的所有备份删除
  7. #由于压缩是对绝对路径进行压缩,因此在使用tar命令进行压缩或解压时,都是用P参数或使用tar -C
  8. #如果脚本停止或出错请到back_dir下查看日志,若此次备份没有问题,会将本次打印的日志转移到备份目录下
  9. #定义相关变量
  10. backup_base=/data/mysqlbak
  11. full_backup_dir=$backup_base/mysql_full_backup
  12. incr_backup_dir=$backup_base/mysql_incr_backup
  13. sub_incr_dir=$(date +%w)
  14. user=test
  15. password=test
  16. defaults_file=/etc/my.cnf
  17. #include_db="centos.*|mysql.*"
  18. error_lock_file=$backup_base/error.locked
  19. backup_dir=$backup_base/log
  20. #innobackupex性能参数
  21. iops=400
  22. mem=1GB
  23. thread=4
  24. #相关函数
  25. #检查命令是否执行成功
  26. if_sucess(){
  27. local command="$1"
  28. $command
  29. if [ $? -ne 0 ];then
  30. echo "error."
  31. touch $error_lock_file
  32. exit 1
  33. fi
  34. }
  35. #检查是否存在锁文件,如果存在就退出。
  36. check_locked(){
  37. if [ -f  "$error_lock_file" ];then
  38. echo "error_lock_file found"
  39. exit 1
  40. fi
  41. }
  42. #压缩上次备份完整或增量备份
  43. compress_old_backup(){
  44. if_sucess "tar czPf ${incr_base_dir}.tar.gz $incr_base_dir"
  45. if_sucess "mv ${incr_base_dir}.tar.gz $backup_base/old"
  46. rm -rf $incr_base_dir
  47. }
  48. #程序从这里开始
  49. check_locked
  50. mkdir -p $full_backup_dir $incr_backup_dir $backup_base/old $backup_base/log
  51. #输入日志相关
  52. backup_log=${backup_dir}/${sub_incr_dir}_innobackupex.log
  53. exec 100> $backup_log
  54. exec 1>&100
  55. exec 2>&1
  56. echo ""
  57. echo ""
  58. echo "################$(date +%Y%m%d-%H:%M) start ##################"
  59. #周日就作完整备份,其它时间增量备份;每次增量备份后,都将basedir打包压缩;若是本周最后一次增量备份,则备份完成后将本次备份内容直接打包压缩
  60. if [ $sub_incr_dir -eq 0 ];then
  61. #删除上周完成的所有备份
  62. echo "################$(date +%Y%m%d-%H:%M) remove old backup ###################"
  63. rm -rf $backup_base/old/*
  64. echo "################$(date +%Y%m%d-%H:%M) start full backup ###############"
  65. full_date=$(date +%Y%m%d%H%M)
  66. 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"
  67. echo "incr_base_dir=$full_backup_dir/full${sub_incr_dir}_$full_date" > $backup_base/incr_base_dir.txt
  68. #转移日志到此次备份目录下
  69. if_sucess "mv $backup_log $full_backup_dir/full${sub_incr_dir}_$full_date"
  70. else
  71. #获取增量备份的basedir目录
  72. [ -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
  73. echo "################$(date +%Y%m%d-%H:%M) start incremental backup ###############"
  74. incr_date=$(date +%Y%m%d%H%M)
  75. 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"
  76. echo "incr_base_dir=$incr_backup_dir/incr${sub_incr_dir}_${incr_date}" >> $backup_base/incr_base_dir.txt
  77. #转移日志到此次备份目录下
  78. if_sucess "mv $backup_log $incr_backup_dir/incr${sub_incr_dir}_${incr_date}"
  79. echo "################$(date +%Y%m%d-%H:%M) start compress $incr_base_dir ###############"
  80. [ -d "$incr_base_dir" ] && compress_old_backup
  81. #若是本周最后一次增量备份,则备份完成后将备份内容直接打包压缩
  82. [ $sub_incr_dir -eq 6 ] && . $backup_base/incr_base_dir.txt && compress_old_backup
  83. fi
  84. exec 100>&-
  85. #将本地备份同步到异地
  86. echo "################$(date +%Y%m%d-%H:%M) stop ##################"
  87. echo ""
  88. echo ""
  89. echo "################$(date +%Y%m%d-%H:%M) rsync start ##################"
  90. /usr/bin/rsync -avz --password-file=/etc/rsync.pas $backup_base/old/ test@X.X.X.X::mysqlbak/
  91. 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,如下:

  1. uuid = 1703dbc2-7cce-11e5-b351-b82a72d5ba07
  2. name =
  3. tool_name = innobackupex
  4. 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
  5. tool_version = 1.5.1-xtrabackup
  6. ibbackup_version = xtrabackup version 2.2.9 based on MySQL server 5.6.22 Linux (x86_64) (revision id: )
  7. server_version = 5.6.22-log
  8. start_time = 2015-10-28 01:01:01
  9. end_time = 2015-10-28 01:13:49
  10. lock_time = 27
  11. binlog_pos = filename 'mysql-bin.000711', position 721836584
  12. innodb_from_lsn = 1021734207515
  13. innodb_to_lsn = 1025349925630
  14. partial = N
  15. incremental = Y
  16. format = file
  17. compact = N
  18. compressed = N
  19. encrypted = N

来查看本次备份的start_tiime,end_time以及lock_time,为什么会有lock_time呢?

因此innobackupex先会备份innodb引擎的数据库,此过程不会锁表;然后再全库锁表,备份myisam引擎的数据库,因此会有一个lock_time;从info信息中还可以得到其他可用信息。另innobackupex的全库锁表时也可能会导致整个备份过程很长。

 
 
 

版权声明:本文为博主原创文章,未经博主允许不得转载。

xtrabackup增量备份mysql +MHA的更多相关文章

  1. mysql xtrabackup增量备份

    mysql 增量备份策略 周一全备,其他增量备份,根据业务需要,设定保留日期,如保留一月. 增量备份步骤; 1 创建全备 2 根据全备目录,创建增量备份 3 第二次增量备份根据第一次增量备份目录,依次 ...

  2. XtraBackup增量备份

    mysql:5.6.29xtrabackup:2.2.10mysql数据目录:/data/mysqlmysql备份目录:/data/dbbak/ #确保有足够的磁盘空间 官方文档:https://ww ...

  3. innobackupex 备份 Xtrabackup 增量备份

    Mysql增量备份Xtrabackup中包含两个工具:•        xtrabackup - 用于热备份innodb, xtradb表的工具,不能备份其他表(MYISAM表).•        i ...

  4. Xtrabackup 增量备份 和 增量还原

    目录 测试数据准备 进行全量备份 第一次增量插入一条数据 进行第一次增量备份 注意 第二次增量插入一条数据 进行第二次增量备份 注意 查看xtrabackup_binlog_info中的binlog位 ...

  5. xtrabackup增量备份MySQL-5.7操作说明

    下载工具 本方法利用xtrabackup二进制包,版本是2.4.26 # 从官网下载二进制包:wget https://downloads.percona.com/downloads/Percona- ...

  6. xtrabackup 增量备份(InnoDB)

    mysql> select * from users; +----+-----------+----------+--------------+ | id | name | password | ...

  7. 16、xtrabackup 增量备份及恢复

    备份命令如下 备份命令如下 全量备份 #  innobackupex -p123123 /backup # ls /backup 2017-04-08_13-36-11 增量备份或差量备份 # inn ...

  8. 完整和增量备份MySQL脚本

    本文档采用mysqldump 对数据库进行备份,mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法 ...

  9. shell脚本 binlog方式增量备份mysql

    一.简介 源码地址 日期:2018/4/12 介绍:复制Binlog日志方式的增量备份脚本,并保存固定天数的备份 效果图: 二.使用 适用:centos6+ 语言:中文 注意:使用前先修改脚本中变量 ...

随机推荐

  1. 对ip数据进行分类----c++

    #!/usr/bin/expect set ip [lindex $argv ] set password [lindex $argv ] spawn -l root ${ip} "host ...

  2. zoj3478

    最短路 吐槽一下...最先开始写了个地图哈希,6kb,然后不是正解,又写了个spfa,4kb,还是不对,无奈抄标程,结果把spfa改成dijiestra就对了... 由于只有两个变量,所以我们设一个四 ...

  3. pull的时候报错

  4. JavaWEB开发入门

    1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: •静态web资源(如html 页面 ...

  5. 强迫症!一行代码拿到url特定query的值

    简单的说一下背景,看到小伙伴给我发的项目中有一段获取当前url特定query值的代码,本着能写1行代码就不写5行代码的原则,我把这个获取方法给改了一下 之前的代码如下: const queryArr ...

  6. 深入理解Redis(一)——高级键管理与数据结构

    引语 这个章节主要讲解了三部分内容: 如何设计并管理Redis的键以及与其关联的数据结构: 了解并使用Redis客户端对象映射器: 介绍如何利用大O标记来评估Redis性能. 键与数据结构 键 我们先 ...

  7. cocos2d-x https

    cocos2d-x :2.1.3HttpClient.cpp文件中  bool configureCURL(CURL *handle)后边添加如下两句: curl_easy_setopt(handle ...

  8. Lua Time

    -- local getTime = os.date(“%c”); -- %a abbreviated weekday name (e.g., Wed)-- %A full weekday name ...

  9. P1401 城市(30分,正解网络流)

    题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...

  10. C++编译错误fatal error C1004: 发现意外的文件尾

    出现这种情况就是类或者结构体的定义后面没有加“;”导致的. 而且这种问题好难排查.