关于使用定时任务定时备份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”

这样的话就能完整的执行整个备份流程啦。

为了这个问题在那倒腾了一天。。。。。

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