1、数据作用:

数据对我们来说是非常非常的重要,如果你是管理数据员、运维人员的,数据丢失了,找不回来,也就意味着,你的职业生涯就结束了,为了避免数据丢失,我们也做了很多的维护、备份,比如做主从复制、做全备、增备等等。这个可以参考我的另一篇文章Mysql主从复制。

我这里就不多说,今天我们要怎么写一个比较好的数据备份自动化脚本,让我们更好的管理数据库。

2、mysql备份脚本思路

首先要有一个思路,我的要求是每个的周一到周五做增量备份,周六做全备,对前两天的增备的日志删除,对两个星期前的全备也进行删除

整个过程都是涉及shell命令,所以果断的抛弃了python,使用shell脚本,数据库做全备需要应用mysqldump命令,这里命令mysql自带有,如果你的备份数据大于10G的话,请你使用xtrackbackup来做全备。增量的命令比较简单,只要刷新一下日志就好。

3、备份脚本编写

#!/bin/bash 
Mysqldump() {   
mysqldump -uroot -p123456 --single-transaction -R --triggers -E --master-data --flush-logs --all-databases > /databack/data_all/`date +%F"-%H:%M"`.sql
}                   ###这里写个函数,把全备命名写进去
$1                  ###$1是我们执行脚本的参数,这样来实现该函数执行可变性
Mysql_log (){
mysqladmin -u root -p123456  flush-logs
}
$1                  ###增量备份,同样把命令写进去
##下面创建计划任务,只需要写到/etc/crontab,就可以了
crontab_dump () {       
  cat /etc/crontab | grep "bash $0 Mysqldump "    ##这里找一找使用有写执行全备的命令是否已经写到/etc/crontab里面。
  if [ $? -eq 0 ]; then                           ##定义一个判断语句,如果在/etc/crontab里面找到执行全备的脚本命令,就输出一句话,没有就把时间任务写入进去
     echo "The port test has been written to the time task, and 00:00 will perform the task" 
  else
     echo "0 0 * * 6  root bash $0 Mysqldump " >> /etc/crontab
  fi
     
} crontab_dump
crontab_mysqladmin () {
  cat /etc/crontab | grep "bash $0 Mysql_log "   ##这里找一找使用有写执行增备的命令是否已经写到/etc/crontab里面。
  if [ $? -eq 0 ]; then                           ##定义一个判断语句,如果在/etc/crontab里面找到执行增备的脚本命令,就输出一句话,没有就把时间任务写入进去
     echo "The port test has been written to the time task, and 00:00 will perform the task"
  else
     echo "0 0 * * 1-5  root bash $0 Mysql_log " >> /etc/crontab
  fi
     
} crontab_mysqladmin

4、每天生成的日志会累积,我们需要把不要的删除掉,继续完善。

#!/bin/bash 
Mysqldump() {
mysqldump -uroot -p123456 --single-transaction -R --triggers -E --master-data --flush-logs --all-databases > /databack/data_all/`date +%F"-%H:%M"`.sql
num1=`ls -rt  /databack/data_all  | wc -l`     ##按时间列出,你的全备的数据里面有多少个文件我这里的全备是备到/databack/data_all/目录下
file1=`ls -rt  /databack/data_all | head  -n 1`  ##使用ls命令结合head命令,找出时间最远久的文件
    for i in $num1 ; do                          ###做一个for循环,如果列出了的文件大于2,然后就删除时间最久远的那个文件
        if  [ $i -gt 2 ] ; then
        rm -rf   /databack/data_all/$file1
        fi
    done
}
$1
Mysql_log (){
mysqladmin -u root -p123456  flush-logs
for a in {1..5};do                           ###这里做一个for循环,表示循环五次,应为二制日志,比较多,检测五次,还是比较好的,你的可以自己设
num2=`ls -rt  /databack/data_logbin/ | wc -l`   ##按时间列出,你的全备的数据里面有多少个文件我这里的全备是备到/databack/data_all/目录下
file2=`ls -rt  /databack/data_logbin/ | head  -n 1`  ##使用ls命令结合head命令,找出时间最远久的文件
    for i in $num2; do
        if  [ $i -gt 5 ] ; then                   ###做一个for循环,如果列出了的文件大于5,然后就删除时间最久远的那个文件,循环后退出,进入下一次循环。连续五次
        rm -rf   /databack/data_logbin/$file2
       # else 
       #echo "log-bin was update"
        fi
    done
done
}
$1
crontab_dump () {
  cat /etc/crontab | grep "bash $0 Mysqldump "  
  if [ $? -eq 0 ]; then
     echo "The port test has been written to the time task, and 00:00 will perform the task"
  else
     echo "0 0 * * 6   root bash $0 Mysqldump " >> /etc/crontab
  fi
     
} crontab_dump
crontab_mysqladmin () {
  cat /etc/crontab | grep "bash $0 Mysql_log "  
  if [ $? -eq 0 ]; then
     echo "The port test has been written to the time task, and 00:00 will perform the task"
  else
     echo "0 0 * *  1-5 root bash $0 Mysql_log " >> /etc/crontab
  fi
     
} crontab_mysqladmin

5、总结

一个mysql备份脚本就完成了,算不上难,但是,在写任何脚本的时候,你需要先理清思路最重要,先把大概的轮廓写出了的,再慢慢补充,相信会越写越好。