SQL Server 提供了多种备份方式,其中命令行备份(主要通过 sqlcmd 或 osql 工具结合 T-SQL 命令实现)是一种灵活且适用于自动化场景的方法,通过命令行,管理员可以编写脚本实现定时备份、差异备份、事务日志备份等操作,尤其适合在服务器无图形界面的环境下使用,以下是关于 SQL Server 命令行备份的详细说明。

命令行备份的基本语法
SQL Server 命令行备份的核心是通过 T-SQL 的 BACKUP DATABASE 或 BACKUP LOG 语句实现,结合 sqlcmd 工具执行,基本语法如下:
sqlcmd -S 服务器名 -U 用户名 -P 密码 -Q "BACKUP DATABASE 数据库名 TO DISK = '备份文件路径' [WITH 选项]"
-S:指定 SQL Server 实例名(如localhost或服务器名\实例名);-U和-P:分别用于指定登录用户名和密码(若使用 Windows 身份验证,可省略-U和-P,改用-E);-Q:表示执行 T-SQL 命令后退出;BACKUP DATABASE:备份完整数据库,BACKUP LOG备份事务日志;TO DISK:指定备份文件的路径(需包含文件扩展名,如.bak);WITH子句:可配置备份选项,如INIT(覆盖现有备份文件)、NOINIT(追加到文件)、COMPRESSION(压缩备份)等。
常见备份类型及示例
完整数据库备份
完整数据库备份是备份整个数据库的数据和日志,适合定期全量备份,示例:
sqlcmd -S localhost -U sa -P 123456 -Q "BACKUP DATABASE [TestDB] TO DISK = 'D:\Backup\TestDB_Full.bak' WITH INIT, NAME = 'TestDB完整备份', COMPRESSION"
INIT:覆盖同名的备份文件(若省略,则追加到文件);NAME:为备份操作指定描述性名称;COMPRESSION:启用压缩以减少备份文件大小。
差异备份
差异备份仅备份自上次完整备份后发生更改的数据页,需先执行一次完整备份,示例:
sqlcmd -S localhost -U sa -P 123456 -Q "BACKUP DATABASE [TestDB] TO DISK = 'D:\Backup\TestDB_Diff.bak' WITH DIFFERENTIAL, NAME = 'TestDB差异备份'"
DIFFERENTIAL:指定差异备份,依赖最近的完整备份。
事务日志备份
事务日志备份备份自上次日志备份后的所有事务日志,需数据库恢复模式为“完整”或“批量日志恢复”,示例:

sqlcmd -S localhost -U sa -P 123456 -Q "BACKUP LOG [TestDB] TO DISK = 'D:\Backup\TestDB_Log.trn' WITH NAME = 'TestDB日志备份', NOINIT"
NOINIT:追加到现有日志备份文件(避免覆盖)。
备份到网络路径
备份文件可存储在网络共享目录中,需确保 SQL Server 服务账户对该路径有写入权限,示例:
sqlcmd -S localhost -U sa -P 123456 -Q "BACKUP DATABASE [TestDB] TO DISK = '\\ServerName\Share\TestDB_Network.bak' WITH COMPRESSION"
备份选项说明
| 选项 | 说明 |
|---|---|
INIT |
覆盖备份文件,若文件存在则删除原有内容(默认为 NOINIT) |
NOINIT |
追加备份到文件末尾,保留原有内容 |
COMPRESSION |
启用备份压缩(需 SQL Server 企业版或标准版) |
NAME = '备份名' |
为备份操作指定逻辑名称,便于管理 |
DESCRIPTION = '描述' |
添加备份的描述信息(可选) |
STATS = 10 |
每备份 10% 的数据输出一次进度信息(便于监控大备份进度) |
CHECKSUM |
在备份过程中计算校验和,验证数据完整性 |
自动化备份脚本示例
通过批处理脚本(.bat)结合 sqlcmd 可实现定时备份,创建 backup.bat 文件:
@echo off set "DBName=TestDB" set "BackupPath=D:\Backup" set "Date=%date:~0,4%%date:~5,2%%date:~8,2%" set "FullBackup=%BackupPath%\%DBName%_Full_%Date%.bak" set "DiffBackup=%BackupPath%\%DBName%_Diff_%Date%.bak" :: 执行完整备份 sqlcmd -S localhost -U sa -P 123456 -Q "BACKUP DATABASE [%DBName%] TO DISK = '%FullBackup%' WITH INIT, NAME = '%DBName%完整备份', COMPRESSION" echo 完整备份已完成:%FullBackup% :: 执行差异备份 sqlcmd -S localhost -U sa -P 123456 -Q "BACKUP DATABASE [%DBName%] TO DISK = '%DiffBackup%' WITH DIFFERENTIAL, NAME = '%DBName%差异备份'" echo 差异备份已完成:%DiffBackup% pause
将此脚本添加到 Windows 任务计划程序,即可实现定时自动备份。
相关问答FAQs
问题1:命令行备份时提示“拒绝访问”如何解决?
解答:通常是由于 SQL Server 服务账户对备份路径无写入权限,需确保:

- 备份路径(如
D:\Backup或网络共享)对当前登录用户(或 SQL Server 服务账户)具有“完全控制”权限; - 若使用网络路径,检查防火墙设置及共享文件夹的权限配置。
问题2:如何验证备份文件是否有效?
解答:可通过 RESTORE VERIFYONLY 命令验证备份文件的完整性,无需实际恢复数据库,示例:
sqlcmd -S localhost -U sa -P 123456 -Q "RESTORE VERIFYONLY FROM DISK = 'D:\Backup\TestDB_Full.bak'"
若执行后提示“数据库备份已验证”,说明备份文件有效;若报错,则可能存在文件损坏或权限问题。
