当前位置:首页 > MSSQL
使用批处理实现 SQL Server 数据库的完全备份和差异备份
来源:靑龍一笑的博客  作者:靑龍一笑  发布时间:2022-11-17 14:53:39  点击量:185  评论:0

    近日发现,由于审计、测评人员不知道做了什么操作,以致 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 文件,实现自动清除过期的备份文件。
    进行数据恢复时,只要恢复最近一次完全备份和最后一次差异备份即可。

版权所有 © 2005-2023 靑龍一笑的博客  Powered by C.S.Ricen
Copyright © 2005-2023 by www.ricensoftwares.com.cn  All Rights Reserved.

欢迎光临本站,这里是靑龍一笑的博客。

因资金匮乏,本站已迁到国外的免费空间,可能导致本站的访问速度较慢,由此给您带来的不便,敬请谅解。

您可以通过下方的“支持本站建设”链接,给本站提供资金支持。

Free Web Hosting