为什么要使用批处理脚本来备份SQL Server数据库?
在 Windows 中,批处理脚本是保存在文本文件中的一系列命令,可以用于自动执行重复性任务。在 SQL Server 的备份过程中,尽管批处理脚本可能不是最容易学习的方法,但在需要批量或定期备份数据库时,它无疑是一个高效的解决方案。
在本文中,我将分享如何使用批处理脚本备份 SQL 数据库,甚至备份整个实例的所有数据库,并介绍如何自动化这些任务。
在开始之前,请确保您的计算机上已经安装了 SQLCMD 实用程序,因为它是输入 Transact-SQL 语句、系统过程和脚本文件的必要工具。通过这个实用程序,您可以编写批处理脚本来备份 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. 将 触发器设置 为“启动程序”,然后浏览您的本地驱动器以选择批处理脚本。
完成设置后,任务计划程序将根据您设置的计划执行选定的批处理脚本。
备选方案:自动备份多个SQL Server数据库或实例
使用批处理脚本备份SQL Server数据库的主要好处是能够一次备份大量数据库、执行和自动备份的简单性。只要可以满足这些点,使用 GUI 的有效替代方案就不是一个坏主意。
例如,傲梅企业备份网络版包含支持 SQL 2005-2019 的SQL Server备份功能。有了它,您可以保护 LAN 内作为客户端签名的任何 Windows PC 或服务器。您可以自由选择数据库或整个实例进行备份和恢复。
至于自动化,您可以设置计划以每天/每周/每月运行备份。支持完全备份和差异备份。除了SQL数据库,它还支持“文件、分区、磁盘和操作系统备份”。
在中央计算机上安装傲梅企业备份网络版后,您可以在所有客户端上安装代理程序包,并“请求控制”您要管理的计算机。之后,您可以尝试以下步骤来创建SQL Server备份任务。
1. 导航到“主页”选项卡并选择SQL Server 备份开始。
2. 在步骤 1中,单击+ 添加计算机以检测所有具有SQL Server数据库的受控计算机,然后选择要备份的计算机。
3. 点击“第二步”,然后点击+ Add在弹出窗口中指定源数据。您可以选择多个数据库甚至多个实例进行备份。
4. 单击步骤 3选择目的地。在弹出的窗口中点击添加存储,在这里您可以输入路径和身份验证来指定网络共享 NAS。添加的路径将被保存以供您以后使用。
5. 现在您可以单击“计划”自动备份,并在“高级”选项卡中选择备份类型(完整/差异)。之后,单击“开始备份”。
一旦任务执行完毕,您无需担心后续问题。所有选定的数据库将根据您设置的计划自动备份。
总结
虽然使用批处理脚本备份 SQL Server 数据库可能不是最简单的方法,但在自动化备份和批量备份方面确实有许多优势。比如,您可以一次备份一个实例中的所有数据库,并使用 Windows 任务调度程序灵活地自动执行任务。
如果您觉得编写批处理脚本过于繁琐,可以考虑使用像傲梅企业备份网络版这样的 SQL 备份软件。这类软件能够直观地引导您完成备份过程,并允许您在一台机器上选择任意数量的数据库。此外,您还可以设置时间表选项来自动备份 SQL 数据库,满足您的需求。
领取专属 10元无门槛券
私享最新 技术干货