免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8053 | 回复: 10
打印 上一主题 下一主题

【分享】基于innobackupex的mysql备份脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-16 18:08 |只看该作者 |倒序浏览
本帖最后由 chinafenghao 于 2013-04-17 17:38 编辑

最近刚刚写了一个mysql的备份脚本,里面内置了如何恢复单表,全库恢复,增量恢复的help信息。之前一直苦于不能对单表进行恢复,这次终于可以了。
  1. #!/bin/bash

  2. #This is a ShellScript For mysql All DB Backup and Bin-log.
  3. #version v1
  4. #2013-04-12

  5. #此脚本为一周一个全库备份,每天一个增量备份。每周一为全库备份,其他为增量备份。

  6. # Defaults setting
  7. port=3306
  8. weekly=1

  9. recovery_single_table(){
  10. cat << EOF
  11. 导入或导出单张表:
  12.   默认情况下,InnoDB表不能通过直接复制表文件的方式在mysql服务器之间进行移植,即便使用了innodb_file_per_table选项。而使用Xtrabackup工具可以实现此种功能,
  13. 不过,此时需要“导出”表的mysql服务器启用了innodb_file_per_table选项(严格来说,是要“导出”的表在其创建之前,mysql服务器就启用了innodb_file_per_table选项),
  14. 并且“导入”表的服务器同时启用了innodb_file_per_table和innodb_expand_import(innodb_import_table_from_xtrabackup=1)选项。

  15. (1)“导出”表
  16.   导出表是在备份的prepare阶段进行的,因此,一旦完全备份完成,就可以在prepare过程中通过--export选项将某表导出了:
  17.   /usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --apply-log --use-memory=4G --export /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
  18.   /usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --apply-log --use-memory=4G --export --incremental --incremental-dir=/data/backup/db_backup/mysql_3312/3312_2013-04-16 /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
  19.   上面是基于增量备份的,所以--export两次。多次类似。
  20. (2)“导入”表
  21.   要在mysql服务器上导入来自于其它服务器的某innodb表,需要先在当前服务器上创建一个跟原表表结构一致的表,而后才能实现将表导入:
  22.   mysql> CREATE TABLE mytable (...)  ENGINE=InnoDB;或者如果表结构没有问题的话,可以mysql> truncate table mytable;
  23.   然后将此表的表空间删除:
  24.   mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;
  25.   接下来,将来自于“导出”表的服务器的mytable表的mytable.ibd和mytable.exp文件复制到当前服务器的数据目录,更改为mysql.mysql的权限,然后使用如下命令将其“导入”:
  26.   mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;
  27. EOF
  28. }

  29. recovery_all_data(){
  30. cat << EOF
  31. 全库恢复:
  32. 1.解压包。
  33. 2./usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --apply-log /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
  34.   这里的--apply-log指明是将日志应用到数据文件上,完成之后将备份文件中的数据恢复到数据库中.
  35. 3./etc/init.d/mysql_3312 stop;cd /data/mysql_3312/;mv data data-bak;mkdir data;chown mysql.root data;
  36.   要恢复需要停掉mysql,然后把数据文件删掉,为了保险把data文件夹改名,新建data文件夹。
  37. 4./usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --copy-back /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
  38.   这里的--copy-back指明是进行数据恢复。数据恢复完成之后,需要修改相关文件的权限mysql数据库才能正常启动。
  39. 5.chown -R mysql.root /data/mysql_3312/data/;/etc/init.d/mysql_3312 start
  40.   恢复完之后,需要更改数据文件为mysql的使用用户,然后启动mysql。
  41. 6.从库的话,需要查看xtrabackup_slave_info信息,看同步的MASTER_LOG_FILE和MASTER_LOG_POS。
  42.   mysql> change master to master_host='172.16.2.25',master_port=3312,master_user='repl',master_password='xxx',master_log_file='mysql-bin.000902',master_log_pos=143068038;
  43. EOF
  44. }

  45. recovery_incremental_data(){
  46. cat << EOF
  47. 增量恢复
  48. 1.解压包。
  49. 2./usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --apply-log /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
  50.   这里的--apply-log指明是将日志应用到数据文件上,完成之后将备份文件中的数据恢复到数据库中.
  51. 3./usr/bin/innobackupex --defaults-file=/data/mysql_3309/mysql_3309.cnf --apply-log --use-memory=4G --incremental --incremental-dir=/data/backup/db_backup/mysql_3312/3312_2013-04-16 /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
  52.   这里的--incremental-dir为全库备份的(或者上一次备份的)
  53. 4./etc/init.d/mysql_3312 stop;cd /data/mysql_3312/;mv data data-bak;mkdir data;chown mysql.root data;
  54.   要恢复需要停掉mysql,然后把数据文件删掉,为了保险把data文件夹改名,新建data文件夹。
  55. 5./usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --copy-back --use-memory=4G /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
  56.   这里的--copy-back指明是进行数据恢复。数据恢复完成之后,需要修改相关文件的权限mysql数据库才能正常启动。
  57. 6.chown -R mysql.root /data/mysql_3312/data/;/etc/init.d/mysql_3312 start
  58.   恢复完之后,需要更改数据文件为mysql的使用用户,然后启动mysql。
  59. 7.从库的话,需要查看xtrabackup_slave_info信息,看同步的MASTER_LOG_FILE和MASTER_LOG_POS。
  60.   mysql> change master to master_host='172.16.2.25',master_port=3312,master_user='repl',master_password='xxx',master_log_file='mysql-bin.000902',master_log_pos=143068038;
  61. EOF
  62. }

  63. usage(){
  64. cat << EOF
  65. Usage:
  66.   这是一个用来备份mysql的shell脚本,主要是用innobackupex来备份数据,用mysqldump来备份表结构,bin-log是每天备份前一天的。
  67.   备份策略是每周一个全库备份,其他天是增量备份。
  68. Options:
  69.   -h|--help
  70.     显示帮助信息。
  71.   -p|--port
  72.     设置mysql端口,默认3306.
  73.   -w|weekly
  74.     设置一周内哪一天进行全库备份。默认周一.
  75.   --recovery_single_table
  76.     显示恢复单张表方法.
  77.   --recovery_all_data
  78.     显示全备份恢复方法.
  79.   --recovery_incremental_data
  80.     显示增量备份恢复方法.
  81.                  
  82. Example:
  83.   $0 -p 3307 -w 1
  84. EOF
  85. }

  86. while test -n "$1"; do
  87.     case "$1" in
  88.         -p|--port)
  89.             port=$2
  90.             shift
  91.             ;;
  92.         -h|--help)
  93.             echo
  94.             usage
  95.             echo
  96.             exit
  97.             ;;
  98.         -w|weekly)
  99.             weekly=$2
  100.             shift
  101.             ;;
  102.         --recovery_single_table)
  103.             echo
  104.             recovery_single_table
  105.             echo
  106.             exit
  107.             ;;
  108.         --recovery_all_data)
  109.             echo
  110.             recovery_all_data
  111.             echo
  112.             exit
  113.             ;;
  114.         --recovery_incremental_data)
  115.             echo
  116.             recovery_incremental_data
  117.             echo
  118.             exit
  119.             ;;
  120.         *)
  121.             echo "Unknown argument: $1"
  122.             usage
  123.             echo
  124.             exit
  125.             ;;
  126.     esac
  127.     shift
  128. done

  129. #setting
  130. #设置数据库名,数据库登录,备份路径,日志路径,数据文件位置,以及备份方式
  131. #默认情况下,用sock登录mysql数据库,备份至/data/backup/db_backup/
  132. BackupPath=/data/backup/db_backup/mysql_$port/
  133. LogFile=/var/log/innobackupex_mysql_$port.log
  134. DBdataPath=/data/mysql_$port/data/
  135. innobackupex=/usr/bin/innobackupex
  136. allbackup="$BackupPath""$port"_$(date +%Y-%m-%d)_full
  137. frmbackup="$BackupPath"frm
  138. next=$(expr $weekly + 1)
  139. #Setting End

  140. echo "---------------------------------------------------------------------" >> $LogFile
  141. echo " $(date +"%y-%m-%d %H:%M:%S") Start " >> $LogFile
  142. echo "---------------------------------------------------------------------" >> $LogFile

  143. #check folder
  144. if ! [ -d $BackupPath ];then
  145.         /bin/mkdir -p $BackupPath
  146. fi

  147. if ! [ -d $frmbackup ];then
  148.         /bin/mkdir -p $frmbackup
  149. fi

  150. if ! [ -d $BackupPath/mysql-bin ];then
  151.         /bin/mkdir -p $BackupPath/mysql-bin
  152. fi

  153. #Backup $port All Database
  154. if [ -f "$BackupPath""$port"_$(date +%Y-%m-%d).tar.gz ] || [ -f "$BackupPath""$port"_$(date +%Y-%m-%d)_full.tar.gz ];then
  155.         echo "["$BackupPath""$port"_$(date +%Y-%m-%d).tar.gz] || ["$BackupPath""$port"_$(date +%Y-%m-%d)_full.tar.gz]The Backup File is exists,Can't Backup!" >> $LogFile
  156. else
  157.         #full backup
  158.         if [ $(date +%u) == $weekly ];then
  159.                     $innobackupex --defaults-file=/data/mysql_$port/mysql_$port.cnf --sock=/data/mysql_$port/mysql.sock --slave-info --no-timestamp $allbackup  >> /dev/null 2>&1
  160.                     cd $BackupPath;tar zcf "$port"_$(date +%Y-%m-%d)_full.tar.gz "$port"_$(date +%Y-%m-%d)_full >> /dev/null 2>&1
  161.                 echo "["$BackupPath""$port"_$(date +%Y-%m-%d)_full.tar.gz]Backup Success!" >> $LogFile
  162.                 if [ -d "$port"_$(date +%Y-%m-%d --date='1 days ago') ];then
  163.                         rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')
  164.                         echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full]Delete Success!" >> $LogFile
  165.                 else
  166.                         echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full] is not exist" >> $LogFile
  167.                 fi
  168.         #incremental backup
  169.         elif [ $(date +%u) == $next ];then
  170.                 $innobackupex --defaults-file=/data/mysql_$port/mysql_$port.cnf --sock=/data/mysql_$port/mysql.sock --slave-info --no-timestamp --incremental --incremental-basedir="$BackupPath""$port"_$(date +%Y-%m-%d --date='1 days ago')_full "$BackupPath""$port"_$(date +%Y-%m-%d) >> /dev/null 2>&1
  171.                 cd $BackupPath;tar zcf "$port"_$(date +%Y-%m-%d).tar.gz "$port"_$(date +%Y-%m-%d) >> /dev/null 2>&1
  172.                 echo "["$BackupPath""$port"_$(date +%Y-%m-%d).tar.gz]Backup Success!" >> $LogFile
  173.                 if [ -d "$port"_$(date +%Y-%m-%d --date='1 days ago')_full ];then
  174.                         /bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full
  175.                         echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full]Delete Success!" >> $LogFile
  176.                 else
  177.                         echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full] is not exist" >> $LogFile
  178.                 fi
  179.         else
  180.                 $innobackupex --defaults-file=/data/mysql_$port/mysql_$port.cnf --sock=/data/mysql_$port/mysql.sock --slave-info --no-timestamp --incremental --incremental-basedir="$BackupPath""$port"_$(date +%Y-%m-%d --date='1 days ago') "$BackupPath""$port"_$(date +%Y-%m-%d) >> /dev/null 2>&1
  181.                 cd $BackupPath;tar zcf "$port"_$(date +%Y-%m-%d).tar.gz "$port"_$(date +%Y-%m-%d) >> /dev/null 2>&1
  182.                 echo "["$BackupPath""$port"_$(date +%Y-%m-%d).tar.gz]Backup Success!" >> $LogFile
  183.                 if [ -d "$port"_$(date +%Y-%m-%d --date='1 days ago') ];then
  184.                         /bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')
  185.                         echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')]Delete Success!" >> $LogFile
  186.                 else
  187.                         echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')] is not exist" >> $LogFile
  188.                 fi
  189.         fi
  190. fi
  191. ## backup database mysql ##########
  192. #if [ -f "$BackupPath"mysql_$(date +%Y-%m-%d).tar.gz ];then
  193. #          echo "["$BackupPath"mysql_$(date +%Y-%m-%d).tar.gz]The Backup File is exists,Can't Backup!" >> $LogFile
  194. #else
  195. #    /usr/bin/mysqlhotcopy --sock=/data/mysql_$port/mysql.sock mysql $mysqlbackup >> /dev/null 2>&1
  196. #    tar -czf $mysqlbackup.tar.gz $mysqlbackup >> /dev/null 2>&1
  197. #    /bin/rm -rf $mysqlbackup
  198. #    echo "["$BackupPath"mysql_$(date +%Y-%m-%d).tar.gz]Backup Success!" >> $LogFile
  199. #fi

  200. ## backup database .frm ##########
  201. if [ -f "$frmbackup"/"$port"_$(date +%Y-%m-%d).sql ];then
  202.     echo "["$frmbackup"/"$port"_$(date +%Y-%m-%d).sql]The Backup File is exists,Can't Backup!" >> $LogFile
  203. else
  204.     mysqldump --opt -d -A -S /data/mysql_$port/mysql.sock > "$frmbackup"/"$port"_$(date +%Y-%m-%d).sql
  205.     echo "["$frmbackup"/"$port"_$(date +%Y-%m-%d).sql]Backup Success!" >> $LogFile
  206. fi

  207. ## backup mysql-bin ##############
  208. for binlog in $(find /data/mysql_$port/data/ -name "mysql-bin*"  -mtime 1);do
  209.         /bin/cp $binlog "$BackupPath"mysql-bin/
  210.         echo "[$binlog]Backup Success! " >> $LogFile
  211. done
  212. /usr/bin/mysql -S /data/mysql_$port/mysql.sock -e 'flush logs;'

  213. echo "-----------------------------------------------------------------------" >> $LogFile
  214. echo " $(date +"%y-%m-%d %H:%M:%S") Finish " >> $LogFile
  215. echo "-----------------------------------------------------------------------" >> $LogFile
复制代码
个人博客

评分

参与人数 1信誉积分 +2 收起 理由
ruochen + 2 赞一个!

查看全部评分

论坛徽章:
8
综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-09-14 06:20:00金牛座
日期:2014-10-10 11:23:34CU十二周年纪念徽章
日期:2013-10-24 15:41:34酉鸡
日期:2013-10-19 10:17:1315-16赛季CBA联赛之北京
日期:2017-03-06 15:12:44
2 [报告]
发表于 2013-04-17 11:18 |只看该作者
不错,谢谢分享

论坛徽章:
0
3 [报告]
发表于 2013-04-17 13:08 |只看该作者
谢谢分享  

但是代码太复杂 导致我不敢用

论坛徽章:
0
4 [报告]
发表于 2013-04-17 16:21 |只看该作者
回复 3# rucypli
其实不复杂的,里面的help信息是很多的,方便备份之后的恢复用的,我们公司就一直在用。


   

论坛徽章:
8
CU大牛徽章
日期:2013-09-18 15:20:48CU大牛徽章
日期:2013-09-18 15:20:58CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:17天秤座
日期:2013-10-30 14:01:03摩羯座
日期:2013-11-29 18:02:31luobin
日期:2016-06-17 17:46:36
5 [报告]
发表于 2013-04-17 17:38 |只看该作者
@zhhmj
功能很强大。
不过我个人意见,在生产环境,单表恢复,最好还是手工操作。因为这种需求很少,而且操作的安全性和可控性要求很高。脚本的验证性真不太好。

论坛徽章:
0
6 [报告]
发表于 2013-04-17 18:05 |只看该作者
回复 5# chinafenghao
其实在生产环境下,单表恢复其实还是很有需求的,比如某个表的数据有问题就要回滚到一天前,这个就有必要了,之前的全库恢复是无法做到的,我们也不能因为恢复一个表而进行全库恢复。
对于这个单表进行恢复是没有问题的,这个在我们的生产环境上已经测试过了,不过这个单表恢复只是针对的innodb引擎的表。这个可以放心。


   

论坛徽章:
8
CU大牛徽章
日期:2013-09-18 15:20:48CU大牛徽章
日期:2013-09-18 15:20:58CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:17天秤座
日期:2013-10-30 14:01:03摩羯座
日期:2013-11-29 18:02:31luobin
日期:2016-06-17 17:46:36
7 [报告]
发表于 2013-04-18 09:25 |只看该作者
@zhhmj

单表恢复你们就直接干掉恢复啊?我们这里就算恢复也是逻辑恢复,把之前一天的记录导入到临时表,然后和现在的表关联更新,只是更新要还原的行。

论坛徽章:
0
8 [报告]
发表于 2013-04-18 09:43 |只看该作者
回复 7# chinafenghao
那你们是如何把单个表恢复到几天前的,虽然这种恢复的几率不是很大。其实我这方面也是菜鸟。


   

论坛徽章:
8
CU大牛徽章
日期:2013-09-18 15:20:48CU大牛徽章
日期:2013-09-18 15:20:58CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:17天秤座
日期:2013-10-30 14:01:03摩羯座
日期:2013-11-29 18:02:31luobin
日期:2016-06-17 17:46:36
9 [报告]
发表于 2013-04-18 09:54 |只看该作者
本帖最后由 chinafenghao 于 2013-04-18 09:54 编辑

@zhhmj
线上业务不能断档,也就是说不可能完全恢复到几天前,这几天的数据不要了。就算这几天数据有问题,都会想办法逻辑修复。

论坛徽章:
0
10 [报告]
发表于 2013-04-18 11:12 |只看该作者
回复 9# chinafenghao
恩,是这样的,谢谢指点!


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP