一、數據做用: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