五一5天小假期的結束大家休息好了嗎?上班了狀態回整的怎麼樣呢?阿裡云云發平臺給大家帶福利了呢,通過玩游戲把獎品帶回家。 雲開發平臺兩周年,0門檻部署上線4款熱門游戲,游戲暢玩還有AirPods耳機、筋膜槍等8種獎品任你挑啦!4款游戲只需要完成2個就可以抽獎呢,100%中獎;還額外有故事有獎徵集的板塊 ...
本篇為備份篇。
因為裝的東西不多,所以需要備份的只有mysql和wordpress的文件夾。
備份mysql
-
mysql備份命令
使用mysqldump命令,格式如下:
# 這是格式 mysqldump -u${username} -p${dbrootpwd} --databases ${DBname} > ${DumpFile} # 這是例子 mysqldump -uroot -proot --databases wordpress > /home/backup.sql
使用${}代表的是變數,請自行替換
username:資料庫用戶名
dbrootpwd:資料庫用戶的密碼
DBname:需要備份的資料庫
DumpFile:輸出的文件路徑+文件名
-
搭配docker使用
因為mysql使用的是docker安裝的,伺服器所在的Centos中是沒有mysql的相關命令的,執行命令需要到mysql的docker容器中。
# 這是格式 docker exec -it ${container} ${sqlCmd} # 這是例子 docker exec -it 123321 mysqldump -uroot -proot --databases wordpress > /home/backup.sql
使用${}代表的是變數,請自行替換
container:docker容器的別名或id
sqlCmd:需要執行的備份命令
-
備份腳本
此腳本是基於oneinstack修改的
邏輯是:
- mysqldump生成xxx.sql文件
- 壓縮xxx.sql為xxx.tgz
- 刪除xxx.sql和舊的壓縮文件
新建db_bk.sh文件,以下是內容:
#!/bin/bash # 引用同目錄下的options.conf文件 . ./options.conf # 傳遞參數 DBname=$1 # 日誌 LogFile=${backup_dir}/db.log # 臨時文件 DumpFile=${backup_dir}/DB_${DBname}_$(date +%Y%m%d_%H).sql # 新的壓縮文件 NewFile=${backup_dir}/DB_${DBname}_$(date +%Y%m%d_%H).tgz # 舊的壓縮文件 OldFile=${backup_dir}/DB_${DBname}_$(date +%Y%m%d --date="${expired_days} days ago")*.tgz # 備份目錄不存在則創建 [ ! -e "${backup_dir}" ] && mkdir -p ${backup_dir} # 使用mysql的show databases判斷資料庫是否存在 DB_tmp=`docker exec -it mysql mysql -uroot -p${dbrootpwd} -e "show databases\G" | grep ${DBname}` [ -z "${DB_tmp}" ] && { echo "[${DBname}] not exist" >> ${LogFile} ; exit 1 ; } # 刪除舊的壓縮文件 if [ -n "`ls ${OldFile} 2>/dev/null`" ]; then rm -f ${OldFile} echo "[${OldFile}] Delete Old File Success" >> ${LogFile} else echo "[${OldFile}] Delete Old Backup File" >> ${LogFile} fi # 判斷新的壓縮文件是否已存在 if [ -e "${NewFile}" ]; then echo "[${NewFile}] The Backup File is exists, Can't Backup" >> ${LogFile} else # 生成臨時備份文件 docker exec -it mysql mysqldump -uroot -p${dbrootpwd} --databases ${DBname} > ${DumpFile} # 進入到備份目錄 pushd ${backup_dir} > /dev/null # 壓縮臨時文件 tar czf ${NewFile} ${DumpFile##*/} >> ${LogFile} 2>&1 # 輸出日誌 echo "[${NewFile}] Backup success ">> ${LogFile} # 刪除臨時文件 rm -f ${DumpFile} # 退回之前的目錄 popd > /dev/null fi
以下是options.conf文件的部分內容
# mysql相關 backup_dir=/home/backup dbrootpwd='root' expired_days=5
-
執行腳本
# 這是格式 ./db_bk.sh #{DBname} # 這是例子,資料庫名為wordpress ./db_bk.sh wordpress
備份wordpress
-
編寫腳本
備份wordpress其實只需要備份wordpress所在的html目錄即可。
所以腳本也很簡單,就是壓縮相關目錄,刪除舊的壓縮文件。
新建website_bk.sh文件,以下是內容:
#!/bin/bash . ./options.conf # 變數定義 WebSite=$1 LogFile=${backup_dir}/web.log NewFile=${backup_dir}/Web_${WebSite}_$(date +%Y%m%d_%H).tgz OldFile=${backup_dir}/Web_${WebSite}_$(date +%Y%m%d --date="${expired_days} days ago")*.tgz # 備份文件夾不存在則創建 [ ! -e "${backup_dir}" ] && mkdir -p ${backup_dir} # 需要備份的目錄不存在則退出 [ ! -e "${wwwroot_dir}/${WebSite}" ] && { echo "[${wwwroot_dir}/${WebSite}] not exist" >> ${LogFile} ; exit 1 ; } # 判斷大小,如果小於1024m if [ `du -sm "${wwwroot_dir}/${WebSite}" | awk '{print $1}'` -lt 1024 ]; then if [ -n "`ls ${OldFile} 2>/dev/null`" ]; then rm -f ${OldFile} echo "[${OldFile}] Delete Old File Success" >> ${LogFile} else echo "[${OldFile}] Delete Old Backup File" >> ${LogFile} fi # 如果文件已存在,則不重覆備份 if [ -e "${NewFile}" ]; then echo "[${NewFile}] The Backup File is exists, Can't Backup" >> ${LogFile} else pushd ${wwwroot_dir} > /dev/null tar czf ${NewFile} ./${WebSite} >> ${LogFile} 2>&1 echo "[${NewFile}] Backup success ">> ${LogFile} popd > /dev/null fi else rsync -crazP --delete ${wwwroot_dir}/${WebSite} ${backup_dir} fi
以下是options.conf文件的部分內容
backup_dir=/home/backup wwwroot_dir=/home/docker-workspace/wordpress website_name=html expired_days=5
-
執行腳本
./website_bk.sh html
備份OSS
使用的是ossutil
以下是相關命令:
# 上傳文件
./ossutil64 cp -f file_url cloud_url
# 刪除命令
./ossutil64 rm oss://bucketname[/prefix]
定時執行
備份的腳本需要定時執行,這裡用的是crontab。
-
安裝
一般centos都有安裝crontab,檢查是否安裝:
rpm -qa | grep crontab
安裝命令:
yum -y install vixie-cronyum -y install crontabs
-
使用
crontab -e進入編輯頁或者vi /etc/crontab
區別在於:前者配置是針對當前用戶的,後者是針對系統的
添加執行腳本的定時任務:
# 這是格式 ${cron} ${cmd} # 這是例子 0 0 * * 1 /home/xxx.sh > /dev/null 2>&1
使用${}代表的是變數,請自行替換
cron:cron表達式,註意,crontab所使用的cron表達式,與java使用的cron有所區別,是不包含秒的,看 /etc/crontab的註釋就知道了
cmd:需要執行的命令