linux下備份mysql數據


一、業務場景

  自己現在做的項目基本上已經開發完成,正式開始上線運行,主要包含兩個子項目一個是小程序的后台,一個是后台管理系統。

正式開始運行一段時間后,基本上也沒什么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

 

最終測試結果,問題解決。

 

 

 

 參考

https://blog.csdn.net/qq_34776233/article/details/90409000


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM