關於使用定時任務定時備份Sql Server 數據庫的坑

公司原來的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”

這樣的話就能完整的執行整個備份流程啦。

爲了這個問題在那倒騰了一天。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章