Linux定時壓縮備份Mysql數據庫並自動刪除之前備份數據

項目中數據庫很重要,偶爾也會發生一些突發狀況造成數據庫癱瘓甚至奔潰的情況。爲了能及時恢復減少損失,數據的備份就顯得很重要了。由於數據庫資源在各個時間段使用情況不同,爲了不影響業務的正常運行的同時,所以儘量選在數據庫相對較閒的時候進行自動備份。日積月累,備份就多了,所以還要能自動刪除時間比較長的備份。下面進入正題。

1、創建備份目錄

[root@ZhOu usr]# mkdir databak

2、進入備份目錄,新建腳本dataBackUp.sh

[root@ZhOu usr]# cd databak
[root@ZhOu databak]# pwd
/usr/databak
[root@ZhOu databak]# vi dataBackUp.sh

加入以下代碼:

#!/bin/bash

dir=/usr/databak    --目標路徑

now_date=$(date +%Y%m%d%H%M)   --當前日期,年月日時分。注意:date和+之間要有空格

--獲取10天前的日期,也可以使用date -d '10 days ago' +%Y%m%d。注意:-10和-day中間不能有空格。
last_date=$(date -d -10-day +%Y%m%dH%M)  

mysqldump -uroot -proot  ad_sq | gzip > $dir/ad_sq_$now_date.sql.gz   --備份並壓縮文件

rm -f $dir/ad_sq_$last_date.sql.gz   --刪除舊文件

有一點需要注意,有些直接使用mysqldump時提示找不到命令,是因爲沒有配置環境變量的原因。需要在etc/profile中添加mysql的環境變量,在上一篇博文Mysql5.7.15安裝配置中介紹過,不再贅述。或者把mysqldump的完整路徑加上也可以解決。

3、給腳本賦權:

[root@ZhOu databak]# chmod +x dataBackUp.sh
[root@ZhOu databak]# ll
total 4
-rwxr-xr-x 1 root root 213 Sep 11 20:57 dataBackUp.sh

4、先執行腳本測試一下:

[root@ZhOu databak]# ./dataBackUp.sh 
mysqldump: [Warning] Using a password on the command line interface can be insecure.

提示mysqldump: [Warning] Using a password on the command line interface can be insecure.
這是因爲直接把密碼暴露出來了,系統發出的警告。所以dump的時候,應該寫mysqldump -uroot -p ad_sq | gzip > ad_sq.sql.gz,然後會提示輸入密碼:

[root@ZhOu databak]# mysqldump -uroot -p ad_sq | gzip > ad_sq.sql.gz
Enter password: 

但是由於我們是在腳本中寫的,自然不能這樣做了,所以要加到mysql的配置文件my.cnf中去。

[root@ZhOu databak]# vi /etc/my.cnf 

然後加入下面代碼,這樣以後再使用mysqldump的時候,就不需要再寫用戶名和密碼了。其他命令也是同樣的道理。

[mysqldump]
 user=root
 password=root

這裏寫圖片描述

腳本中就可以改爲:

#!/bin/bash

dir=/usr/databak
now_date=$(date +%Y%m%d%H%M)
last_date=$(date -d -20-day +%Y%m%d%H%M)

mysqldump  ad_sq | gzip > $dir/ad_sq_$now_date.sql.gz

rm -f $dir/ad_sq_$last_date.sql.gz

執行一下,結果如下:
這裏寫圖片描述

5、添加腳本到定時任務中去:

[root@ZhOu databak]# crontab -e

*/1 * * * * /usr/databak/dataBackUp.sh --確保實驗,先每分鐘執行一次

6、滿以爲大功告成,結果卻出了意外,如下圖:
這裏寫圖片描述
從圖中可以看出,第一個是手工執行腳本後的結果,大小大約6M。後面幾個任務自動執行的,大小隻有20bytes!明顯沒有導出數據!

7、分析原因,思路:
1)試了下把腳本中的mysqldump ad_sq | gzip > $dir/ad_sq_$now_date.sql.gz換成 /usr/mylocal/mysql/bin/mysqldump ad_sq | gzip > $dir/ad_sq_$now_date.sql.gz,也就是mysqldump的完整路徑,crontab和手工執行結果都是成功的,這樣寫沒問題;
2)如果是mysqldump ad_sq | gzip > $dir/ad_sq_$now_date.sql.gz這樣的,手工執行時可以的,自動執行卻是失敗的。不甘心,上網找原因,原來是環境變量的鍋!手動執行某個任務時,是在當前shell環境下進行的,程序當然能找到環境變量,而系統自動執行任務調度時,是不會加載任何環境變量的。因此,就需要在crontab文件中指定任務運行所需的所有環境變量,這樣系統執行任務調度時就沒有問題了。

#!/bin/bash

source /etc/profile  --這裏很重要

dir=/usr/databak
now_date=$(date +%Y%m%d%H%M)
last_date=$(date -d -20-day +%Y%m%d%H%M)

mysqldump  ad_sq | gzip > $dir/ad_sq_$now_date.sql.gz

rm -f $dir/ad_sq_$last_date.sql.gz

7、修改好之後,再次等待結果,搞定!
這裏寫圖片描述

8、根據數據庫情況,修改定時任務規則。

總結:
mysqldump有很多種導出條件設置,實際中可以根據需要導出需要的表或者滿足條件的數據,這裏做的是整個數據庫備份。關於壓縮的數據,可以gunzip解壓。實驗達到了預期的效果,雖然中間不是很順利,但是錯誤中學到了更多的東西,之所以拿出來分享一下,是希望大家引以爲戒。不足之處,希望大家指出。

http://www.xuebuyuan.com/1122682.html
http://www.jb51.net/LINUXjishu/151805.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章