思路:如何快速寫一個全面的數據庫 增備+全備+刪除,自動化的腳本?
阿新 • • 發佈:2018-01-24
rgb 完成 -s databases blog als 思路 日誌 職業
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 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 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 3 ] ; then ###做一個for循環,如果列出了的文件大於3,然後就刪除時間最久遠的那個文件,循環後退出,進入下一次循環。連續五次 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 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 bash $0 Mysql_log " >> /etc/crontab fi } crontab_mysqladmin
5、總結
一個mysql備份腳本就完成了,算不上難,但是,在寫任何腳本的時候,你需要先理清思路最重要,先把大概的輪廓寫出了的,再慢慢補充,相信會越寫越好。
思路:如何快速寫一個全面的數據庫 增備+全備+刪除,自動化的腳本?