近日发现,由于审计、测评人员不知道做了什么操作,以致 SQL Server Agent 服务无法正常启动,从而导致早期配置好的 SQL Server 自动备份任务失效。无奈之下,只好自己写个脚本来实现 SQL Server 数据库的自动备份。
我之前写了一篇《使用批处理方式实现 SQL Server 数据库备份》的文章,美中不足的是,缺少差异备份部分。为此,我对之前写的脚本进行了如下修改。
1、mssqlbackup.bat 文件
@echo off
rem 作者:靑龍一笑(C.S.Ricen)
rem 功能:SQL Server 数据库完全备份和差异备份
rem 环境设置
set APP_DIR=%~dp0
set SQL_TOOLS=C:\Program Files\Microsoft SQL Server\90\Tools\Binn
set PATH=%SQL_TOOLS%;%PATH%
rem 数据库信息
set USERNAME=sa
set USERPASS=p7954tF
rem 指定存放 sql 脚本文件的目录
set sqldir=%APP_DIR%sqlfile
rem 判断执行差异备份还是完全备份
rem 默认周一到周六执行差异备份,周日执行完全备份
date /t | find "星期一" >nul&& set FLAG=DiffSQL
date /t | find "星期二" >nul&& set FLAG=DiffSQL
date /t | find "星期三" >nul&& set FLAG=DiffSQL
date /t | find "星期四" >nul&& set FLAG=DiffSQL
date /t | find "星期五" >nul&& set FLAG=DiffSQL
date /t | find "星期六" >nul&& set FLAG=DiffSQL
date /t | find "星期日" >nul&& set FLAG=FullSQL
rem 第一次必须执行完全备份,以后则将下面这行 set FLAG=FullSQL 注释或删除
set FLAG=FullSQL
for /f "delims=\" %%a in ('dir /b /a-d /o-d "%sqldir%\*.*"') do (
echo %%a | find "diff" >nul && (
if "%FLAG%"=="DiffSQL" (
rem 执行差异备份
OSQL.exe -S 127.0.0.1 -U %USERNAME% -P %USERPASS% -i %sqldir%/%%a
)
)
echo %%a | find "full" >nul && (
if "%FLAG%"=="FullSQL" (
rem 执行完全备份
OSQL.exe -S 127.0.0.1 -U %USERNAME% -P %USERPASS% -i %sqldir%/%%a
)
)
)
exit
其中,rem 部分是注释内容,请根据注释信息自行修改相关的配置。
注意 SQL_TOOLS 的路径,根据实际情况设置。另外,在 cmd 上执行 date /t 确认当前系统显示的星期,因为有的操作系统显示的是“星期”,有的操作系统显示的是“周”,请自行灵活修改。
创建一个用来存放 sql 脚本文件的目录,例如:sqlfile。将要执行完全备份和差异备份的脚本放到这个目录下,注意在文件名中加入“diff”或“full”来区分是差异备份还是完全备份脚本。
2、sqlfile/test_diff.sql 文件(差异备份脚本,库名是 test)
DECLARE @path varchar(255)
DECLARE @name varchar(50)
DECLARE @datetime char(14)
DECLARE @bakfile varchar(255)
set @path='D:\dbBack\'
set @name='test'
set @datetime=CONVERT(char(8),getdate(),112) + REPLACE(CONVERT(char(8),getdate(),108),':','')
set @bakfile=@path+''+@name+'_'+@datetime+'.bak'
backup database @name to disk=@bakfile with differential, name=@name
go
3、sqlfile/test_full.sql 文件(完全备份脚本,库名是 test)
DECLARE @path varchar(255)
DECLARE @name varchar(50)
DECLARE @datetime char(14)
DECLARE @bakfile varchar(255)
set @path='D:\dbBack\'
set @name='test'
set @datetime=CONVERT(char(8),getdate(),112) + REPLACE(CONVERT(char(8),getdate(),108),':','')
set @bakfile=@path+''+@name+'_'+@datetime+'.bak'
backup database @name to disk=@bakfile with name=@name
go
有关这两个脚本的详细代码说明,请参考我的另一篇文章《使用批处理方式实现 SQL Server 数据库备份》。
别忘了准备一个脚本用来清除过期的备份文件,给服务器腾出足够的空间。
4、clearbackup.bat 文件
@echo off
rem 作者:靑龍一笑(C.S.Ricen)
rem 功能:清除备份文件
rem 备份目录
set BAKDIR="D:\dbBack"
rem 保留天数
set SAVEDAYS=30
rem 删除过期的备份文件
forfiles /p "%BAKDIR%" /s /d -%SAVEDAYS% /c "cmd /c del /f @path"
exit
最后,配置两个计划任务:一个是定时执行 mssqlbackup.bat 文件,实现自动备份功能;一个是定时执行 clearbackup.bat 文件,实现自动清除过期的备份文件。
进行数据恢复时,只要恢复最近一次完全备份和最后一次差异备份即可。
Copyright © 2005-2023 by www.ricensoftwares.com.cn All Rights Reserved.