xtrabackup增量备份mysql +MHA

摘要:
[html]viewplaincopy#!

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/基础上重新修改。

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

[html] view plain copy
 
  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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Vue简洁及基本用法三种循环的流程图画法总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Web渗透——web服务器指纹识别

1、概述 Web服务器指纹识别是渗透测试人员非常重要的一个任务。了解正在运行的web服务器类型和版本能让测试者更好去测试已知漏洞和大概的利用方法。 目前市场上存在几种不同的web服务器提供商和软件版本,了解被测试的web服务器的类型,将会在渗透测试过程中有很大的帮助,甚至会改变测试的路线。 你可以通过发送web服务器特定的命令并分析输出结果来得到这些信息,...

mysql 批处理文件出错后继续执行

在升级批处理sql脚本的时候,由于各种编写的不规范、不可重复执行,我们通常希望在sql脚本出错后不中止,而是执行完成。虽然这些问题可通过编写可重复执行的mysql存储过程比如add_column/drop_column执行,但是很多时候,现成的版本还需要较长一段时间过渡,所以这个需求仍然是有必要的。 其实很简单,只需要加上--force命令行选项即可,如下...

DateTimeField *** received a naive datetime (***) while time zone support is active

django报错: /usr/local/lib/python2.7/dist-packages/Django-1.8.2-py2.7.egg/django/db/models/fields/init.py:1474: RuntimeWarning: DateTimeField Org.updatedAt received a naive datetime...

noodjs(koa)+mysql搭建服务器环境及基本的增删改查操作

手动创建项目文件 1.在指定目录下,右击创建项目文件夹。2.使用git init 命令把此文件下内容变成可由git进行版本控制的文件。3.执行“npm init -y”命令,创建package.json文件,初始化4.执行“npm init koa”命令,安装koa,此时项目路径下会生成一个package-lock.json文件。 创建server 1.创...

MYSQL 批量删除以特定前缀开头的表

前言 这是工作中确实会用到,比如分库分表后有t_order_01、t_order_02、t_order_03...t_order_08 这样的表。 测试过程中造了大量数据进行测试,其中可能含有部分脏数据,因此下一轮测试时最好把整个模块的数据进行删除。...

MySQL java连接被拒绝:java.sql.SQLException: Access denied for user 'root'@'****' (using password: YES)

//系统运行出现错误:java.sql.SQLException: Access denied for user 'root'@'***.**.**.**' (using password: YES) MySQL服务器部署在Ubuntu上,错误中被我隐掉的是我的公网IP。 数据库管理工具连接出现以下错误: 这是由于“IP为***.**.**.**,名字为...