You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在未加入域的远程共享存储创建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.txt
    
    其中ftp_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

火山引擎 最新活动