Windows SQL Server 备份无法传输至异地共享目录排查处理

复制代码
文中 IP 均为脱敏后的示例地址。

一、示例环境

项目 示例信息
数据库服务器 IP 10.10.10.113
异地备份服务器 IP 10.10.20.192
数据库本地备份目录 F:\databasebak
异地服务器本地目录 F:\10.10.10.113
异地共享访问路径 \\10.10.20.192\f\10.10.10.113
备份文件 ES.EMS_backup_2026_07_05_020003.bak

异地备份服务器将本地 F:\ 共享为:

复制代码
\\10.10.20.192\f

因此,异地服务器本地目录:

复制代码
F:\10.10.10.113

在数据库服务器上对应的网络访问路径为:

复制代码
\\10.10.20.192\f\10.10.10.113

其中,目录名 10.10.10.113 对应数据库服务器的 IP。


二、问题现象

SQL Server 本地备份文件正常生成:

复制代码
F:\databasebak\ES.EMS_backup_2026_07_05_020003.bak

但传输脚本执行后,异地备份服务器目录中没有对应文件:

复制代码
F:\10.10.10.113

在数据库服务器上手工执行复制命令:

复制代码
copy /Y "F:\databasebak\ES.EMS_backup_2026_07_05_020003.bak" "\\10.10.20.192\f\10.10.10.113\"

提示:

复制代码
用户名或密码不正确。
已复制 0 个文件。

查看返回码:

复制代码
echo 返回码:%errorlevel%

结果为:

复制代码
返回码:1

三、问题定位

检查确认:

  • 本地备份文件存在;

  • 数据库服务器与异地备份服务器网络正常;

  • 异地共享目录已创建;

  • 其他服务器可以正常写入该共享目录;

  • 当前数据库服务器手工复制时提示用户名或密码错误。

最终确认:

当前 Windows 执行账户没有可用的异地 SMB 共享认证,或原共享连接中保存的认证信息已经不可用。

SMB 认证连接没有统一的固定失效时间,但以下情况可能导致原连接不可用:

  • 数据库服务器或异地备份服务器重启;

  • Windows 用户注销或切换;

  • 异地服务器账户密码发生变化;

  • Windows 保存了旧密码;

  • 网络中断导致原 SMB 会话断开;

  • 计划任务更换了运行账户;

  • 手工认证账户与计划任务运行账户不一致。


四、处理步骤

1. 查看当前共享连接

在数据库服务器 CMD 中执行:

复制代码
net use

检查是否存在异地共享连接:

复制代码
\\10.10.20.192\f

2. 删除原有共享连接

复制代码
net use "\\10.10.20.192\f" /delete

如果提示未找到连接,可以忽略。

检查 Windows 是否保存了旧凭据:

复制代码
cmdkey /list

如存在异地服务器旧凭据,可删除:

复制代码
cmdkey /delete:10.10.20.192

3. 重新认证异地共享

复制代码
net use "\\10.10.20.192\f" /user:10.10.20.192\Administrator *

根据提示输入异地备份服务器账户密码。

密码输入时 CMD 不显示任何字符,属于正常现象。

认证成功后显示:

复制代码
命令成功完成。

认证到共享根目录即可,不需要指定到具体子目录。


4. 验证异地目录是否可以访问

复制代码
dir "\\10.10.20.192\f\10.10.10.113"

能够正常列出目录内容,说明共享路径和认证正常。

5. 验证异地目录写权限

复制代码
echo test>"\\10.10.20.192\f\10.10.10.113\write_test.txt"

然后在异地备份服务器检查:

复制代码
F:\10.10.10.113\write_test.txt

测试完成后删除:

复制代码
del "\\10.10.20.192\f\10.10.10.113\write_test.txt"

6. 手工复制备份文件

复制代码
copy /Y "F:\databasebak\ES.EMS_backup_2026_07_05_020003.bak" "\\10.10.20.192\f\10.10.10.113\"

对于几十 GB 的备份文件,copy 命令不会显示实时进度。命令窗口未返回提示符时,通常表示文件仍在传输,不要关闭窗口。

传输完成后显示:

复制代码
已复制 1 个文件。

检查返回码:

复制代码
echo 返回码:%errorlevel%

正常结果:

复制代码
返回码:0

7. 验证异地文件

在数据库服务器执行:

复制代码
dir "\\10.10.20.192\f\10.10.10.113\ES.EMS_backup_2026_07_05_020003.bak"

在异地备份服务器本机执行:

复制代码
dir "F:\10.10.10.113\ES.EMS_backup_2026_07_05_020003.bak"

查看本地文件大小:

复制代码
dir "F:\databasebak\ES.EMS_backup_2026_07_05_020003.bak"

本地与异地文件字节数一致,说明文件传输完整。


五、传输脚本整改

原脚本不能在复制命令执行后直接输出"传输成功",必须检查返回码。

复制代码
xcopy "%source_path%\%today_file%" "%dest_path%\" /Y /Z

if errorlevel 1 (
    echo [失败] 文件传输失败,返回码:%errorlevel%
    exit /b 1
)

echo [成功] 文件传输完成。

建议使用 robocopy 传输大文件:

复制代码
robocopy "F:\databasebak" "\\10.10.20.192\f\10.10.10.113" "ES.EMS_backup_2026_07_05_*.bak" /Z /R:3 /W:10

判断返回码:

复制代码
if errorlevel 8 (
    echo [失败] Robocopy传输失败,返回码:%errorlevel%
    exit /b 2
)

Robocopy 返回码小于 8,通常不表示复制失败。

传输完成后,还应检查异地文件是否真实存在:

复制代码
if not exist "\\10.10.20.192\f\10.10.10.113\备份文件名.bak" (
    echo [失败] 异地目录未找到备份文件。
    exit /b 3
)

六、计划任务注意事项

手工复制成功后,计划任务仍可能失败,因为 SMB 认证与 Windows 运行账户相关。

需要确认:

  • 计划任务使用固定的 Windows 账户;

  • 该账户与执行 net use 的账户一致;

  • 不使用没有共享认证的 SYSTEM 账户;

  • 勾选"使用最高权限运行";

  • 脚本记录复制返回码;

  • 传输完成后校验异地文件是否存在及大小是否一致。


七、结论

本次问题不是备份文件、网络或异地共享目录异常,而是数据库服务器当前 Windows 执行账户缺少有效的 SMB 共享认证。

重新执行:

复制代码
net use "\\10.10.20.192\f" /user:10.10.20.192\Administrator *

再手工执行:

复制代码
copy /Y "F:\databasebak\ES.EMS_backup_2026_07_05_020003.bak" "\\10.10.20.192\f\10.10.10.113\"

文件成功传输至异地服务器:

复制代码
F:\10.10.10.113

返回码为 0,问题解决。

相关推荐
Shadow(⊙o⊙)几秒前
Linux网络——文件与网络的连接桥梁struct sock {
linux·运维·网络
烬羽1 分钟前
给 Agent 一个检索式记忆:把对话历史存进 Milvus,该记的都记得
javascript·数据库·agent
今日热点2 分钟前
Windows 系统 C 盘深度清理教程:安全释放存储空间,避开误删风险
windows·安全
星云API技术支持9 分钟前
企业微信二次开发外部群:群聊数据与联系人信息如何建立关联
数据库·php·企业微信
其实防守也摸鱼9 分钟前
教育信息技术应用创新---基础软件信息赛(题库)
大数据·运维·人工智能·web安全·自动化
我不是程序员三三11 分钟前
桌面管理软件哪个最好?从一次上线翻车事故,拆解选型评估与配置落地全流程
数据库
新时代牛马13 分钟前
Linux 性能调优与追踪完整篇:ftrace、perf、eBPF从采样到落地验证
linux·运维·服务器
落木萧萧82514 分钟前
MyBatis 关联查询的四种写法,为什么最后都变回了手写 XML
java·数据库·后端
春风解人意19 分钟前
从零开始学习嵌入式P35----数据库
数据库·嵌入式硬件·学习
sunoo-22921 分钟前
【网络编程 + 数据库】select 与 epoll 核心区别详解 + SQLite 入门到 C 接口全攻略
linux·网络·数据库·vscode·学习·sqlite