天天看点

两套mysql备份脚本

    数据备份其重要性无需多言,再细想一步,我们至少需要两种备份:一种逻辑备份(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* &amp;&gt;</code><code>/dev/null</code>     <code>#删除30天以前的</code>

<code>  </code><code>mysqldump -u$user -p$psd --events --routines  $db |</code><code>gzip</code> <code>&gt; $</code><code>date</code><code>.sql.gz    </code><code>###备份&amp;压缩</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&gt;&gt; $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&gt;&gt; $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&gt;&gt; $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>&gt;&gt; $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&gt;&gt; $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&gt;&gt; $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,如需转载请自行联系原作者