为什么要使用批处理脚本来备份SQL Server数据库?

在 Windows 中,批处理脚本是存储在文本文件中的命令序列,可用于自动执行重复性任务。 在SQL Server备份方面,批处理脚本可能不是相对简单的学习方法,但当您需要批量或定期备份数据库时,它无疑是一种高效的方法。

在接下来的文章中,我将分享备份 SQL数据库(甚至是一个实例的所有数据库)的批处理脚本,以及自动化任务的方法。

sql服务器

在开始之前,请确保您的计算机上安装了 SQLCMD 实用程序,因为它是输入 Transact-SQL 语句、系统过程和脚本文件的先决条件。

如果您运行的是SQL Server2014 或更早版本,则该实用程序随 SSMS 一起提供。但从SQL Server2016 开始,您需要单独安装它。下载 SQLCMD 实用程序并在这一页.

使用此实用程序,您可以编写批处理脚本来备份SQL Server数据库。基本命令是:

SqlCmd -E -S servername -Q "BACKUP DATABASE databasename TO DISK ='filepath\filename.bak'"

如果您只想备份一个或几个数据库而没有其他要求,只需在文本编辑器中输入此命令并填写您自己的信息即可。但是如果你想保留不同版本的备份,并且每个文件都包含了具体的备份时间,那么你可以使用下面的脚本:

ECHO OFF
:: 设置保存备份文件的路径 例如 D:\backup
set BACKUPPATH=

:: 设置服务器和实例的名称
set SERVERNAME=

:: 设置数据库名称
set DATABASENAME=

:: 文件名格式 Name-Date
For /f "tokens =2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)

set DATESTAMP=%mydate%_%mytime%
set BACKUPFILENAME=%BACKUPPATH%\%DATABASENAME%-%DATESTAMP%.bak

SqlCmd -E -S %SERVERNAME% -d master -Q "备份数据库 [%DATABASENAME%] 到磁盘 = N'%BACKUPFILENAME%' WITH INIT, NOUNLOAD, NAME = N'%DATABASENAME% backup', NOSKIP, STATS = 10, NOFORMAT”
ECHO.

填写您的备份路径、服务器名称和数据库名称,然后使用 .bat 扩展名保存此备份脚本。因此,您可以随时双击批处理文件备份 SQL数据库。

在某些情况下,您可能不仅要备份一两个数据库,还要备份SQL Server实例中的所有数据库。什么样的备份脚本可以帮助您做到这一点?

实际上,您只需要构建一个数据库列表并指定要从中排除的那些。例如,我想将我所有的 SQL数据库(系统数据库除外)备份到 D:\Backup,那么下面的批处理脚本将起作用:

@ECHO OFF
SETLOCAL
REM 以 YYYY-MM-DD 格式获取日期(假设语言环境是美国)
FOR /F "tokens=1,2,3,4 delims=/ " %%A IN ('Date /T' ) DO SET NowDate=%%D-%%B-%%C

REM 建立要备份的数据库列表
SET DBList=D:\SQLDBList.txt
SqlCmd -E -S DESKTOP-AC51C0M -h-1 -W -Q " SET NoCount ON; SELECT Name FROM master.dbo.sysDatabases WHERE [Name] NOT IN ('master','model','msdb','tempdb')" > "%DBList%"

REM 备份每个数据库,添加日期到文件名
FOR /F "tokens=*" %%I IN (%DBList%) DO (
ECHO 备份数据库:%%I
SqlCmd -E -S DESKTOP-AC51C0M -Q "BACKUP DATABASE [%%I] TO Disk ='D:\Backup\%%I-%NowDate%.bak'"
ECHO.)

REM 清理临时文件
IF EXIST "%DBList%" DEL /F /Q "%DBList%"

ENDLOCAL

您可以修改构建 DBlist 的路径(之后会自动删除)和保存备份的文件夹。此外,此脚本不会备份系统数据库('master'、'model'、'msdb'、'tempdb'),您可以添加要排除的其他数据库。

为了便于管理,一些用户可能希望创建一个带有时间标签的文件夹,以单独保存每个备份创建的所有 bak 文件。 因此,我还将提供一个替代脚本供您参考。

@ECHO OFF
SETLOCAL
REM 以 YYYY-MM-DD 格式获取日期(假设语言环境是美国)
FOR /F "tokens=1,2,3,4 delims=/ " %%A IN ('Date /T' ) DO SET NowDate=%%D-%%B-%%C

REM 建立要备份的数据库列表
SET DBList=D:\SQLDBList.txt
SqlCmd -E -S DESKTOP-AC51C0M -h-1 -W -Q " SET NoCount ON; SELECT Name FROM master.dbo.sysDatabases WHERE [Name] NOT IN ('master','model','msdb','tempdb')" > "%DBList%"

mkdir D:\Backup
mkdir D: \Backup\%NowDate%
REM 备份每个数据库,在文件名前添加日期
FOR /F "tokens=*" %%I IN (%DBList%) DO (
ECHO 备份数据库:%%I
SqlCmd -E -S DESKTOP -AC51C0M -Q"将数据库 [%%I] 备份到磁盘 ='D:\Backup\%NowDate%\%%I.bak'"
ECHO。)

REM 清理临时文件
IF EXIST "%DBList%" DEL /F /Q "%DBList%"

ENDLOCAL

它与前一个脚本的不同之处仅在于创建和命名备份文件。 您可以根据需要进行选择。

通过以上步骤,您就有了一个备份 SQL数据库的批处理文件。要自动执行它,您可以使用 Windows 任务计划程序。

1. 直接搜索“任务计划程序”,或导航到“控制面板”>“管理工具”>“任务计划程序”

创建基本任务

2. 单击 “创建基本任务” 并按照向导选择 “触发器”。选项包括每日、每周、每月等。

选择触发器

3. 将 Action设置 为“Start a program”,然后浏览您的本地驱动器以选择批处理脚本。

选择动作

完成设置后,任务计划程序将根据您设置的计划执行选定的批处理脚本。

备选方案:自动备份多个SQL Server数据库或实例

使用批处理脚本备份SQL Server数据库的主要好处是能够一次备份大量数据库、执行和自动备份的简单性。只要可以满足这些点,使用 GUI 的有效替代方案就不是一个坏主意。

例如,集中备份软件傲梅企业备份网络版包含支持 SQL 2005-2019 的SQL Server备份功能。有了它,您可以保护 LAN 内作为客户端签名的任何 Windows PC 或服务器。您可以自由选择数据库或整个实例进行备份和恢复。

至于自动化,您可以设置计划以每天/每周/每月运行备份。支持完全备份和差异备份。除了SQL数据库,它还支持“文件、分区、磁盘和操作系统备份”

在中央计算机上安装傲梅企业备份网络版后,您可以在所有客户端上安装代理程序包,并“请求控制”您要管理的计算机。之后,您可以尝试以下步骤来创建SQL Server备份任务。

请求控制

1. 导航到“主页”选项卡并选择SQL Server 备份 开始。

sql服务器备份

2. 在步骤 1中,单击+ 添加计算机以检测所有具有SQL Server数据库的受控计算机,然后选择要备份的计算机。

将计算机添加到备份

3. 点击“第二步”,然后点击+ Add在弹出窗口中指定源数据。您可以选择多个数据库甚至多个实例进行备份。

将数据库添加到备份

4. 单击 步骤 3选择目的地。在弹出的窗口中点击 添加存储,在这里您可以输入路径和身份验证来指定网络共享 NAS。添加的路径将被保存以供您以后使用。

选择目标路径

5. 现在您可以单击“计划”自动备份,并在“高级”选项卡中选择备份类型(完整/差异)。之后,单击“开始备份”

日程

一旦任务执行完毕,您无需担心后续问题。所有选定的数据库将根据您设置的计划自动备份。

总结

在所有方法中,使用批处理脚本备份SQL Server数据库可能不是相对简单的方法,但在自动备份和批量备份方面确实有一些优势。例如,您可以一次备份一个实例中的所有数据库,并使用 Windows 任务调度程序灵活地自动执行任务。

但是,如果你觉得定制一个批处理脚本真的很麻烦,那么像傲梅企业备份网络版版这样的SQL备份软件也是一个好主意。它将直观地引导您完成备份过程,并允许您在一台机器上选择任意数量的数据库。如果你想自动备份 SQL数据库,那么时间表选项也可以满足您的需求。