一、数据做用:python
数据对咱们来讲是很是很是的重要,若是你是管理数据员、运维人员的,数据丢失了,找不回来,也就意味着,你的职业生涯就结束了,为了不数据丢失,咱们也作了不少的维护、备份,好比作主从复制、作全备、增备等等。这个能够参考个人另外一篇文章Mysql主从复制。mysql
我这里就很少说,今天咱们要怎么写一个比较好的数据备份自动化脚本,让咱们更好的管理数据库。sql
二、mysql备份脚本思路shell
首先要有一个思路,个人要求是每一个的周一到周五作增量备份,周六作全备,对前两天的增备的日志删除,对两个星期前的全备也进行删除数据库
整个过程都是涉及shell命令,因此果断的抛弃了python,使用shell脚本,数据库作全备须要应用mysqldump命令,这里命令mysql自带有,若是你的备份数据大于10G的话,请你使用xtrackbackup来作全备。增量的命令比较简单,只要刷新一下日志就好。bash
三、备份脚本编写运维
#!/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
四、天天生成的日志会累积,咱们须要把不要的删除掉,继续完善。ide
#!/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
五、总结
函数
一个mysql备份脚本就完成了,算不上难,可是,在写任何脚本的时候,你须要先理清思路最重要,先把大概的轮廓写出了的,再慢慢补充,相信会越写越好。spa