公司原來的Sql Service 是在windows 上的,現在要移植到Linux 上邊,這時候就涉及到一個自動備份的問題。
既然是要使用自動備份,當然首先要寫一個備份腳本啦
#!/bin/sh
#進入要放置備份的頁面
cd /var/opt/mssql/data/
#獲取當前時間年月日 YYYYmmdd
date=`date +"%Y%m%d"`
#設置日誌文件名稱
backupLog='backups'${date}'.log'
#設置備份文件名稱
file='CECWPC_HBWF'${date}
echo "備份文件名稱:"${file} >>${backupLog}
#刪除舊的壓縮包
rm -rf ${file}'.zip'
if [ $? -eq 0 ];then
echo "刪除舊壓縮包成功" >>${backupLog}
else
echo "刪除舊壓縮包失敗" >>${backupLog}
fi
#開始執行備份
startBackUpTime=`date +"%Y-%m-%d %H:%M:%S"`
echo "開始備份數據庫,當前時間:"${startBackUpTime} >>${backupLog}
sqlcmd -S localhost -U SA -P Datasa123456 -Q "BACKUP DATABASE [CECWPC_HBWF] TO DISK = N'${file}.bak' WITH NOFORMAT, NOINIT, NAME = '備份CECWPC_HBWF', SKIP, NOREWIND, NOUNLOAD, STATS = 10"
endBackUpTime=`date +"%Y-%m-%d %H:%M:%S"`
echo "結束備份數據庫,當前時間"${endBackUpTime} >>${backupLog}
duration=`echo eval $(($(date +%s -d "${endBackUpTime}") - $(date +%s -d "${startBackUpTime}"))) | awk '{t=split("60 s 60 m 24 h 999 d",a);for(n=1;n<t;n+=2){if($1==0)break;s=$1%a[n]a[n+1]s;$1=int($1/a[n])}print s}'`
echo "總共耗時"${duration};
echo "備份狀態"$? >>${backupLog}
if [ $? -eq 0 ];then
if [ -f "CECWPC_HBWF${date}.bak" ];then
startBackUpTime=`date +"%Y-%m-%d %H:%M:%S"`
echo "開始執行數據庫備份打包,當前時間:"${startBackUpTime} >>${backupLog}
zip 'CECWPC_HBWF'${date}'.zip' 'CECWPC_HBWF'${date}'.bak' '/var/opt/mssql/data/'
endBackUpTime=`date +"%Y-%m-%d %H:%M:%S"`
echo "數據庫備份打包完成,當前時間:"${endBackUpTime} >>${backupLog}
duration=`echo eval $(($(date +%s -d "${endBackUpTime}") - $(date +%s -d "${startBackUpTime}"))) | awk '{t=split("60 s 60 m 24 h 999 d",a);for(n=1;n<t;n+=2){if($1==0)break;s=$1%a[n]a[n+1]s;$1=int($1/a[n])}print s}'`
echo "總共耗時"${$duration}
else
echo "找不到數據庫備份文件,取消打包" >>${backupLog}
fi
else
echo "數據庫備份失敗" >>${backupLog}
fi
echo "數據庫備份完成" >>${backupLog}
echo "-----------------------------------------------------------" >>${backupLog}
在這裏面又一個坑,就是在
sqlcmd -S localhost -U SA -P Datasa123456 -Q “BACKUP DATABASE [CECWPC_HBWF] TO DISK = N’${file}.bak’ WITH NOFORMAT, NOINIT, NAME = ‘備份CECWPC_HBWF’, SKIP, NOREWIND, NOUNLOAD, STATS = 10”
這段代碼中,這是備份數據庫的命令,在我手動執行這個shell的時候沒有問題,但是一把它交給 crontab 定時任務,這段 命令就無法執行。後來通過一篇博客才發現原來 crontab 執行的時候是沒有全局變量的,所以執行上邊的命令會找不到命令,所以這時候我們要用全路徑來執行
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P Datasa123456 -Q “BACKUP DATABASE [CECWPC_HBWF] TO DISK = N’${file}.bak’ WITH NOFORMAT, NOINIT, NAME = ‘備份CECWPC_HBWF’, SKIP, NOREWIND, NOUNLOAD, STATS = 10”
這樣的話就能完整的執行整個備份流程啦。
爲了這個問題在那倒騰了一天。。。。。