数据备份其重要性无需多言,再细想一步,我们至少需要两种备份:一种逻辑备份(mysqldump生成sql文件);一种物理备份(xtrabackup可很好完成)。逻辑备份在出问题时能提供更细粒度的恢复和对比;物理备份在整库范围的数据恢复或者增加从库方面有着更高的效率。
首先看下逻辑备份脚本,比较简单
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<code>#!/bin/sh</code>
<code>###每天运行一次</code>
<code>###定义用户 密码 备份目录等信息</code>
<code>user=mysqldump</code>
<code>psd=mysqldump</code>
<code>backup_base=</code><code>/data/mysql_backup</code>
<code>date</code><code>=`</code><code>date</code> <code>+%Y%m%d`</code>
<code>old_date=`</code><code>date</code> <code>+%Y%m%d -d -30days` </code><code>###保存的天数</code>
<code>###获取库名,排除不需要备份的库</code>
<code>for</code> <code>db </code><code>in</code> <code>`mysql -u$user -p$psd -s -N -e </code><code>"show databases"</code><code>|</code><code>grep</code> <code>-</code><code>v</code> <code>-E </code><code>"(test|percona|information_schema|performance_schema)"</code><code>`</code>
<code>do</code>
<code> </code><code>###创建备份目录</code>
<code> </code><code>if</code> <code>[ ! -d $backup_base/$db ];</code><code>then</code>
<code> </code><code>mkdir</code> <code>$backup_base/$db</code>
<code> </code><code>fi</code>
<code> </code>
<code> </code><code>cd</code> <code>$backup_base/$db</code>
<code> </code><code>chattr -i ./* </code>
<code> </code><code>rm</code> <code>-f $old_date.sql* &></code><code>/dev/null</code> <code>#删除30天以前的</code>
<code> </code><code>mysqldump -u$user -p$psd --events --routines $db |</code><code>gzip</code> <code>> $</code><code>date</code><code>.sql.gz </code><code>###备份&压缩</code>
<code> </code><code>chattr +i ./* </code><code>###这里加了个防误删的属性</code>
<code>done</code>
接下来看基于xtrabackup的物理(整库)备份脚本。相比上面的脚本,这个就有意思点儿了(在生成备份的时候遵循了一个规则,然后在恢复脚本里加逻辑判断实现任意时候都能一键恢复)
整套功能需要 三个脚本 innobackupex_all.sh、innobackupex_increment.sh、innobackupex_restore.sh
我们知道xtrabackup可以第一次备份全量数据,之后设置增量备份。Linux crontab以数字0-6表示"周日"-"周六"。所以,我以一周为周期:周日进行全备,存放于0目录;周一至周六增备,存放于1-6目录;下次周日清空目录重新全备。
上面以0-6这样的目录名存放备份数据,是为了让恢复脚本innobackupex_restore.sh处理起来更方便。无论在周几执行恢复脚本,都能正确的执行xtrabackup的恢复过程。
依percona官方文档。xtrabackup备份至少需要以下权限:GRANT RELOAD, SUPER, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE ON *.* TO 'xtrabackup'@'localhost' identified by xxxx
计划任务设置如下
<a href="http://s3.51cto.com/wyfs02/M02/74/9C/wKiom1YjllLjfwWHAABUb2Zxa3Q422.jpg" target="_blank"></a>
全备脚本 innobackupex_all.sh
<code>###每周日凌晨4点,执行全量备份</code>
<code>base_dir=</code><code>/ljk/data</code>
<code>rm</code> <code>-rf $base_dir/* 2>> $base_dir</code><code>/all</code><code>.log </code><code>###清空base_dir,执行全备</code>
<code>###备份并将日志记录于base_dir下的all.log</code>
<code>/usr/bin/innobackupex</code> <code>--user=xtrabackup --password=xtrabackup $base_dir 2>> $base_dir</code><code>/all</code><code>.log</code>
<code>cd</code> <code>$base_dir</code>
<code>#将以'当前时间命名的全备目录'重命名为'0'</code>
<code>mv</code> <code>20* 0 2>> $base_dir</code><code>/all</code><code>.log</code>
增备脚本innobackupex_increment.sh
<code>###周1--周6凌晨4点 增量备份</code>
<code>today=`</code><code>date</code> <code>+%u`</code>
<code>yesterday=`</code><code>expr</code> <code>$today - 1`</code>
<code>echo</code> <code>-e </code><code>"\n===================================\n"</code> <code>>> $base_dir</code><code>/increment</code><code>.log </code><code>###增备日志记录于$base_dir/increment.log</code>
<code>/usr/bin/innobackupex</code> <code>--user=xtrabackup --password=xtrabackup --incremental $base_dir --incremental-basedir=$base_dir/$yesterday 2>> $base_dir</code><code>/increment</code><code>.log</code>
<code>#重命名备份文件,以0 1 2 3 4 5 6 代表周日到 周六</code>
<code>mv</code> <code>20* $today 2>> $base_dir</code><code>/increment</code><code>.log</code>
恢复脚本innobackupex_restore.sh
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<code>###检查上次命令执行是否成功的函数</code>
<code>function</code> <code>check {</code>
<code> </code><code>if</code> <code>[ $? -</code><code>ne</code> <code>0 ];</code><code>then</code>
<code> </code><code>echo</code> <code>-e </code><code>"\e[1;31m\n $1 exec failed,please check it !\e[0m \n"</code>
<code> </code><code>echo</code> <code>"$1 failed,please check it !"</code>
<code> </code><code>sleep</code> <code>1</code>
<code> </code><code>exit</code> <code>-1</code>
<code> </code><code>fi</code>
<code>}</code>
<code>backup_dir=`</code><code>ls</code> <code>-l $base_dir|</code><code>grep</code> <code>-e </code><code>"^d.*"</code><code>|</code><code>awk</code> <code>'{print $NF}'</code><code>`</code>
<code>echo</code> <code>-e </code><code>"the backup dir is: $backup_dir \n"</code>
<code>sleep</code> <code>1</code>
<code>###开始恢复</code>
<code>echo</code> <code>-e </code><code>"------ 准备阶段 0 ------\n"</code>
<code>/usr/bin/innobackupex</code> <code>--apply-log --redo-only $base_dir</code><code>/0</code>
<code>check </code><code>"准备阶段 0"</code><code>;</code>
<code>###执行除去 0 和 最后一个目录 之外的其他目录的恢复准备</code>
<code>dir_num=`</code><code>ls</code> <code>-l $base_dir|</code><code>grep</code> <code>-e </code><code>"^d.*"</code><code>|</code><code>wc</code> <code>-l` </code><code>#取出有几个备份目录</code>
<code>for</code> <code>i </code><code>in</code> <code>`</code><code>seq</code> <code>1 $(($dir_num - 2))`</code>
<code> </code><code>do</code>
<code> </code><code>echo</code> <code>-e </code><code>"------ 准备阶段 $i ------ \n"</code>
<code> </code><code>sleep</code> <code>1</code>
<code> </code><code>/usr/bin/innobackupex</code> <code>--apply-log --redo-only $base_dir</code><code>/0</code> <code>--incremental-</code><code>dir</code><code>=$base_dir/$i</code>
<code> </code><code>check </code><code>"准备阶段 $i"</code><code>;</code>
<code>###最后一个增量备份</code>
<code>echo</code> <code>-e </code><code>"------ 准备阶段 $(($dir_num - 1)) ------ \n"</code>
<code>/usr/bin/innobackupex</code> <code>--apply-log $base_dir</code><code>/0</code> <code>--incremental-</code><code>dir</code><code>=$base_dir/$(($dir_num - 1))</code>
<code>check </code><code>"准备阶段 $(($dir_num - 1))"</code><code>;</code>
<code>###以上步骤将所有增量备份中记录的变化应用到了最初的全量备份中</code>
<code>echo</code> <code>-e </code><code>"------ 应用所有变化到$base_dir/0 ------\n"</code>
<code>/usr/bin/innobackupex</code> <code>--apply-log $base_dir</code><code>/0</code>
<code>check </code><code>"应用所有变化到$base_dir/0"</code><code>;</code>
<code>###将数据考回数据目录</code>
<code>echo</code> <code>-e </code><code>"------ 将处理好的数据考回至数据目录 ------\n"</code>
<code>/usr/bin/innobackupex</code> <code>--copy-back $base_dir</code><code>/0</code>
<code>check </code><code>"copy-back"</code><code>;</code>
物理备份目录结构截图
本文转自kai404 51CTO博客,原文链接:http://blog.51cto.com/kaifly/1704105,如需转载请自行联系原作者