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備份腳本就完成了,算不上難,但是,在寫任何腳本的時候,你需要先理清思路最重要,先把大概的輪廓寫出了的,再慢慢補充,相信會越寫越好。

思路:如何快速寫一個全面的數據庫 增備+全備+刪除,自動化的腳本?