如何在未加入域的远程共享存储创建SQL Server备份存储过程
解决SQL Server备份到非域远程存储的权限问题(无需修改服务账号)
我之前也碰到过一模一样的棘手情况!不能改SQL Server的服务账号,远程存储又不在域里,权限怎么都搞不定,确实头疼。结合我自己的实战经验,给你几个可行的方案,不用动服务账号就能搞定:
方案1:SQL代理作业+Windows凭据+映射网络驱动器
这个方案是最常用的,利用SQL代理可以单独指定作业运行身份的特性,绕开SQL服务账号的权限限制:
- 第一步:在SQL服务器的控制面板→凭据管理器→Windows凭据里,添加一个普通凭据,输入远程存储的IP/主机名、有权限读写的账号和密码。
- 第二步:创建SQL代理作业,添加一个「操作系统(CmdExec)」类型的步骤,命令示例:
# 临时映射远程共享为Z盘(persistent:no避免开机自动映射) net use Z: \\192.168.1.100\BackupShare /persistent:no # 执行数据库备份(自动生成带时间戳的文件名) sqlcmd -S . -Q "BACKUP DATABASE [YourDB] TO DISK='Z:\YourDB_Backup_$(GETDATE:yyyyMMddHHmm).bak' WITH COMPRESSION, INIT" # 清理映射的驱动器 net use Z: /delete - 第三步:在作业的「步骤属性」里,把「运行身份」改成刚才创建的Windows凭据对应的账号,或者在SQL代理的「凭据」里创建一个关联该Windows账号的凭据,然后选择这个凭据作为运行身份。
方案2:PowerShell脚本+显式凭据访问共享
如果不想用映射驱动器,PowerShell可以直接带凭据访问远程共享,灵活性更高:
- 写一个PowerShell脚本(比如
BackupToRemote.ps1):# 定义远程存储的凭据 $remoteUser = "RemoteAccount" $remotePass = ConvertTo-SecureString "RemotePassword" -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential ($remoteUser, $remotePass) # 临时挂载远程共享 New-PSDrive -Name Z -PSProvider FileSystem -Root "\\192.168.1.100\BackupShare" -Credential $cred -Persist:$false # 执行SQL备份(这里用sqlcmd,也可以用Invoke-SqlCmd) sqlcmd -S localhost -Q "BACKUP DATABASE [YourDB] TO DISK='Z:\YourDB_Backup_$(Get-Date -Format 'yyyyMMddHHmm').bak' WITH COMPRESSION, INIT" # 卸载共享 Remove-PSDrive Z - 然后创建SQL代理作业,步骤类型选「PowerShell」,直接调用这个脚本;同样要设置作业的运行身份为有权限的账号,或者把凭据存在SQL代理凭据里。
方案3:备份到云存储URL(如果远程存储支持)
如果你的远程存储是云对象存储(比如Azure Blob、AWS S3兼容存储),SQL Server本身支持直接备份到URL,完全不用依赖Windows权限:
- 第一步:在SQL Server里创建存储凭据,用云存储的访问密钥:
CREATE CREDENTIAL [https://youraccount.blob.core.windows.net/backupcontainer] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '你的SAS密钥或者存储账户访问密钥'; - 第二步:直接执行备份命令:
BACKUP DATABASE [YourDB] TO URL = 'https://youraccount.blob.core.windows.net/backupcontainer/YourDB_Backup_202405201200.bak' WITH CREDENTIAL = 'https://youraccount.blob.core.windows.net/backupcontainer', COMPRESSION, INIT;
这个方案最省心,不用管Windows权限和域的问题,只要云存储支持SQL的备份到URL功能就行。
方案4:本地备份+FTP/SFTP上传
如果远程存储只能用FTP/SFTP,那就先备份到SQL服务器本地磁盘,再上传到远程:
- 第一步:创建SQL代理作业,先添加一个「Transact-SQL(T-SQL)」步骤,执行本地备份:
BACKUP DATABASE [YourDB] TO DISK='C:\Temp\YourDB_Backup.bak' WITH COMPRESSION, INIT; - 第二步:添加一个「操作系统(CmdExec)」步骤,用命令行工具上传。比如用Putty的
psftp:
其中psftp user@ftp.server.com -pw password -b C:\Temp\ftp_upload.txtftp_upload.txt的内容是:put C:\Temp\YourDB_Backup.bak /remote/backup/path/YourDB_Backup.bak quit - 第三步:可以再加一个步骤删除本地的临时备份文件:
del C:\Temp\YourDB_Backup.bak
方案选择建议
- 如果是SMB共享的远程存储,优先选方案1或方案2,配置简单,兼容性好;
- 如果是云存储,直接用方案3,最省事;
- 如果只能用FTP/SFTP,就用方案4,虽然多一步但也能解决问题。
内容的提问来源于stack exchange,提问作者Zane




