1.數據庫備份 ,支持多數據庫,清理過期備份數據
執行以下腳本文件進行數據庫備份,會當前目錄下創建mysql文件夾進行備份操作
需要注意的點:
1.不要使用xftp等工具創建sh腳本,會有字符無法識別的異常,正確做法是使用vim命令創建sh腳本
#編輯sh腳本
vim mysqlback.sh
2.備份時會鎖表,盡量避免讀寫高峰期備份
#!/bin/bash #功能說明:本功能用於備份 #編寫日期:2020/09/05 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH #數據庫用戶名 dbUser='root' #數據庫密碼 dbPasswd='password' #數據庫IP dbIp='192.168.0.1' #需要備份的數據庫,多個數據庫用空格分開 dbName='test1 test2' #備份時間 backtime=`date +%Y%m%d%H%M%S` #日志備份到當前路徑mysql文件夾下 logpath=$(pwd)/mysql/log #數據備份到當前路徑mysql文件夾下 datapath=$(pwd)/mysql/data #自動創建目錄 if [ ! -d ${logpath} ];then mkdir -pv ${logpath} fi #自動創建目錄 if [ ! -d ${datapath} ];then mkdir -pv ${datapath} fi #日志記錄頭部 echo "備份時間為${backtime},備份數據庫: ${dbName} 開始" >> ${logpath}/mysqllog.log echo "備份時間為${backtime},備份數據庫: ${dbName} 開始" #正式備份數據庫 for table in $dbName; do echo "備份時間為${backtime},備份數據庫: ${table} 備份開始!!" >> ${logpath}/mysqllog.log echo "備份時間為${backtime},備份數據庫: ${table} 備份開始!!" source=`/usr/local/mysql/bin/mysqldump --skip-lock-tables -u ${dbUser} -h ${dbIp} -p${dbPasswd} ${table} > ${datapath}/${backtime}-${table}.sql` 2>> ${logpath}/mysqllog.log; #備份成功以下操作 if [ "$?" == 0 ];then cd $datapath #為節約硬盤空間,將數據庫文件壓縮,壓縮需要時間,視sql文件大小決定,耐心等待即可 tar zcvf ${backtime}-${table}.tar.gz ${backtime}-${table}.sql > /dev/null #刪除原始文件,只留壓縮后文件 rm -f ${datapath}/${backtime}-${table}.sql echo "備份時間為${backtime},備份數據庫: ${table} 備份成功!!" >> ${logpath}/mysqllog.log echo "備份時間為${backtime},備份數據庫: ${table} 備份成功!!" else #備份失敗則進行以下操作 echo "備份時間為${backtime},備份數據庫: ${table} 備份失敗!!" >> ${logpath}/mysqllog.log echo "備份時間為${backtime},備份數據庫: ${table} 備份失敗!!" fi done #刪除30天前備份,也就是只保存30天內的備份 find $datapath -name "*.tar.gz" -type f -print -mtime +30 -exec rm -rf {} \; > /dev/null 2>&1
執行成功后在當前路徑下/mysql/data即可查看到備份的數據庫壓縮文件
2.單數據庫單表備份 ,支持多表備份,清理過期備份數據
#!/bin/bash #功能說明:本功能用於備份 #編寫日期:2020/09/05 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH #數據庫用戶名 dbUser='root' #數據庫密碼 dbPasswd='password' #數據庫IP dbIp='192.168.0.1' #需要備份的數據庫 dbName='test1' #需要備份的數據庫表,多個數據表用空格分開 dbTableName='table1 table2' #備份時間 DATA=`date +%Y-%m-%d` backTime=`date +%Y%m%d%H%M%S` #日志備份到當前路徑mysql文件夾下 logpath=$(pwd)/mysql/log #數據備份到當前路徑mysql文件夾下 datapath=$(pwd)/mysql/data/${DATA}-${dbName}-backfils #自動創建目錄 if [ ! -d ${logpath} ];then mkdir -pv ${logpath} fi #自動創建目錄 if [ ! -d ${datapath} ];then mkdir -pv ${datapath} fi #日志記錄頭部 echo "備份時間為${backTime},備份數據庫表: ${dbName}->${dbTableName} 開始" >> ${logpath}/mysqllog.log echo "備份時間為${backTime},備份數據庫表: ${dbName}->${dbTableName} 開始" #正式備份數據庫 for table in $dbTableName; do source=`/usr/local/mysql/bin/mysqldump --skip-lock-tables -u ${dbUser} -h ${dbIp} -p${dbPasswd} ${dbName} ${table} > ${datapath}/${backTime}-${dbName}-${table}.sql` 2>> ${logpath}/mysqllog.log; #備份成功以下操作 if [ "$?" == 0 ];then cd $datapath #為節約硬盤空間,將數據庫文件壓縮,壓縮需要時間,視sql文件大小決定,耐心等待即可 tar zcvf ${backTime}-${table}.tar.gz ${backTime}-${dbName}-${table}.sql > /dev/null #刪除原始文件,只留壓縮后文件 rm -f ${datapath}/${backTime}-${dbName}-${table}.sql echo "備份時間為${backTime},備份數據庫表: ${dbName}->${table} 備份成功!!" >> ${logpath}/mysqllog.log echo "備份時間為${backTime},備份數據庫表: ${dbName}->${table} 備份成功!!" else #備份失敗則進行以下操作 echo "備份時間為${backTime},備份數據庫表: ${dbName}->${table} 備份失敗!!" >> ${logpath}/mysqllog.log echo "備份時間為${backTime},備份數據庫表: ${dbName}->${table} 備份失敗!!" fi done #刪除30天前備份,也就是只保存30天內的備份 find $datapath -name "*backfils" -type d -print -mtime +30 -exec rm -rf {} \; > /dev/null 2>&1
執行成功后在當前路徑下/mysql/data即可查看到備份的數據庫壓縮文件
3.定時運行備份
查看當前服務器的定時任務
crontab -e
添加定時任務執行腳本,每天0點運行一次,根據業務需要調整時間
0 0 0 1/1 * cd /home/mysqlback;./mysqlback.sh
測試運行一下定時任務命令,查看是否運行正常
cd /home/mysqlback;./mysqlback.sh
運行后出現以下異常
-bash: ./mysqlback.sh: Permission denied
執行權限分配命令
chmod u+x *.sh
再次執行命令,備份成功