一、業務場景
自己現在做的項目基本上已經開發完成,正式開始上線運行,主要包含兩個子項目一個是小程序的后台,一個是后台管理系統。
正式開始運行一段時間后,基本上也沒什么BUG了,整個項目都已經能夠正常的跑起來,程序也能夠正常運轉。這時候相對來說
系統也比較穩定。這時候自己就在考慮如何來備份數據庫數據,做好備份工作是運維工作的必備技能之一,為的就是防止服務器
被黑客進行惡意攻擊后,服務器上的所有數據都無法恢復的問題。
二、需求分析
由於自己之前做的工作主要是在內網進行開發,即使有的項目在公網可以正常訪問,生產服務器這一塊自己也基本接觸不到。
這導致的問題就是對於真實的服務器一些操作,自己只會一些基本的操作,比如常規的軟件安裝,開端口,部署項目等等。對於
數據庫備份這一塊自己懂得不多,對於運維這一塊了解得比較少。很多東西都需要現學現賣,使用谷歌和百度來解決遇到的各種問題。
自己也私下里問過之前的同事,主要是做后端開發工作的朋友,他們有沒有好的數據庫備份腳本。他們給出的意見是他們沒有做備份
工作,對於安全這一塊也只是做一些常規的操作,比如禁止root用戶遠程登錄,使用非root用戶登錄后再切換為root用戶進行項目部署。
所以需要自己去學習如何備份數據庫數據,去學習如何寫腳本,復制、粘貼也行。
三、解決方案
經過自己的尋找,找到一個比較實用的腳本,是一個已經寫好的腳本,修改里面的一些參數即可。自己使用這個腳本,修改好參數后
立馬進行測試,發現竟然可行。之后就使用這個腳本來進行修改,按照項目的實際需求來不斷底改進腳本。反反復復底修改多次后
自己已經將改好的腳本直接上傳到服務器上,也在linux系統上設置了定時任務來執行這個腳本。主要的操作為在星期一、三、五、日
的凌晨4點執行該腳本,腳本已經添加了可執行權限,之后使用郵件將數據發送到一個指定的郵箱。

設置的執行時間如下:

過了幾天后,自己來查看執行結果。發現程序正常運行,可是自己去查看接收到的具體郵件時,發現里面收到的內容並不是自己想要的。

linux下的定時任務已經正常執行,郵件也已經正常發送,可是里面並沒有自己需要的數據,說明數據庫備份失敗,不然怎么可能只有1kb
內存的大小。之后自己去排查問題,找了很久終於找到問題,導致這個問題的原因是在windows上寫的腳本文件不能直接上傳到linux服務器上
使用,因為windows和linux的字符編碼不一樣。解決辦法之一是可以將在windows上寫好的腳本文件內容復制、粘貼一份,然后在linux系統上
使用vim命令編輯腳本文件,將內容粘貼進行即可。自己做好之后,立馬進行手動執行進行測試,發現這種方式可行。到此,在linux下自動備份
mysql數據庫,然后將備份后的文件壓縮打包發送到指定的郵件這個功能全部完成。
2022-01-07-后續問題
使用手動執行備份腳本沒有問題,下面第一份數據是使用自動定時任務執行腳本的結果,大小就1kb,沒有正常備份數據庫數據。第二份數據是使用
手動執行的腳本,能夠正常備份數據。

經過自己的仔細排查,發現那個數據庫的備份腳本不是屬於root用戶的,推想可能只有root用戶才能夠執行改腳本,於是做如下嘗試。
測試一:使用非root用戶登錄服務器之后,在使用 su root 命令切換到root用戶,創建一個新目錄,在創建新的數據庫備份腳本,設置定時任務執行。


測試結果為還是不能正常備份。

測試二:使用不同的目錄來執行腳本,看是不是因為不同的目錄所屬的用戶不同,導致所擁有的執行權限不一致導致的問題。

測試結果為問題未解決,任然不能正常備份。
測試三:查看網友給出的建議,說可能是非root用戶由於沒有定時任務的權限,如下圖所示

測試結果為仍然沒有解決這個問題。
測試四:推測是否是由於非root用戶不能直接執行備份數據庫的命令。然后進行測試直接使用非root用戶執行數據庫備份腳本
測試結果能夠正常備份。

說明非root用戶已經可以正常執行備份數據庫的命令,這並不是用戶身份和用戶權限的問題。
測試五:推測備份數據庫數據時,是否存在沒有添加當前數據庫的主機地址導致不能正常備份。

按照上面的定時任務執行,測試結果為沒有解決問題。
測試六:搜索關鍵詞 linux下執行mysqldump后的文件大小為0kb 去查看相關的搜索結果。
網友給出的意見是在執行 mysqldump 命令的時候,需要加上全路徑,參考博客如下
https://blog.csdn.net/u010615629/article/details/76146878
在查找 mysqldump 命令所在的目錄,參考博文如下,
https://www.cnblogs.com/han019924/p/10445582.html
find / -name mysqldump -print
最終修改后的命令如下:
#! /bin/bash
export LANG=en_US.UTF-8
#注意:下面這幾個變量需修改為你自己的
BackDir=/xxx/xxx
LogFile=/xxx/xxx/bak.log
DataBase=xxx
DataBaseUser=xxx
DataBasePWD=xxx
if [ ! -d "$BackDir" ];then
mkdir $BackDir
fi
if [ ! -f "$LogFile" ]; then
touch "$LogFile"
fi
#刪除當前目錄下以 .tgz 為后綴的文件
rm -rf *.tgz
Date=`date +%Y%m%d_%H%M%S`
Begin=`date +%Y%m%d_%H:%M:%S`
#到備份目錄下
cd $BackDir
#設置導出腳本名稱
DumpFile=$DataBase_$Date.sql
#設置壓縮包名稱
DumpFileZip=$DataBase_$Date.sql.tgz
#導出數據庫數據
/opt/u01/software/mysql_5_7_20/bin/mysqldump -hlocalhost --add-drop-table -u$DataBaseUser -p$DataBasePWD $DataBase > $DumpFile
#壓縮sql腳本
tar -czvf $DumpFileZip $DumpFile
#刪除sql腳本
rm $DumpFile
Last=`date +"%Y%m%d_%H:%M:%S"`
echo start:$Begin end:$Last $DumpFileZip succ >> $LogFile
最終測試結果,問題解決。

參考
