公司原来的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”
这样的话就能完整的执行整个备份流程啦。
为了这个问题在那倒腾了一天。。。。。