shell腳本定時備份docker部署的MySQL數據庫

之前由於服務器一直被攻擊,數據庫總是中勒索病毒,在前篇文章中,說了一些提高安全性的辦法,但是我認爲還是有些不靠譜。也結合之前研究定時備份的腳本,今天來寫一篇關於定時備份數據的文章。

一、腳本

我的MySQL是使用docker部署的,所以備份的命令是要通過docker進入容器,再執行備份命令。

#!/bin/bash
# 設置mysql的登錄用戶名和密碼(根據實際情況填寫)
mysql_user="root"
mysql_password="root"
mysql_host="localhost"
mysql_port="3306"
mysql_charset="utf8mb4"
 
# 備份文件存放地址(根據實際情況填寫)
backup_location=/usr/local
 
# 是否刪除過期數據
expire_backup_delete="ON"
expire_days=7
backup_time=`date +%Y%m%d%H%M`
backup_dir=$backup_location
welcome_msg="Welcome to use MySQL backup tools!"
# 備份指定數據庫中數據(此處假設數據庫是mysql_backup_test)
 docker exec -it mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B test1 > $backup_dir/mysql_backup_test-$backup_time.sql
 
# 刪除過期數據
if [ "$expire_backup_delete" == "ON" -a  "$backup_location" != "" ];then
        `find $backup_location/ -type f -mtime +$expire_days | xargs rm -rf`
        echo "Expired backup data delete complete!"
fi

說明:
上邊主要都是對變量的定義,已經有詳細說明了,我這裏主要是對備份的命令進行解釋

docker exec -it mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B test1 > $backup_dir/mysql_backup_test-$backup_time.sql

撇開這些,我們進入容器,來測試一下備份的命令,先對命令拆解分析

# docker進入容器的命令
docker exec -it 容器名
# 備份數據庫的命令
mysqldump -uroot -p123456 -B 數據庫名 > /usr/111.sql

連起來就是(這是我這邊的命令,你本人根據自己實際情況進行修改)

docker exec -it mysql01 mysqldump -uroot -p123456 -B cj > $backup_dir/cj-$backup_time.sql

二、定時任務

# 啓動定時任務
crontab -e

# 將定時任務寫入其中 分 時 日 月 年
* * * * * /bin/bash /usr/data/backup/backupdb.sh

# 查看定時任務列表
crontab -l

2020年7月6日19:43:44二次補充

今天早上起來進入服務器查看昨晚寫的定時備份腳本有沒有執行成功,進入備份目錄,發現生成了文件,然後cat查看發現沒有任何輸出,就很奇怪,明明昨天手動執行成功了,可是放進crontab裏定時執行就出了問題,爲什麼?

帶着這個問題我百度了好久好久好久好久,網上普遍說的是兩種情況,一、mysqldump命令的路徑沒有給全,二、環境變量沒有添加;

結合這兩個方向,我進行了所有解決方案的嘗試,全部以失敗告終;

失敗一,補全mysqldump命令的路徑
如果你是直接裝在服務器上的MySQL也許這對你而言不會很複雜,網上絕大多數的解決方案也是基於此,但是我的MySQL是docker裝的,所以我需要進入容器來找他的mysqldump的位置。然後補全

docker exec -it mysql01 /usr/bin/mysqldump -uroot -p123456 -B cj > $backup_dir/cj-$backup_time.sql

其中,/usr/bin 就是容器裏mysqldump文件的路徑
結果:失敗

失敗二,添加環境變量
way1:在腳本里添加

source /etc/profile
這裏被我註釋了
在這裏插入圖片描述

結果:失敗

way2:在執行任務的腳本里添加

crontab -e

*/1 0 * * * source profile;/home/backup/mysql_backup_test_backup.sh 2>&1

結果:失敗

然後又林林總總找了很多辦法,但是出發點和方向都是這兩個,而且也一直沒有成功,看網上信誓旦旦說的一定成功,評論也有成功的,可是我就成功不了,搞得我很懷疑人生;最後我開始懷疑這個命令是不是有問題?雖然手動執行是正常的,也許因爲什麼原因,自動執行就出現問題了,於是我開始百度“crontab執行docker”,不得不說,百度對方向真的很重要,劃重點。一百度就找到問題了

在這裏插入圖片描述
跟加了 -it參數有關係

Your docker exec command says it needs “pseudo terminal and runs in interactive mode” (-it flags) while cron doesn’t attach to any TTYs.
大致意思 exec 加了 -it 參數就開啓了一個終端,計劃任務是無法進入任何終端的。

把 docker exec 的參數 -it 去掉後問題解決了。

看了這個我才知道原來是這個原因,然後再想想之前他們的帖子,貌似也確實沒有 -it的參數,然後放入定時任務執行,果然成功了,哎,真艱辛!

docker exec mysql01 mysqldump -uroot -p123456 -B cj > $backup_dir/cj-$backup_time.sql
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章