CentOS定時備份mysql數據庫和清理過時備份文件

  本篇主要用於介紹如何在linux服務器下編寫備份mysql數據庫文件和清理過時備份文件的腳本,以及設置定時任務啓動腳本,作到天天定時備份數據庫和清理過時備份文件的需求,同時也是一個踩坑記錄,本覺得網上會有不少相關的博客能夠一會兒就弄好,沒想到花了半天時間,踩了很多坑,有些博客沒有寫清楚,只是簡單地貼了一下命令,應該注意的地方也沒有提示,因此這裏記錄下,但願能夠幫到更多人。mysql

整個流程主要分爲:linux

  1. 建立備份數據庫的文件夾;
  2. 編寫備份數據庫以及清理過時文件的腳本;
  3. 編寫定時任務,定時啓動腳本

建立備份目錄

這裏演示的備份目錄是在/root/mysql_bak,能夠根據本身想要把備份目錄放在哪一個文件夾下更改對應路徑便可:sql

mkdir /root/mysql_bak
複製代碼

編寫腳本

進入mysql_bak目錄shell

cd /root/mysql_bak
複製代碼

建立backup.sh文件數據庫

touch backup.sh
複製代碼

賦予權限,若是不給予權限的話,該腳本是沒法運行的windows

chmod 777 backup.sh
複製代碼

  vi查看backup.sh腳本,並粘貼如下代碼(有些參數須要配置成本身的),這裏要注意一下,不要經過其餘編輯器打開該文件並粘貼代碼,由於筆者踩過坑,利用xftp打開了文件編輯並保存,最後發現生成的sql文件帶?號,通過查詢才知道原來是由於windows下的換行符和Linux不同致使的,最後經過在xshell使用vi命令粘貼腳本代碼纔不會有這個問題。bash

db_user="root"
db_pwd="123456"
db_name="demo"
bak_dir="/root/mysql_bak"
time="$(date +"%Y%m%d_%H%M%S")"
mysqldump -u$db_user  -p$db_pwd -h127.0.0.1 -P3306 $db_name > $bak_dir/${db_name}_$time.sql
#remove out-date backup
find $bak_dir -name "$db_name*.sql" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1

複製代碼

代碼解釋

上述代碼中,db_user爲數據庫帳號,默認都是root,db_pwd爲數據庫密碼,db_name爲要備份的數據庫名稱,bak_dir爲備份的目錄,這裏只須要改爲本身數據庫對應的相關信息以及本身的備份目錄路徑便可,切記等號左右不能留空格服務器

  • 時間格式

這裏備份使用的格式是%Y%m%d_%H%M%S,如20181218_170130,生成的文件格式如:demo_20181218_170130.sql,若是有須要能夠改爲本身要的格式。編輯器

  • 備份數據庫的命令
mysqldump -u$db_user  -p$db_pwd -h127.0.0.1 -P3306 $db_name > $bak_dir/${db_name}_$time.sql
複製代碼

這裏添加上-h127.0.0.1 -P3306 指定主機和端口號是爲了解決出現下面的問題。測試

mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: YES) when trying to connect
複製代碼

若是你的數據庫是單獨放在另一臺數據庫服務器上,那麼這裏記得要改一下主機的ip哦。

  • 清理過時文件
find $bak_dir -name "$db_name*.sql" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1
複製代碼

用於清理7天前的文件,下面會詳細介紹,這裏先跳過。

  • 測試腳本是否運行正常
./backup.sh
複製代碼

運行後沒報錯,執行查看命令ll,看看是否生成備份文件,能夠看到生成了備份文件,說明腳本運行正常,接下來就差設置定時任務,定時啓動這個腳本了。

編輯定時任務

執行如下命令:

crontab  -e
複製代碼

按insert鍵進入編輯狀態,我如今的時間是17點20分,這裏咱們設置一下天天17點25分的定時任務,複製粘貼一下代碼:

25 17 * * * /root/mysql_bak/backup.sh
複製代碼

保存並退出,時間的設置能夠參考下面Crontab 格式,很容易理解的,第一個數字25爲分鐘,第二個數字17爲小時。

Crontab 格式

分 時 日 月 周 執行命令
第 1 列分鐘 1~59,每分鐘用 * 或者*/1表示,整點分鐘數爲00或0
第 2 列小時 1~23(0 表示 0 點)
第 3 列日 1~31
第 4 列月 1~12
第 5 列星期 0~6(0 表示星期天)
第 6 列要運行的命令
0 3 * * * /root/mysql_bak/backup.sh,此命令表示在天天的凌晨三點執行一次腳本,可自行調整時間
複製代碼

重啓crondtab服務

編寫好定時任務後,須要重啓crondtab服務,命令以下:

service crond restart
複製代碼

接下來就等時間到了後,查看備份目錄是否生成了備份文件,果真生成了demo_20181218_172501.sql文件,這裏生成的時間不是整點也好理解,由於腳本里使用的時間是腳本運行到那個地方時的時間。

查看crontab狀態

固然咱們也能夠經過查看crontab的狀態來知道backup.sh腳本是否被執行,

tail -f /var/log/cron
複製代碼

刪除過時備份文件代碼解釋

#刪除一分鐘以前的備份
find $bak_dir -name "$db_name*.sql" -type f -mmin +1 -exec rm -rf {} \; > /dev/null 2>&1

#刪除七天以前的備份
find $bak_dir -name "$db_name*.sql" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1

複製代碼
  • -type f 表示查找普通類型的文件,f 表示普通文件,可不寫;
  • -mtime +7 按照文件的更改時間來查找文件,+7表示文件更改時間距如今7天之前;若是是-mmin +7表示文件更改時間距如今7分鐘之前;
  • -exec rm {} ; 表示執行一段shell命令,exec選項後面跟隨着所要執行的命令或腳本,而後是一對{ },一個空格和一個\,最後是一個分號;
  • /dev/null 2>&1 把標準出錯重定向到標準輸出,而後扔到/DEV/NULL下面去。通俗的說,就是把全部標準輸出和標準出錯都扔到垃圾桶裏面;其中的& 表示讓該命令在後臺執行

測試刪除備份文件

能夠先改爲刪除1分鐘以前的備份測試下該命令,編輯backup.sh,將代碼

find $bak_dir -name "$db_name*.sql" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1
複製代碼

其中的mtime改爲mmin,7改爲1,而後保存退出。

執行該腳本

./backup.sh
複製代碼

而後再查看下目錄,能夠發現,1分鐘前的的sql文件被刪除了,說明刪除備份文件的命令正確,這裏刪除的時間能夠根據本身的須要更改。

  好了,到這裏文章結束,若是以爲對你有幫助的話幫忙點個贊吧,讓更多的人能夠看到,若是有什麼意見或建議,能夠在評論區裏留言。

相關文章
相關標籤/搜索