使用shell脚本结合innobackupex自动备份mysql innodb数据库

上篇文章介绍了使用Xtrabackup备份mysql innodb数据库,这次给出一个自动备份的shell脚本,脚本每周六作一次完整备份,其它时间每天作一次增量备份。

  1. #!/bin/bash
  2. #检查命令是否执行成功
  3. if_sucess(){
  4. local command="$1"
  5. $command
  6. if [ $? -ne 0 ];then
  7. echo "error."
  8. touch $error_lock_file
  9. exit 1
  10. fi
  11. }
  12. #检查是否存在锁文件,如果存在就退出。
  13. check_locked(){
  14. if [ -f  "$error_lock_file" ];then
  15. echo "error_lock_file found"
  16. exit 1
  17. fi
  18. }
  19.  
  20. #压缩备份一周的完整与增量备份
  21. compress_old_backup(){
  22. if_sucess "tar czf $old_backup_file_temp $full_backup_dir $incr_backup_dir"
  23. rm -f $old_backup_file
  24. if_sucess "mv $old_backup_file_temp $old_backup_file"
  25. rm -rf $full_backup_dir $incr_backup_dir/*
  26. }
  27. #定义相关变量
  28. backup_base=/data/mysql_backup
  29. full_backup_dir=$backup_base/centos_full_backup
  30. incr_backup_dir=$backup_base/centos_incr
  31. sub_incr_dir=$(date +%w)
  32. old_backup_file=$backup_base/old/centos_old.tar.gz
  33. old_backup_file_temp=$backup_base/old/centos_old_temp.tar.gz
  34. user=devops.webres.wang
  35. password=123456
  36. defaults_file=/etc/mysql/my.cnf
  37. include_db="centos.*|mysql.*"
  38. error_lock_file=$backup_base/error.locked
  39.  
  40. #程序从这里开始
  41. check_locked
  42. mkdir -p  $incr_backup_dir $backup_base/old
  43.  
  44. #周六就作完整备份,其它时间增量备份。
  45. if [ $sub_incr_dir -eq 6 ];then
  46. [ -d "$full_backup_dir" ] && compress_old_backup
  47. if_sucess "innobackupex –user=$user –password=$password  –defaults-file=$defaults_file –no-timestamp –include=$include_db  $full_backup_dir"
  48. echo "incr_base_dir=$full_backup_dir" > $full_backup_dir/incr_base_dir.txt
  49. else
  50. [ -f "$full_backup_dir/incr_base_dir.txt" ] && . $full_backup_dir/incr_base_dir.txt || exit 1
  51. if_sucess "innobackupex –user=$user –password=$password  –defaults-file=$defaults_file –incremental $incr_backup_dir/$sub_incr_dir –no-timestamp  –include=$include_db –incremental-basedir=$incr_base_dir"
  52. echo "$incr_base_dir=$incr_backup_dir/$sub_incr_dir" > $full_backup_dir/incr_base_dir.txt
  53. fi

Percona Xtrabackup备份mysql大数据库(完整备份与增量备份)

Xtrabackup简介

Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁)。XtraBackup支持所有的Percona Server、MySQL、MariaDB和Drizzle。

XtraBackup优势 :
1、无需停止数据库进行InnoDB热备
2、增量备份MySQL
3、流压缩到传输到其它服务器
4、能比较容易地创建主从同步
5、备份MySQL时不会增大服务器负载

Xtrabackup安装

这里只介绍Ubuntu-12.04下的安装方法,其它系统的安装方法请参考http://www.percona.com/doc/percona-xtrabackup/2.1/installation.html

  1. apt-key adv –keyserver keys.gnupg.net –recv-keys 1C4CBDCDCD2EFD2A

在/etc/apt/sources.list加入:

  1. deb http://repo.percona.com/apt precise main
  2. deb-src http://repo.percona.com/apt precise main

执行update及安装操作

  1. apt-get update
  2. apt-get install percona-xtrabackup

注:precise是Ubuntu-12.04的版本代号,如果是其它系统版本,需要更换。

Xtrabackup工具介绍

安装XtraBackup后,其实会有几个工具:
innobackupex:
这个是其实是下面三个工具的一个perl脚本封装,可以备份MyISAM, InnoDB, XtraDB表。
xtrabackup:
一个由C编译而来的二进制文件,只能备份InnoDB和XtraDB数据。
xbcrypt:
用来加密或解密备份的数据。
xbstream:
用来解压或压缩xbstream格式的压缩文件。
建议使用perl封装的innobackupex来作数据库备份,因为比较容易使用。所以下面只介绍innobackupex的使用。其它的使用参考:http://www.percona.com/doc/percona-xtrabackup/2.1/manual.html

innobackupex使用方法

完整的选项使用请执行innobackupex –help,这里只介绍使用常用的选项进行完整备份及增量备份和还原。

完整备份及还原

假如我们要备份centos和mysql数据库。
备份:

  1. innobackupex –user=root –password=root –defaults-file=/etc/mysql/my.cnf –include="centos.<em>|mysql.</em>"    /data/mysql_backup

这样就会在/data/mysql_backup生成一个带时间的目录,如果不需要带时间,可以使用选项–no-timestamp。
如果想备份成压缩文件,可以使用如下语句:

  1. innobackupex –user=root –password=root –defaults-file=/etc/mysql/my.cnf –include="centos.<em>|mysql.</em>" –no-timestamp –stream=tar ./ | gzip – > devops.webres.wang.tar.gz

还原:
假如完整备份的路径为/data/mysql_backup/full_backup,如果完整备份是压缩文件,需要先解压再还原。

  1. innobackupex –apply-log  /data/mysql_backup/centos_full_backup
  2. innobackupex –copy-back –defaults-file=/etc/mysql/my.cnf /data/mysql_backup/centos_full_backup
  3. chown -R mysql:mysql /var/lib/mysql

增量备份及还原

增量备份是建立在完整备份的基础上的,所以首先确保已经完整备份了一次。
完整备份:

  1. innobackupex –user=root –password=root –include="centos.*"  –no-timestamp /data/mysql_backup/centos_full_backup

现在完整备份的目录为/data/mysql_backup/centos_full_backup。
增量备份:
第一次增量备份:

  1. innobackupex –incremental /data/mysql_backup/inc/20130906 –no-timestamp –incremental-basedir=/data/mysql_backup/centos_full_backup –user=root –password=root –defaults-file=/etc/mysql/my.cnf

第二次增量备份:

  1. innobackupex –incremental /data/mysql_backup/inc/20130907 –no-timestamp –incremental-basedir=/data/mysql_backup/inc/20130906 –user=root –password=root –defaults-file=/etc/mysql/my.cnf

选项–incremental是指定作增量备份 –incremental-basedir选项是指定上一次增量备份的目录(如果是第一次作增量备份,则为完整备份的目录)。
还原:
增量备份的还原操作跟完整的还原有点不一样,首先必须使用–apply-log –redo-only对完整备份的目录及所有增量备份目录进行操作,然后就可以像还原完整备份时的操作了。
对每个备份目录作apply-log redo-only操作(最后一个增量备份不需要redo-only)

  1. innobackupex –apply-log –redo-only /data/mysql_backup/centos_full_backup  –user=root –password=root
  2. innobackupex –apply-log –redo-only /data/mysql_backup/centos_full_backup  –incremental-dir=/data/mysql_backup/inc/20130906 –user=root –password=root
  3. innobackupex –apply-log  /data/mysql_backup/centos_full_backup  –incremental-dir=/data/mysql_backup/inc/20130907 –user=root –password=root

下面就跟还原完整备份时一样了:

  1. innobackupex-1.5.1 –apply-log /data/mysql_backup/centos_full_backup –use-memory=1G –user=root –password=root
  2. innobackupex –copy-back –defaults-file=/etc/mysql/my.cnf /data/mysql_backup/centos_full_backup