ITPub博客

首页 > 数据库 > MySQL > INNOBACKUPEX的全备和增量备份恢复学习笔记

INNOBACKUPEX的全备和增量备份恢复学习笔记

原创 MySQL 作者:czxin788 时间:2015-07-28 21:09:48 0 删除 编辑

INNOBACKUPEX 的全备和增量备份恢复学习笔记

 

 

    说到备份MySQL数据库,不少人可能会先想到其自带的命令行工具mysqldump,要说这个工具确实不错,操作简单调用灵活,不过mysqldump属于逻辑备份工具,类似ORACLE数据库中的export,小数据量时效率尚可,当数据量达到一定规模时,使用mysqldump执行备份的时间也许还可接受,但恢复时间基本就不能忍受了。

 

这种情况下就需要一种好用又高效的工具,xtrabackup就是其中一款,号称免费版的InnoDB HotBackup。

 

Xtrabackup提供了两种命令行工具:

?1)xtrabackup:专用于备份InnoDB引擎的数据;

?2)innobackupex:这是一个perl脚本,在执行过程中会调用xtrabackup命令,这样

用该命令即可以实现备份InnoDB,也可以备份MyISAM引擎的对象。

 

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDBHotbackup的一个很好的替代品。

(1)备份过程快速、可靠;

(2)备份过程不会打断正在执行的事务;

(3)能够基于压缩等功能节约磁盘空间和流量;

(4)自动实现备份检验;

(5)还原速度快;

 

xtrabackup软件可以到http://www.percona.com/downloads/xtrabackup/免费下载。

 

关于对xtrabackup安装方法,可以参见:http://blog.itpub.net/28916011/viewspace-1753483/

一、备份

1.1、创建全备份集

[root@drbd-01 backup]# innobackupex --defaults-file=/etc/my.cnf --host 10.72.16.116 --port=3306 --user=root --password=123 --socket=/tmp/mysql.scok  /data/backup/full

 

执行完全备份后,可以对数据库建几张表,插入点数据,模拟数据库完全备份后数据的增长,然后再执行增量备份。

 

1.2增量备份

1.2.1执行基于2015-07-28_12-10-45(全备)的增量备份

这时候可以在数据库做点操作,模拟数据库的数据有更新。

增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备了。
[root@drbd-01 backup]#  innobackupex --defaults-file=/etc/my.cnf -no-timestamp --incremental --incremental-basedir=/data/backup/full/2015-07-28_12-10-45/ --user=root --password=123 /data/backup/001

 

--incremental       说明是什么备份 ,后面跟要增量备份的路径

--incremental-basedir          指向上一次的增量备份所在的目录

--no-timestamp        innobackupex--defaults-file=/etc/my.cnf --user=root --no-timestamp /data/backup/001使用--no-timestamp时,后面的这个011目录必须跟上且不能提前自己建立,它由innobackupex自动建立,否则会报innobackupex: Error: Failed to create backup directory/data/backup/001: File exists at /usr/bin/innobackupex line 3899.)

 

1.2.2 执行基于/data/backup/001进行增量备份

这时候可以再对数据库做点操作,模拟数据又进行增长,然后再做第二次增量备份。

[root@drbd-01 backup]# innobackupex --user=root --password=123 --defaults-file=/etc/my.cnf -no-timestamp --incremental --incremental-basedir=/data/backup/001  /data/backup/002

1.3 查看备份信息

可以通过以下文件查看备份信息。

 [root@drbd-01 backup]# cat /data/backup/full/2015-07-28_12-10-45/xtrabackup_checkpoints

backup_type = full-backuped

from_lsn = 0

to_lsn = 3194902

last_lsn = 3194902

compact = 0

[root@drbd-01 backup]# cat /data/backup/001/xtrabackup_checkpoints

backup_type = incremental

from_lsn = 3194902

to_lsn = 3198776

last_lsn = 3198776

compact = 0

[root@drbd-01 backup]# cat /data/backup/002/xtrabackup_checkpoints

backup_type = incremental

from_lsn = 3198776

to_lsn = 3202726

last_lsn = 3202726

compact = 0

 

上面看到,可以通过lsn看到这3个备份集关系。

 

 

小知识:

也可以通过此命令来进行指定lsn的方式进行备份

[root@drbd-01 backup]# innobackupex --user=root --password=123 --defaults-file=/etc/my.cnf --no-timestamp --incremental --incremental-lsn=3198776 /data/backup/003

 

 

二 恢复

删除原来的mysql数据目录/data/mysql,创建新的数据库目录,用来模拟数据库损坏。

[root@drbd-01 data]#rm –rf /data/mysql

[root@drbd-01 data]# cd /data/

[root@drbd-01 data]# mkdir mysql

[root@drbd-01 data]# chown mysql.mysql mysql

 

2.1 先Prepare完整备份集(应用日志)

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”即prepare的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态,innobakupex命令的--apply-log选项可用于实现上述功能。

 

[root@drbd-01 mysql]# innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /data/backup/full/2015-07-28_12-10-45/

 

--apply-log         在数据库备份好后,这些备份的数据并不能立即用于恢复,因为这些刚备份的数据里包含了未提交的数据,需要回滚,oracle里称undo数据!也包括的已完成的事务在重做日志文件中并没有写入数据文件中,这些数据需要重做!oracle里称redo!  这个参数正是用于做这些事情,以保证数据文件的一致性!在数据库恢复之前,须先对备份的数据文件应用此参数!(innobackup会重现重做日志文件(redo log file)中的事务条目,重做已经提交的事务和回滚未提交的事务!)

 

--redo-only          该选项表示在应用完成redo日志之后,针对未提交的事务不执行回滚操作,因为前一个没有提交的事务有可能在下一个备份中提交了,否则后续的增量备份无法进行恢复了。该选项需要结合--apply-log选项一起使用用。 但是最后一个增量备份的数据文件恢复时不要加--redo-only了。


2.2 Prepare增量备份集

2.2.1 合并第一个增量备份到完全备份里面

 [root@drbd-01 mysql]# innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /data/backup/full/2015-07-28_12-10-45/ --incremental-dir=/data/backup/001/

 

2.2.2 将最后一次增量备份应用日志(不用--redo-only)并且合并到全备库中

为什么这次不用 —redo-only 了呢?这是因为除了最后的一个增量备份外,前面的事务都不应该进行回滚因为有可能前一个没有提交的事物在下一个备份中提交了,如果进行了回滚则有可能导致数据不一致从而无法进行还原。

[root@drbd-01 data]# innobackupex --defaults-file=/etc/my.cnf --apply-log  /data/backup/full/2015-07-28_12-10-45/ --incremental-dir=/data/backup/002

 

2.3 执行恢复操作

[root@drbd-01 ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/full/2015-07-28_12-10-45/

           上述恢复时,只指定完全恢复的目录就行,因为前面已经做过把其他增量备份的数据合并到全备份目录里面了。

  --copy-back     把备份数据拷贝回server的datadir,它决定于my.cnf中的datadir参数,另外在恢复时datadir目录必须是空的,并且mysql数据库必须是shudown的!

 

修改权限及属主:

chown -R  mysql:mysql  /data/mysql

 

2.4、恢复完成,接下来启动mysql服务

servce mysql start

 

2.5 登录数据库进行验证数据是否恢复到最新数据状态

 

2.6 附录

2.6.1 增量备份脚本

此脚本出自:

http://blog.csdn.net/yangzhawen/article/details/30282993

 

#cat backup.sh

 

点击( 此处)折叠或打开

  1. # ! /bin /sh
  2.  #
  3.  # 第一次执行它的时候它会检查是否有完全备份 ,否则先创建一个全库备份
  4. # 当你再次运行它的时候,它会根据脚本中的设定来基于之前的全库备份进行增量备份
  5. #备份的日志在$BACKUP_DIR目录下,
  6. #ocpyang@126 .com
  7.  
  8. INNOBACKUPEX_PATH =innobackupex  #INNOBACKUPEX的命令
  9. INNOBACKUPEXFULL = /usr /bin / $INNOBACKUPEX_PATH  #INNOBACKUPEX的命令路径
  10.  
  11. #mysql目标服务器以及用户名和密码
  12. MYSQL_CMD = "--host=10.72.16.116 --user=root --password=123 --port=3306"
  13.  
  14. MYSQL_UP = "--user=root --password=123 " #mysql的用户名和密码
  15.  
  16. TMPLOG = "/tmp/innobackupex.$$.log"
  17.  
  18. MY_CNF = /etc /my .cnf #mysql的配置文件
  19.  
  20. MYSQL = /usr /bin /mysql
  21.  
  22. MYSQL_ADMIN = /usr /bin /mysqladmin
  23.  
  24. BACKUP_DIR = /backup # 备份的主目录
  25.  
  26. FULLBACKUP_DIR = $BACKUP_DIR /full # 全库备份的目录
  27.  
  28. INCRBACKUP_DIR = $BACKUP_DIR /incre # 增量备份的目录
  29.  
  30. FULLBACKUP_INTERVAL =604800 # 全库备份的间隔周期,时间:秒,604800是间隔7天
  31.  
  32. KEEP_FULLBACKUP =1 # 至少保留几个全库备份
  33.  
  34. logfiledate =backup . `date + %Y%m%d% H %M` .txt
  35. LOG_DIR = /backup /log
  36.  
  37. #开始时间
  38. STARTED_TIME = `date + % s `
  39. #date + %s从 1970 年 1 月 1 日 00 :00 :00 UTC 到目前为止的秒数
  40.  
  41.  
  42. #############################################################################
  43.  
  44. # 显示错误并退出
  45.  
  46. #############################################################################
  47.  
  48. error ( )
  49.   {
  50.      echo "$1" 1 > &2
  51.      exit 1
  52.   }
  53.  
  54.  
  55.  
  56. # 检查执行环境
  57.  
  58. if [ ! -x $INNOBACKUPEXFULL ] ; then
  59.    error "$INNOBACKUPEXFULL未安装或未链接到/usr/bin."
  60.  fi
  61. # -x 测试是否有执行权限
  62.  
  63.  
  64. if [ ! -d $BACKUP_DIR ] ; then
  65.    error "备份目标文件夹:$BACKUP_DIR不存在."
  66. fi
  67.  
  68.  
  69.  
  70. if [ -z "`$MYSQL_ADMIN $MYSQL_UP status | grep 'Uptime'`" ] ; then
  71.   error "MySQL 没有启动运行."
  72. fi
  73.  
  74.  # -z   空字符串
  75.  
  76.  
  77.  
  78. if ! `echo 'exit' | $MYSQL - s $MYSQL_CMD` ; then
  79.   error "提供的数据库用户名或密码不正确!"
  80. fi
  81.  
  82. #mysql - s , - -silent / /一行一行输出,中间用tab分隔
  83.  
  84.  
  85. # 备份的头部信息
  86.  
  87. echo "----------------------------"
  88. echo
  89.  echo "$0: MySQL备份脚本"
  90. echo "开始于: `date +%F' '%T' '%w`"
  91.  echo
  92. #上面的$0 表示当前运行的进程名或是当前执行的脚本名
  93.  
  94.  
  95. #新建全备和差异备份的目录
  96.  
  97. mkdir - p $FULLBACKUP_DIR
  98.  mkdir - p $INCRBACKUP_DIR
  99.  mkdir - p $LOG_DIR
  100.  
  101.  
  102. #查找最新的完全备份
  103. LATEST_FULL_BACKUP = `find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 - type d -printf "%P\n" | sort -nr | head -1`
  104.  
  105. # -mindepthd 1 ,表示从$FULLBACKUP_DIR目录的第0层开始查; -maxdepth 1,表示列出$FULLBACKUP_DIR内的文件时深度最多为0层
  106.  
  107.  
  108. # 查找最近修改的最新备份
  109.  
  110. LATEST_FULL_BACKUP_CREATED_TIME = `stat -c %Y $FULLBACKUP_DIR / $LATEST_FULL_BACKUP`
  111. #stat -c %Y 获取文件的修改时间
  112.  
  113.  #如果全备有效进行增量备份否则执行完全备份
  114. if [ "$LATEST_FULL_BACKUP" - a `expr $LATEST_FULL_BACKUP_CREATED_TIME + $FULLBACKUP_INTERVAL + 5` -ge $STARTED_TIME ] ; then
  115.  # 如果最新的全备未过期则以最新的全备文件名命名在增量备份目录下新建目录
  116. echo -e "完全备份$LATEST_FULL_BACKUP未过期,将根据$LATEST_FULL_BACKUP名字作为增量备份目录命名"
  117. echo "        "
  118.  NEW_INCRDIR = $INCRBACKUP_DIR / $LATEST_FULL_BACKUP
  119.  mkdir - p $NEW_INCRDIR
  120.  
  121.  
  122.  
  123. # 查找最新的增量备份是否存在 .指定一个备份的路径作为增量备份的基础
  124. LATEST_INCR_BACKUP = `find $NEW_INCRDIR -mindepth 1 -maxdepth 1 - type d | sort -nr | head -1`
  125.  
  126. if [ ! $LATEST_INCR_BACKUP ] ; then
  127.  INCRBASEDIR = $FULLBACKUP_DIR / $LATEST_FULL_BACKUP
  128.  echo -e "增量备份将以$INCRBASEDIR作为备份基础"
  129. echo "        "
  130.  else
  131.  INCRBASEDIR = $LATEST_INCR_BACKUP
  132.  echo -e "增量备份将以$INCRBASEDIR作为备份基础"
  133. echo "        "
  134.  fi
  135.  
  136.  
  137.  
  138. echo "使用$INCRBASEDIR作为基础做新的增量备份."
  139.  $INNOBACKUPEXFULL - -defaults - file = $MY_CNF - -use -memory =4G $MYSQL_CMD - -incremental $NEW_INCRDIR - -incremental -basedir $INCRBASEDIR > $TMPLOG 2 > &1
  140.  else
  141.  echo "*********************************"
  142.  echo -e "正在执行全新的完全备份...请稍等..."
  143. echo "*********************************"
  144. #$INNOBACKUPEXFULL - -defaults - file = $MY_CNF - -use -memory =4G  $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2 > &1
  145. $INNOBACKUPEXFULL - -defaults - file = $MY_CNF - -use -memory =4G - - rsync - - compress - - compress - threads = 5 - - compress - chunk - size =64K - -slave - info $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2 > &1
  146. #上面黄色是czxin加的,为了压缩备份
  147.  fi
  148. # - -use -memory该参数在 prepare 的时候使用,控制 prepare 时 innodb 实例使用的内存量
  149.  
  150.  #保留一份备份的详细日志
  151.  
  152. cat $TMPLOG > $LOG_DIR / $logfiledate
  153.  
  154.  
  155.  
  156. if [ -z "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`" ] ; then
  157.   echo "$INNOBACKUPEX命令执行失败:" ; echo
  158.   echo -e "---------- $INNOBACKUPEX_PATH错误 ----------"
  159.   cat $TMPLOG
  160.   rm -f $TMPLOG
  161.   exit 1
  162.  fi
  163.  
  164.  
  165.  
  166. THISBACKUP = `awk - - "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPLOG`
  167.  rm -f $TMPLOG
  168.  
  169.  
  170.  
  171. echo -n "数据库成功备份到:$THISBACKUP"
  172.  echo
  173.  
  174.  
  175.  
  176. # 提示应该保留的备份文件起点
  177. LATEST_FULL_BACKUP = `find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 - type d -printf "%P\n" | sort -nr | head -1`
  178.  echo -e "必须保留$KEEP_FULLBACKUP份全备和全备$LATEST_FULL_BACKUP以后的所有增量备份."
  179.  
  180.  
  181.  #删除过期的全备
  182. #echo -e "寻找过期的全备文件并删除" > > $LOG_DIR / $logfiledate
  183.   for efile in $ ( /usr /bin /find $FULLBACKUP_DIR / -mindepth 1 -maxdepth 1 -mtime +8 )
  184.  do
  185.   if [ -d $efile ] ; then
  186.    /bin /rm rm -rf $efile
  187.   echo -e "删除过期全备目录:$efile" > > $LOG_DIR / $logfiledate
  188. #  elif [ -f $efile ] ; then
  189. # /bin /rm rm -rf $ file
  190. #  echo -e "删除过期全备文件:$efile" > > $LOG_DIR / $logfiledate
  191.   fi ;
  192.  
  193.  done
  194.  
  195. if [ $ ? -ne "0" ] ;then
  196.     echo
  197.     echo -e "未找到可以删除的过期全备文件" > > $LOG_DIR / $logfiledate
  198. fi
  199.  
  200. #删除过期增量备份
  201. #echo -e "寻找过期的增量备份目录并删除" > > $LOG_DIR / $logfiledate
  202.   for efile in $ ( /usr /bin /find $INCRBACKUP_DIR / -mindepth 1 -maxdepth 1 -mtime +8 )
  203.  do
  204.   if [ -d $efile ] ; then
  205.    /bin /rm -rf $efile
  206.   echo -e "删除过期增量备份目录:$efile" > > $LOG_DIR / $logfiledate

  207.   fi ;
  208.  
  209.  done
  210.  
  211. if [ $ ? -ne "0" ] ;then
  212.     echo
  213.     echo -e "未找到可以删除的过期增量备份文件" > > $LOG_DIR / $logfiledate
  214. fi

  215.  
  216. echo
  217.  echo "完成于: `date +%F' '%T' '%w`"
  218.  exit 0



    来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28916011/viewspace-1754640/ ,如需转载,请注明出处,否则将追究法律责任。

    请登录后发表评论 登录
    全部评论

    注册时间:2014-06-03

    • 博文量
      233
    • 访问量
      858413